#include <stdio.h> #include <string.h> #include <algorithm> #define M 300000#define inf 0x3f3f3f3fusing namespace Std;int maxx,minn;long long sum;int r,c,m;struct t{int left,right,min,max,sum; int Add,set;} tree[m];struct e{int t,l,r;} Ss[111111];int CMP (e A, E B) {return a.t<b.t;} void build (int l,int r,int i) {tree[i].left=l;tree[i].right=r;tree[i].set=-1; tree[i].add=tree[i].sum=tree[i].max=tree[i].min=0; if (l==r) return; int mid=l+ (R-L)/2; Build (l,mid,i<<1); Build (mid+1,r,i<<1|1);} void pushdown (int i) {if (tree[i].left>=tree[i].right) return; if (tree[i].set!=-1) {tree[i<<1].set=tree[i<<1|1].set=tree[i].set; tree[i<<1].min=tree[i<<1|1].min=tree[i].set; tree[i<<1].max=tree[i<<1|1].max=tree[i].set; tree[i<<1].add=tree[i<<1|1].add=0; Tree[i<<1].sum= (tree[i<<1].right-tree[i<<1].left+1) *tree[i].set; Tree[i<<1|1].sum= (tree[i<<1|1].right-tree[i<<1|1].left+1) *tree[i].set; } if (tree[i].add>0) {int add=tree[i].add; tree[i<<1].add+=add;tree[i<<1|1].add+=add; tree[i<<1].min+=add;tree[i<<1|1].min+=add; tree[i<<1].max+=add;tree[i<<1|1].max+=add; tree[i<<1].sum+=add* (tree[i<<1].right-tree[i<<1].left+1); tree[i<<1|1].sum+=add* (tree[i<<1|1].right-tree[i<<1|1].left+1); }}void Maintain (int i) {if (tree[i].left>=tree[i].right) return; Tree[i].max=max (Tree[i<<1].max,tree[i<<1|1].max); Tree[i].min=min (tree[i<<1].min,tree[i<<1|1].min); Tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;} void Update_add (int l,int r,int val,int i)//interval Add {if (tree[i].left==l&&tree[i].right==r) {Tree[i].add +=val; Tree[i].max+=val; Tree[i].min+=val; tree[i].sum+= (tree[i].right-tree[i].left+1) *val; RetuRn } pushdown (i); Tree[i].set=-1; Tree[i].add=0; int mid=tree[i].left+ (tree[i].right-tree[i].left)/2; if (r<=mid) Update_add (l,r,val,i<<1); else if (l>mid) Update_add (l,r,val,i<<1|1); else {update_add (l,mid,val,i<<1); Update_add (mid+1,r,val,i<<1|1); } maintain (i);} void Update_set (int l,int r,int val,int i)//interval modification {//printf ("set\n"); if (tree[i].left==l&&tree[i].right==r) {tree[i].set=tree[i].max=tree[i].min=val; Tree[i].add=0; Tree[i].sum= (tree[i].right-tree[i].left+1) *val; Return } pushdown (i); Tree[i].set=-1; Tree[i].add=0; int mid=tree[i].left+ (tree[i].right-tree[i].left)/2; if (r<=mid) Update_set (l,r,val,i<<1); else if (l>mid) Update_set (l,r,val,i<<1|1); else {update_set (l,mid,val,i<<1); Update_set (mid+1,r,val,i<<1|1); } maintain (i);} void query (int l,int r,int i)//interval lookup {if (tree[i].left==l&&TREE[I].RIGHT==R) {sum+=tree[i].sum; Minn=min (minn,tree[i].min); Maxx=max (Maxx,tree[i].max); Return } pushdown (i); Tree[i].set=-1;tree[i].add=0; int mid=tree[i].left+ (tree[i].right-tree[i].left)/2; if (r<=mid) query (l,r,i<<1); else if (l>mid) query (l,r,i<<1|1); else {query (l,mid,i<<1); Query (mid+1,r,i<<1|1); } maintain (i);} int main () {int n; scanf ("%d", &n); while (n--) {Long long ssum=0; int i,re; memset (tree,0,sizeof (tree)); memset (ss,0,sizeof (ss)); int op,k=0; scanf ("%d%d", &re,&op); Build (1,re,1); ss[0].t=0; for (i=1;i<=op;i++) scanf ("%d%d%d", &SS[I].T,&SS[I].L,&SS[I].R); Sort (ss+1,ss+1+op,cmp); for (i=1;i<=op;i++) {int tr=ss[i].t-ss[i-1].t; Update_add (1,re,tr,1); Query (ss[i].l,ss[i].r,1); Ssum+=sum; sum=0; Update_set (ss[i].l,ss[i].r,0,1); } printf ("%lld\n", ssum); } return 0;} /**************************************problem id:sdut OJ 2880User name:rainResult:Wrong answertake memory:9800ktake Time:710mssubmit time:2015-04-16 17:16:03**************************************/
Re countless and then WA countless find a small error cause can not ac,add that place is all +1, think very clearly but is wrong, the egg hurts.
sdut2880---devour Magic (Fifth annual ACM problem in Shandong Province)