首页 > 代码库 > [CodeVS1299]切水果
[CodeVS1299]切水果
思路:
线段树区间修改。标记记录当前区间是否被切。
1 #include<cstdio> 2 #include<cctype> 3 #include<cstring> 4 #include<algorithm> 5 inline int getint() { 6 char ch; 7 while(!isdigit(ch=getchar())); 8 int x=ch^‘0‘; 9 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^‘0‘);10 return x;11 }12 class SegmentTree {13 #define _left <<114 #define _right <<1|115 private:16 static const int N=500001;17 int val[N<<2];18 bool tag[N<<2];19 void push_down(const int p,const int b,const int e) {20 if(!tag[p]) return;21 tag[p _left]=tag[p _right]=true;22 tag[p]=false;23 int mid=(b+e)>>1;24 val[p _left]=mid-b+1;25 val[p _right]=e-mid;26 }27 void push_up(const int p) {28 val[p]=val[p _left]+val[p _right];29 }30 public:31 SegmentTree() {32 memset(val,0,sizeof val);33 memset(tag,0,sizeof tag);34 }35 void modify(const int p,const int b,const int e,const int l,const int r) {36 if((l<=b)&&(e<=r)) {37 val[p]=e-b+1;38 tag[p]=true;39 return;40 }41 push_down(p,b,e);42 int mid=(b+e)>>1;43 if(l<=mid) modify(p _left,b,mid,l,r);44 if(r>mid) modify(p _right,mid+1,e,l,r);45 push_up(p);46 }47 int query() {48 return val[1];49 }50 };51 SegmentTree t;52 int main() {53 int n=getint();54 for(int m=getint();m;m--) {55 int l=getint(),r=getint();56 t.modify(1,1,n,l,r);57 printf("%d\n",n-t.query());58 }59 return 0;60 }
[CodeVS1299]切水果
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。