題意:給出兩種操作,一種是從a開始向後放花,一種是把a到b的花全部扔掉。放過的位置就不能再次放
顯然線段樹,加上兩種標記,一種是這塊是滿的,一種是這塊是空的,然後第一種操作答案帶上三個值
#include#include#include#include#include#include#define ll long long
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define dfo(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline ll read()
while(s>='0'&&s<='9')
return d*f;
}#define n 100005
#define inf 2000000000
struct ansss
ans;
int ls[n*3],rs[n*3],z0[n*3],w0[n*3],sum[n*3],la[n*3];
int n,m;
ansss pushans(ansss a,ansss b)
void pushup(int k)
void man(int k)
void clear(int k)
ansss checkans(ansss k)
return k;
}void build(int k,int l,int r)
int mid=(l+r)>>1;
build(k<<1,l,mid);build(k<<1|1,mid+1,r);
ls[k]=ls[k<<1];rs[k]=rs[k<<1|1];
pushup(k);
}void pushlazy(int k)
if(la[k]==2) }
ansss f(int k,int l,int r,int f)
if(f>=tt-sum[k])
pushlazy(k);
int mid=(l+r)>>1;
ansss t=f(k<<1,l,mid,f);
ret=f(k<<1|1,mid+1,r,f-t.ans);
ret=pushans(t,ret);
pushup(k);
return checkans(ret);
} pushlazy(k);
int mid=(ls[k]+rs[k])>>1;
if(l>mid)ret=f(k<<1|1,l,r,f);else }
pushup(k);
return checkans(ret);}
int r(int k,int l,int r)
pushlazy(k);
int mid=(ls[k]+rs[k])>>1;
if(r<=mid)ret=r(k<<1,l,r);else }
pushup(k);
return ret;
}int main()
else printf("%d\n",r(1,x,y));
} return 0;
}
ZSOI2013 蓄養 暴力
如果沒看資料範圍還以為是一道旋轉卡殼 然而實際上只有100.求面積標程用了海 式,實際上叉積就可以了 注意答案不能為0 include include include include include include define ll long long define fo i,a,b for in...
CSUST 2013 丟手絹 (線段樹)
丟手絹 題意 n個數編號為 1 n 圍成乙個環,給出 q 次操作,點修改,和查詢 相距不超過k的兩個數字之和的最大值和最小值。思路 注意資料範圍 k 最大是 5 我們可以 o n 的求出每個長度為 k 的區間裡的 最大值次大值,最小值次小值,也就可以得到答案,但是還有修改,因為每次修改,最多改變 k...
NOIP2013 火柴排隊 線段樹 逆序對
codevs 題目描述 description 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 其中 ai表示第一列火柴中第 i 個火柴的高度,bi表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根...