[扫描线 线段树] 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;
}
本来想的是两个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;
}
相关文章推荐
- 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 第五章 处理器拦截器详解
- 前端同学大福利,最全的面试题目整理
- SQL
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
- SQL
- Java基础与案例开发详解のJava与C、C++、C#对比分析
- 2016年Visual C++推荐图书125本
- DPDK中断机制简析
- 怎样将FAT32格式磁盘转换为NTFS格式
- spring依赖注入原理
- 人过 40
- 每天一个Linux命令(59)wget命令
- 《程序员的呐喊》读书笔记(二)
- Java千百问_01基本概念(015)_阻塞、非阻塞有什么区别
- Andrew NG 《machine learning》week 4,class1 —Motivations
- mysql错误
- Valid Anagram
- echarts解决360及IE8兼容性问题
- php操作数据库及简单数据库语言