树套树,写的太弱了15s才过,不断维护就好啦,权值套区间,似乎我的常熟很渣……后来才发现本题数据是没有负数的嗯嗯喵,学长说:T_T省选第一题辣么简单还用讲?其实是几天前在JZOJ上面交过了……然后去刷了下BZOJ……
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #define LL long long using namespace std; LL 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; } int a,b,c; int n,m,sz; int root[200005]; int ls[20000005],rs[20000005],sum[20000005],lazy[20000005]; void push(int k,int l,int r) { if(!lazy[k]||l==r)return; if(!ls[k])ls[k]=++sz; if(!rs[k])rs[k]=++sz; lazy[ls[k]]+=lazy[k];lazy[rs[k]]+=lazy[k]; int mid=(l+r)>>1; sum[ls[k]]+=(mid-l+1)*lazy[k]; sum[rs[k]]+=(r-mid)*lazy[k]; lazy[k]=0; } void modify(int &k,int r,int a,int b) { if(!k)k=++sz; push(k,l,r); if(l==a&&r==b) { sum[k]+=r-l+1; lazy[k]++; return; } int mid=(l+r)>>1; if(b<=mid)modify(ls[k],mid,a,b); else if(a>mid)modify(rs[k],mid+1,r,b); else { modify(ls[k],mid);modify(rs[k],b); } sum[k]=sum[ls[k]]+sum[rs[k]]; } int query(int k,int b) { if (!k) return 0; push(k,r); if (l==a&&r==b) return sum[k]; int mid=(l+r)>>1; if (b<=mid) return query(ls[k],b); else if (a>mid) return query(rs[k],b); else return query(ls[k],mid)+query(rs[k],b); } /* void ins() { int k=1,l=1,r=n; while (l!=r) { int mid=(l+r)>>1; modify(root[k],1,n,b); if (c<=mid) r=mid,k=k<<1; else l=mid+1,k=k<<1+1; } modify(root[k],b); } */ void ins() { int k=1,r=n; while(l!=r) { int mid=(l+r)>>1; modify(root[k],b); if(c<=mid)r=mid,k=k<<1; else l=mid+1,k=k<<1|1; } modify(root[k],b); } /* int solve() { int k=1,r=n; while (l!=r) { int mid=(l+r)>>1; int t=query(root[k<<1],b); if (t>=c) r=mid,k=k<<1+1,c=c-t; } return l; }*/ int solve() { int l=1,r=n,k=1; while(l!=r) { int mid=(l+r)>>1; int t=query(root[k<<1],b); if(t>=c)r=mid,k<<=1; else l=mid+1,k=k<<1|1,c-=t; } return l; } int main() { // freopen("data.in","r",stdin); // freopen("data.out","w",stdout); n=read();m=read(); while (m--) { int f=read();a=read();b=read();c=read(); if (f==1) { c=n-c+1;ins(); } else printf("%d\n",n-solve()+1); } return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。