懒惰标记的入门题==
讲解详见小伙伴的博客 点击打开链接 貌似只是加了注释==
我的代码->俩人改了好久才过==注意.L L .R R的区别
#include <iostream> #include<cstdio> #include<cstring> using namespace std; struct node { int l,r,val,tag; int mid(){return (l+r)/2;} }tree[300000]; void build(int root,int l,int r) { tree[root].l=l; tree[root].r=r; tree[root].tag=-1; if(l==r) { tree[root].val=1; return; } build(root<<1,l,(l+r)/2); build(root<<1|1,(l+r)/2+1,r); tree[root].val=tree[root<<1].val+tree[root<<1|1].val; } void update(int root,int l,int r,int tg) { if(tree[root].l==l&&tree[root].r==r) { tree[root].tag=tg; tree[root].val=tg*(tree[root].r-tree[root].l+1); return; } if(tree[root].tag!=-1) { tree[root<<1].tag=tree[root].tag; tree[root<<1].val=tree[root<<1].tag*(tree[root<<1].r-tree[root<<1].l+1); tree[root<<1|1].tag=tree[root].tag; tree[root<<1|1].val=tree[root<<1|1].tag*(tree[root<<1|1].r-tree[root<<1|1].l+1); tree[root].tag=-1; } int m=tree[root].mid(); if(l>m) update(root<<1|1,l,r,tg); else if(r<=m) update(root<<1,l,r,tg); else { update(root<<1,l,m,tg); update(root<<1|1,m+1,r,tg); } tree[root].val=tree[root<<1].val+tree[root<<1|1].val; } int main() { // freopen("cin.txt","r",stdin); int t,n,q,a,b,c; while(~scanf("%d",&t)) { for(int k=1;k<=t;k++) { scanf("%d%d",&n,&q); build(1,1,n); // for(int i=2*n;i>0;i--)cout<<tree[i].val<<" "; cout<<endl; while(q--) { scanf("%d%d%d",&a,&b,&c); update(1,a,b,c); } // for(int i=2*n;i>0;i--)cout<<tree[i].val<<" "; cout<<endl; printf("Case %d: The total value of the hook is %d.\n",k,tree[1].val); } } return 0; }