jzoj 4933. 【NOIP2017提高组模拟12.24】C 线段树
来源:互联网 发布:文字抽奖软件 编辑:程序博客网 时间:2024/05/20 07:33
题意
n<=100000
分析
码农题
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define ll long long#define N 100005#define inf 0x7fffffffusing namespace std;int n,m,a[N];struct tree{int l,r,mx,mn,lgs,llgs,rlgs,lazy1,lazy2,lnum,rnum;ll s;}t[N*5];int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}void updata(int d){ t[d].mx=max(t[d*2].mx,t[d*2+1].mx); t[d].mn=min(t[d*2].mn,t[d*2+1].mn); t[d].lnum=t[d*2].lnum;t[d].rnum=t[d*2+1].rnum; t[d].s=t[d*2].s+t[d*2+1].s; t[d].lgs=max(t[d*2].lgs,t[d*2+1].lgs); if (t[d*2].rnum==t[d*2+1].lnum) t[d].lgs=max(t[d].lgs,t[d*2].rlgs+t[d*2+1].llgs); t[d].llgs=t[d*2].llgs; if (t[d*2].llgs==t[d*2].r-t[d*2].l+1&&t[d*2].rnum==t[d*2+1].lnum) t[d].llgs=t[d*2].llgs+t[d*2+1].llgs; t[d].rlgs=t[d*2+1].rlgs; if (t[d*2+1].rlgs==t[d*2+1].r-t[d*2+1].l+1&&t[d*2].rnum==t[d*2+1].lnum) t[d].rlgs=t[d*2+1].rlgs+t[d*2].rlgs;}void build(int d,int l,int r){ t[d].l=l;t[d].r=r; t[d].lazy2=inf; if (l==r) { t[d].mx=t[d].mn=t[d].s=t[d].lnum=t[d].rnum=a[l]; t[d].lgs=t[d].llgs=t[d].rlgs=1; return; } int mid=(l+r)/2; build(d*2,l,mid); build(d*2+1,mid+1,r); updata(d);}void pushdown(int d){ if (t[d].l==t[d].r) return; if (t[d].lazy2!=inf) { int w=t[d].lazy2; t[d*2].s=(ll)(t[d*2].r-t[d*2].l+1)*w;t[d*2+1].s=(ll)(t[d*2+1].r-t[d*2+1].l+1)*w; t[d*2].lnum=t[d*2].rnum=t[d*2].mx=t[d*2].mn=t[d*2+1].lnum=t[d*2+1].rnum=t[d*2+1].mn=t[d*2+1].mx=w; t[d*2].lgs=t[d*2].llgs=t[d*2].rlgs=t[d*2].r-t[d*2].l+1; t[d*2+1].lgs=t[d*2+1].llgs=t[d*2+1].rlgs=t[d*2+1].r-t[d*2+1].l+1; t[d*2].lazy1=t[d*2+1].lazy1=0; t[d*2].lazy2=t[d*2+1].lazy2=w; t[d].lazy2=inf; } if (t[d].lazy1) { int w=t[d].lazy1; t[d*2].s+=(ll)(t[d*2].r-t[d*2].l+1)*w;t[d*2+1].s+=(ll)(t[d*2+1].r-t[d*2+1].l+1)*w; t[d*2].lnum+=w;t[d*2].rnum+=w;t[d*2].mn+=w;t[d*2].mx+=w; t[d*2+1].lnum+=w;t[d*2+1].rnum+=w;t[d*2+1].mn+=w;t[d*2+1].mx+=w; t[d*2].lazy1+=w;t[d*2+1].lazy1+=w; t[d].lazy1=0; }}void ins(int d,int x,int y,int z){ pushdown(d); if (t[d].l==x&&t[d].r==y) { t[d].s+=(ll)(y-x+1)*z;t[d].lnum+=z;t[d].rnum+=z;t[d].mn+=z;t[d].mx+=z; t[d].lazy1+=z; return; } int mid=(t[d].l+t[d].r)/2; if (y<=mid) ins(d*2,x,y,z); else if (x>mid) ins(d*2+1,x,y,z); else { ins(d*2,x,mid,z); ins(d*2+1,mid+1,y,z); } updata(d);}void fill(int d,int x,int y,int z){ pushdown(d); if (t[d].l==x&&t[d].r==y) { t[d].s=(y-x+1)*z;t[d].lnum=t[d].rnum=t[d].mn=t[d].mx=z;t[d].lgs=t[d].llgs=t[d].rlgs=y-x+1; t[d].lazy2=z; return; } int mid=(t[d].l+t[d].r)/2; if (y<=mid) fill(d*2,x,y,z); else if (x>mid) fill(d*2+1,x,y,z); else { fill(d*2,x,mid,z); fill(d*2+1,mid+1,y,z); } updata(d);}ll querys(int d,int x,int y){ pushdown(d); if (t[d].l==x&&t[d].r==y) return t[d].s; int mid=(t[d].l+t[d].r)/2; if (y<=mid) return querys(d*2,x,y); else if (x>mid) return querys(d*2+1,x,y); else return querys(d*2,x,mid)+querys(d*2+1,mid+1,y);}int querymx(int d,int x,int y){ pushdown(d); if (t[d].l==x&&t[d].r==y) return t[d].mx; int mid=(t[d].l+t[d].r)/2; if (y<=mid) return querymx(d*2,x,y); else if (x>mid) return querymx(d*2+1,x,y); else return max(querymx(d*2,x,mid),querymx(d*2+1,mid+1,y));}int querymn(int d,int x,int y){ pushdown(d); if (t[d].l==x&&t[d].r==y) return t[d].mn; int mid=(t[d].l+t[d].r)/2; if (y<=mid) return querymn(d*2,x,y); else if (x>mid) return querymn(d*2+1,x,y); else return min(querymn(d*2,x,mid),querymn(d*2+1,mid+1,y));}int querylgs(int d,int x,int y){ pushdown(d); if (t[d].l==x&&t[d].r==y) return t[d].lgs; int mid=(t[d].l+t[d].r)/2; if (y<=mid) return querylgs(d*2,x,y); else if (x>mid) return querylgs(d*2+1,x,y); else { int ans=max(querylgs(d*2,x,mid),querylgs(d*2+1,mid+1,y)); if (t[d*2].rnum==t[d*2+1].lnum) ans=max(ans,min(t[d*2].rlgs,mid-x+1)+min(t[d*2+1].llgs,y-mid)); return ans; }}void debug(int d){ printf("%d %d %d %d %d %d %d\n",t[d].l,t[d].r,t[d].lgs,t[d].llgs,t[d].rlgs,t[d].lnum,t[d].rnum); if (t[d].l==t[d].r) return; debug(d*2);debug(d*2+1);}int main(){ freopen("C.in","r",stdin); freopen("test.out","w",stdout); n=read();m=read(); for (int i=1;i<=n;i++) a[i]=read(); build(1,1,n); for (int i=1;i<=m;i++) { int op=read(); if (op==1) { int x=read(),y=read(),z=read(); ins(1,x,y,z); } else if (op==2) { int x=read(),y=read(),z=read(); ins(1,x,y,-z); } else if (op==3) { int x=read(),y=read(),z=read(); fill(1,x,y,z); } else if (op==4) { int x=read(),y=read(); printf("%lld\n",querys(1,x,y)); } else if (op==5) { int x=read(),y=read(); printf("%d\n",querymn(1,x,y)); } else if (op==6) { int x=read(),y=read(); printf("%d\n",querymx(1,x,y)); } else { int x=read(),y=read(); printf("%d\n",querylgs(1,x,y)); } } return 0;}
0 0
- jzoj 4933. 【NOIP2017提高组模拟12.24】C 线段树
- JZOJ 4933. 【NOIP2017提高组模拟12.24】C
- JZOJ 4933. 【NOIP2017提高组模拟12.24】C
- 【JZOJ 4933】【NOIP2017提高组模拟12.24】C
- JZOJ 5197. 【NOIP2017提高组模拟7.3】C
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C
- JZOJ 4932. 【NOIP2017提高组模拟12.24】B
- 【JZOJ 4931】【NOIP2017提高组模拟12.24】A
- 【JZOJ 4932】【NOIP2017提高组模拟12.24】B
- 【JZOJ 4931】【NOIP2017提高组模拟12.24】A
- 【NOIP2017提高组模拟12.24】C
- 【NOIP2017提高组模拟12.24】C
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)
- JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇
- JZOJ 4921. 【NOIP2017提高组模拟12.10】幻魔皇
- JZOJ 4919.【NOIP2017提高组模拟12.10】神炎皇
- JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇
- 【JZOJ 4922】【NOIP2017提高组模拟12.17】环
- java面试题及答案(基础题122道,代码题19道)
- onWindowFocusChanged?
- 基于飞思卡尔imx6 sabrelite开发板的android lvds屏幕驱动调试
- Linux操作系统发展历程及系统版本选择
- Java编程思想解析 第1章 对象导论 1.1 抽象过程
- jzoj 4933. 【NOIP2017提高组模拟12.24】C 线段树
- Leetcode Remove Duplicates from Sorted List II
- iOS中的HTTP请求处理
- zigbee zcl规范及其协议栈实现1
- 编程之美(数字的魅力--寻找发帖水王)
- NoiOpenJudge 1.5津津的储蓄计划
- zigbee zcl规范及其协议栈实现2
- Java回调通俗理解
- JAVA_IO流