您的位置:首页 > 其它

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

2016-06-26 08:40 369 查看
这读入真让人蛋疼

本来想的是两个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
,C
,L
,R
;
int sx
,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);
else
return 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: