[破碎的状态] NFLS OJ 1127 解题报告
JCarlson:什么你想练练线段树?把这题A了冷静下
http://www.nflsoj.com/problems/1127/show
我:哦
这是一道模版题,我真的练了一发,AC了....
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<math.h> #include<string> #include<time.h> #include<bitset> #include<vector> #include<memory> #include<utility> #include<stdio.h> #include<sstream> #include<fstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; int a[100005]; long long val[1<<18]; long long tag1[1<<18]; long long tag2[1<<18]; const int inf=99999999; void build_tree(int now,int l,int r) { tag2[now]=inf; if (l==r-1) { val[now]=a[l]; return; } int mid=(l+r)/2; build_tree(now*2+1,l,mid); build_tree(now*2+2,mid,r); val[now]=val[now*2+1]+val[now*2+2]; } void push_down(int now,int l,int r) { int mid=(l+r)/2; if (tag2[now]!=inf) { tag2[now*2+1]=tag2[now]; tag1[now*2+1]=0; val[now*2+1]=(long long)(mid-l)*tag2[now]; tag2[now*2+2]=tag2[now]; tag1[now*2+2]=0; val[now*2+2]=(long long)(r-mid)*tag2[now]; tag2[now]=inf; } if (tag1[now]!=0) { tag1[now*2+1]+=tag1[now]; val[now*2+1]+=(long long)tag1[now]*(mid-l); tag1[now*2+2]+=tag1[now]; val[now*2+2]+=(long long)tag1[now]*(r-mid); tag1[now]=0; } } long long query(int now,int l,int r,int l0,int r0) { if ((l0<=l)&&(r<=r0)) { return val[now]; } int mid=(l+r)/2; push_down(now,l,r); long long sum=0; if (l0<mid) sum+=query(now*2+1,l,mid,l0,r0); if (mid<r0) sum+=query(now*2+2,mid,r,l0,r0); return sum; } void change1(int now,int l,int r,int l0,int r0,int k) { if ((l0<=l)&&(r<=r0)) { tag1[now]+=k; val[now]+=(long long)k*(r-l); return; } int mid=(l+r)/2; push_down(now,l,r); if (l0<mid) change1(now*2+1,l,mid,l0,r0,k); if (mid<r0) change1(now*2+2,mid,r,l0,r0,k); val[now]=val[now*2+1]+val[now*2+2]; } void change2(int now,int l,int r,int l0,int r0,int k) { if ((l0<=l)&&(r<=r0)) { tag2[now]=k; tag1[now]=0; val[now]=(long long)k*(r-l); return; } int mid=(l+r)/2; push_down(now,l,r); if (l0<mid) change2(now*2+1,l,mid,l0,r0,k); if (mid<r0) change2(now*2+2,mid,r,l0,r0,k); val[now]=val[now*2+1]+val[now*2+2]; } int main() { #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int n,m; ios::sync_with_stdio(false); scanf("%d%d",&n,&m); int i; for (i=0;i<n;i++) { scanf("%d",&a[i]); } build_tree(0,0,n); for (i=0;i<m;i++) { int oper; int x,y; scanf("%d%d%d",&oper,&x,&y); x--; if (oper==1) { cout<<query(0,0,n,x,y)<<'\n'; } else if (oper==2) { int z; scanf("%d",&z); change1(0,0,n,x,y,z); } else if (oper==3) { int z; scanf("%d",&z); change2(0,0,n,x,y,z); } } return 0; }
Apr 14, 2016 12:13:52 AM
什么鬼你居然真去把这题写了= =
Apr 14, 2016 08:03:40 AM
而且已加入了恢复状态计划..