【jzoj4933】【线段树】
2016-12-24 17:03
267 查看
题目大意
解题思路
没什么好说的,直接线段树,由于我打得丑,1.5sTLE。
TLE-code
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long #define min(a,b) ((a<b)?a:b) #define max(a,b) ((a>b)?a:b) #define fo(i,j,k) for(LL i=j;i<=k;i++) #define fd(i,j,k) for(LL i=j;i>=k;i--) using namespace std; LL const maxn=1e5,inf=2147483647,inff=-inf/2; LL n,q,ans[maxn*4+10][10],al[maxn*4+10],ar[maxn*4+10],tag[maxn*4+10][5],si[10]; void pushtag(LL pos,LL l,LL r,LL mid){ LL op,val,poss=pos<<1;si[0]=mid-l+1,si[1]=r-mid; if(tag[pos][0])op=0,val=tag[pos][0]; else op=1,val=tag[pos][1]; fo(now,poss,poss+1){ if(!op){ ans[now][1]+=val*si[now-poss]; fo(i,2,3)ans[now][i]+=val; if(tag[now][op]||(tag[now][!op]<inff))tag[now][op]+=val; else tag[now][!op]+=val; al[now]+=val;ar[now]+=val; }else if(val>inff){ ans[now][1]=val*si[now-poss]; fo(i,2,3)ans[now][i]=val; fo(i,4,6)ans[now][i]=si[now-poss]; tag[now][op]=val; tag[now][!op]=0; al[now]=ar[now]=val; } } tag[pos][0]=0;tag[pos][1]=-inf; } void oper(LL now,LL l,LL r,LL l1,LL r1,LL op,LL val){ LL mid=(l+r)>>1,noww=now<<1; if(l!=r)pushtag(now,l,r,mid); if((l==l1)&&(r==r1)){ if(!op){ ans[now][1]+=val*(r-l+1); fo(i,2,3)ans[now][i]+=val; if(tag[now][op]||(tag[now][!op]<inff))tag[now][op]+=val; else tag[now][!op]+=val; al[now]+=val;ar[now]+=val; }else{ ans[now][1]=val*(r-l+1); fo(i,2,3)ans[now][i]=val; fo(i,4,6)ans[now][i]=(r-l+1); tag[now][op]=val; tag[now][!op]=0; al[now]=ar[now]=val; } return; } if(l1<=mid)oper(noww,l,mid,l1,min(r1,mid),op,val); if(mid<r1)oper(noww+1,mid+1,r,max(l1,mid+1),r1,op,val); ans[now][1]=ans[noww][1]+ans[noww+1][1]; ans[now][2]=min(ans[noww][2],ans[noww+1][2]); ans[now][3]=max(ans[noww][3],ans[noww+1][3]); ans[now][4]=max(max(ans[noww][4],ans[noww+1][4]),(ans[noww][6]+ans[noww+1][5])*(ar[noww]==al[noww+1])); ans[now][5]=ans[noww][5];ans[now][6]=ans[noww+1][6]; if(ar[noww]==al[noww+1]){ if(ans[noww][5]==mid-l+1)ans[now][5]=ans[noww][5]+ans[noww+1][5]; if(ans[noww+1][6]==r-mid)ans[now][6]=ans[noww][6]+ans[noww+1][6]; } al[now]=al[noww];ar[now]=ar[noww+1]; } LL qury(LL now,LL l,LL r,LL l1,LL r1,LL op){ LL mid=(l+r)>>1,noww=now<<1; if(l!=r)pushtag(now,l,r,mid); if((l==l1)&&(r==r1)) return ans[now][op]; if(r1<=mid)return qury(noww,l,mid,l1,r1,op); else if(mid<l1)return qury(noww+1,mid+1,r,l1,r1,op); else{ if(op==1)return qury(noww,l,mid,l1,mid,op)+qury(noww+1,mid+1,r,mid+1,r1,op); else if(op==2)return min(qury(noww,l,mid,l1,mid,op),qury(noww+1,mid+1,r,mid+1,r1,op)); else if(op==3)return max(qury(noww,l,mid,l1,mid,op),qury(noww+1,mid+1,r,mid+1,r1,op)); else if(op==4){ LL tmp=max(qury(noww,l,mid,l1,mid,op),qury(noww+1,mid+1,r,mid+1,r1,op)); return max(tmp,(min(ans[noww][6],mid-l1+1)+min(ans[noww+1][5],r1-mid))*(ar[noww]==al[noww+1])); } } } int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%lld%lld",&n,&q);LL t,l,r,v; fo(i,1,n)scanf("%lld",&v),oper(1,1,n,i,i,1,v); fo(i,1,q){ scanf("%lld%lld%lld",&t,&l,&r); if(t<=3){ scanf("%lld",&v); if(t<=2)oper(1,1,n,l,r,0,(t==1)?v:-v); else oper(1,1,n,l,r,1,v); }else{ printf("%lld\n",qury(1,1,n,l,r,t-3)); } } return 0; }
相关文章推荐
- JZOJ 4898 人生的价值(线段树、扫描线)
- 【JZOJ 4933】【NOIP2017提高组模拟12.24】C
- [jzoj]1341. 失眠(线段树+转化不等式)
- (jzoj snow的追寻)线段树维护树的直径
- [JZOJ4610]线段树
- JZOJ4774 【GDOI2017模拟9.10】子串 线段树合并维护SAM的fail树信息(CF 666E类似)
- (jzoj snow的追寻)线段树维护树的直径
- jzoj 1278_排队_线段树
- JZOJ 4920 降雷皇(最长上升子序列、线段树)
- 杂 - 数据结构 - 平衡树 - 权值线段树 - JZOJ 100036 随机
- jzoj 1379_【线段树】最大值_线段树
- jzoj1278 排队(线段树)
- JZOJ 4933. 【NOIP2017提高组模拟12.24】C
- JZOJ 4895 三部曲(线段树)
- 【jzoj5232】【NOIP2017模拟A组模拟8.5】【带权排序】【线段树】
- 【jzoj3740】【TJOI2014】【电源插排】【线段树】
- JZOJ5419. 【NOIP2017提高A组集训10.24】线段树
- 【jzoj4898】【人生的价值】【扫描线】【线段树】
- 【JZOJ5270】【GDOI2018模拟】神奇的矩阵(二维线段树)
- [jzoj]3480. 【NOIP2013模拟联考9】阿Q的停车场(park)(线段树+堆)