ZSOI2013 花瓶 線段樹

2021-07-10 16:52:07 字數 1595 閱讀 5855

題意:給出兩種操作,一種是從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 個火柴的高度。每列火柴中相鄰兩根...