[扫描线 线段树] BZOJ 2161 布娃娃

来源:互联网 发布:linux 软件 语言 中文 编辑:程序博客网 时间:2024/06/12 00:59

这读入真让人蛋疼

本来想的是两个log的二分


#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }return *p1++;}inline void read(int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}void scan(int *a,int n){int add,first,mod,prod;read(add),read(first),read(mod),read(prod);a[1]=first%mod;for (int i=2;i<=n;i++) a[i]=((ll)a[i-1]*prod+add+i)%mod;}const int N=100005;const int MOD=19921228;int n; ll ans;int P[N],C[N],L[N],R[N];int sx[N],icnt;inline int Bin(int x){return lower_bound(sx+1,sx+icnt+1,x)-sx;}struct event{int t,c,f,k;event() {}event(int t,int c,int f,int k) : t(t),c(c),f(f),k(k){}bool operator < (const event &B) const {return t==B.t?f<B.f:t<B.t;}}eve[N*3];int tot;int ls[N*4],rs[N*4],sum[N*4];int ncnt,root;void Add(int &x,int l,int r,int t,int z){if (!x) x=++ncnt;sum[x]=sum[x]+z;if (l==r) return; int mid=(l+r)>>1;if (t<=mid) Add(ls[x],l,mid,t,z);else Add(rs[x],mid+1,r,t,z);}int Query(int x,int l,int r,int k){if (l==r) return l; int mid=(l+r)>>1;if (sum[rs[x]]>=k) return Query(rs[x],mid+1,r,k);elsereturn Query(ls[x],l,mid,k-sum[rs[x]]);}int main(){freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(n);scan(P,n),scan(C,n),scan(L,n),scan(R,n);for (int i=1;i<=n;i++) sx[++icnt]=C[i];sort(sx+1,sx+icnt+1); icnt=unique(sx+1,sx+icnt+1)-sx-1;for (int i=1;i<=n;i++) C[i]=Bin(C[i]);for (int i=1;i<=n;i++){if (L[i]>R[i]) swap(L[i],R[i]);eve[++tot]=event(L[i],C[i],0,0);eve[++tot]=event(P[i],0,2,i);eve[++tot]=event(R[i]+1,C[i],1,0);}sort(eve+1,eve+tot+1);for (int i=1;i<=tot;i++){if (eve[i].f==0) Add(root,1,icnt,eve[i].c,1);else if (eve[i].f==1) Add(root,1,icnt,eve[i].c,-1);else if (sum[root]>=eve[i].k) (ans+=sx[Query(root,1,icnt,eve[i].k)])%=MOD;}printf("%lld\n",ans);return 0;}


0 0