本文共 2101 字,大约阅读时间需要 7 分钟。
感觉区间合并都一个样,没什么好说的。
//#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef pair pii;#define pb(a) push_back(a)#define INF 0x1f1f1f1f#define lson idx<<1,l,mid#define rson idx<<1|1,mid+1,r#define PI 3.1415926535898template T min(const T& a,const T& b,const T& c) { return min(min(a,b),min(a,c));}template T max(const T& a,const T& b,const T& c) { return max(max(a,b),max(a,c));}void debug() {#ifdef ONLINE_JUDGE#else freopen("d:\\in.txt","r",stdin); freopen("d:\\out1.txt","w",stdout);#endif}int getch() { int ch; while((ch=getchar())!=EOF) { if(ch!=' '&&ch!='\n')return ch; } return EOF;}const int MAXN=100100;struct node{ int maxx,pre,suf,lv,rv,len;};node tree[MAXN<<2];void Merge(node &fa,node &l,node &r){ fa.len=l.len+r.len; fa.maxx=max(l.maxx,r.maxx,r.lv>l.rv?l.suf+r.pre:-1); fa.lv=l.lv;fa.rv=r.rv; fa.pre=l.pre==l.len&&l.rv >1; build(lson); build(rson); Merge(tree[idx],tree[idx<<1],tree[idx<<1|1]); return 0;}int update(int idx,int l,int r,int x,int v){ if(l==r) { tree[idx].lv=tree[idx].rv=v; return 0; } int mid=(r+l)>>1; if(x<=mid)update(lson,x,v); else update(rson,x,v); Merge(tree[idx],tree[idx<<1],tree[idx<<1|1]); return 0;}node query(int idx,int l,int r,int tl,int tr){ if(tl<=l&&tr>=r) return tree[idx]; int mid=(r+l)>>1; if(tl<=mid&&tr>mid) { node q,a,b; a=query(lson,tl,tr); b=query(rson,tl,tr); Merge(q,a,b); return q; }else if(tl<=mid) return query(lson,tl,tr); else return query(rson,tl,tr);}int main(){ int t; scanf("%d",&t); for(int ca=1;ca<=t;ca++) { int n,m; scanf("%d%d",&n,&m); build(1,0,n-1); for(int i=1;i<=m;i++) { char op=getch(); if(op=='Q') { int a,b; scanf("%d%d",&a,&b); node q=query(1,0,n-1,a,b); printf("%d\n",q.maxx); }else { int x,v; scanf("%d%d",&x,&v); update(1,0,n-1,x,v); } } } return 0;}
转载于:https://www.cnblogs.com/BMan/p/3295781.html