这两篇代码,一道是P4513,一道是P2824,主要是一直暴,只求看看为什么暴,找了一下午了,
#include<iostream>
#include<cstdio>
#define ql x<<1
#define qr x<<1|1
#define mid (l+r)>>1
using namespace std;
const int N=5e5+10;
int n,m,a[N];
struct node
{
int l,r,c,sum,lsum,rsum;
}g[N<<1];
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
void pushup(int x)
{
if(g[ql].rsum<0&&g[qr].lsum<0)
g[x].sum=max(g[ql].rsum,g[qr].lsum);
else
{
g[x].sum=0;
if(g[ql].rsum>0)g[x].sum+=g[ql].rsum;
if(g[qr].lsum>0)g[x].sum+=g[qr].lsum;
}
g[x].c=g[ql].c+g[qr].c;
g[x].lsum=max(g[ql].lsum,g[ql].c+g[qr].lsum);
g[x].rsum=max(g[qr].rsum,g[qr].c+g[ql].rsum);
g[x].sum=max(g[ql].rsum+g[qr].lsum,max(g[qr].sum,g[ql].sum));
}
void build(int x,int l,int r)
{
if(l==r)
{
g[x]=(node){l,r,a[l],a[l],a[l]};
return;
}
build(ql,l,mid);
build(qr,mid+1,r);
g[x].l=l,g[x].r=r;
pushup(x);
}
void updata(int x,int y,int v)
{
int l=g[x].l,r=g[x].r;
if(l==r)
{
g[x]=(node){l,r,v,v,v};
return;
}
if(y<=mid)updata(ql,y,v);
else updata(qr,y,v);
pushup(x);
}
int query(int x,int ll,int rr,int flag)
{
int l=g[x].l,r=g[x].r;
if(ll==l&&rr==r)
{
if(flag==0)return g[x].sum;
else if(flag==1) return g[x].rsum;
else return g[x].lsum;
}
if(ll<=mid&&rr>mid)return query(ql,ll,mid,1)+query(qr,mid+1,rr,2);
else if(ll<=mid)return query(ql,ll,rr,1);
else return query(qr,ll,rr,2);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
while(m--)
{
int op=read(),a=read(),b=read();
if(op==1)
{
if(a>b)swap(a,b);
printf("%d\n",query(1,a,b,0));
}
else
updata(1,a,b);
}
return 0;
}
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int n,m,p,a[N],sign[N],L[N],R[N],ans,g[N<<2],lazy[N<<2];
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
void build(int x,int l,int r,int tot)
{
if(l==r)
{
g[x]=(a[l]>=tot);
lazy[x]=0;
return;
}
int mid=(l+r)>>1;
build(x<<1,l,mid,tot);
build(x<<1|1,mid+1,r,tot);
g[x]=g[x<<1]+g[x<<1|1],lazy[x]=0;
}
void pushdown(int x,int l,int r,int mid)
{
if(!lazy[x])return;
lazy[x<<1]=lazy[x<<1|1]=lazy[x];
if(lazy[x]==1)g[x<<1]=mid-l+1,g[x<<1|1]=r-mid;
else g[x<<1]=g[x<<1|1]=0;
lazy[x]=0;
}
int query(int x,int l,int r,int ql,int qr)
{
if(ql==l&&r==qr)return g[x];
int mid=(l+r)>>1;
pushdown(x,l,r,mid);
if(ql<=mid&&qr>mid)return query(x<<1,l,mid,ql,mid)+query(x<<1|1,mid+1,r,mid+1,qr);
else if(qr<=mid)return query(x<<1,l,mid,ql,qr);
else return query(x<<1|1,mid+1,r,ql,qr);
}
void updata(int x,int l,int r,int ql,int qr,int val)
{
if(ql==l&&r==qr)
{
g[x]=(r-l+1)*val;lazy[x]=val?1:-1;
return;
}
int mid=(l+r)>>1;
pushdown(x,l,r,mid);
if(ql<=mid&&qr>mid)
{
updata(x<<1,l,mid,ql,mid,val);
updata(x<<1|1,mid+1,r,mid+1,qr,val);
}
else if(qr<=mid)updata(x<<1,l,mid,ql,qr,val);
else updata(x<<1|1,mid+1,r,ql,qr,val);
g[x]=g[x<<1]+g[x<<1|1];
}
int check(int x)
{
build(1,1,n,x);
for(int i=1;i<=m;i++)
{
int l=L[i],r=R[i];int tot=query(1,1,n,l,r);
if(sign[x]==0)
{
updata(1,1,n,l,r-tot,0);
updata(1,1,n,r-tot+1,r,1);
}
else
{
updata(1,1,n,l,l+tot-1,1);
updata(1,1,n,l+tot,r,0);
}
}
return query(1,1,n,p,p);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=m;i++)sign[i]=read(),L[i]=read(),R[i]=read();
p=read();
int ll = 1, rr = n, midd;
while(ll<=rr){
midd=(ll+rr)>>1;
if(check(midd))ans=midd,ll=midd+1;else rr=midd-1;
}
printf("%d",ans);
return 0;
}