题目大意:有n个水果,每次选择一个区间,切没(orz)这些水果,求每次切好后还剩下多少水果。
解题思路:线段树,区间修改,单点查询(根节点)。
C++ Code:
#include<cstdio> #include<cstring> using namespace std; int n,m,d[500000*3+3],le,rr,cover[500000*3+3]; void pushdown(int x,int o){ cover[o<<1]=cover[o<<1|1]=cover[o]; d[o<<1]=x+1>>1; d[o<<1|1]=x>>1; cover[o]=0; } void cut(int l,int r,int o){ if(le<=l&&r<=rr){ cover[o]=1; d[o]=r-l+1; return; } if(cover[o]) pushdown(r-l+1,o); int m=l+r>>1; if(le<=m)cut(l,m,o<<1); if(m<rr)cut(m+1,r,o<<1|1); d[o]=d[o<<1]+d[o<<1|1]; } int main(void){ scanf("%d%d",&n,&m); memset(d,0,sizeof(d)); memset(cover,0,sizeof(cover)); while(m--){ scanf("%d%d",&le,&rr); cut(1,n,1); printf("%d ",n-d[1]); } return 0; }