BZOJ2161: 布娃娃 整体二分
Code:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define maxn 500005
#define setIO(s) freopen(s".in","r",stdin)
#define mod 19921228
#define ll long long
using namespace std;
vector <int> G[maxn];
struct Node{
int l,r,c,p;
}node[maxn],arr[maxn];
int n;
namespace DATA_Maker{
int C[maxn],L[maxn],R[maxn],P[maxn];
void make(int *a){
int pa,pf,pm,pp;
scanf("%d%d%d%d",&pa,&pf,&pm,&pp);
a[1] = pf % pm;
for(int i = 2;i <= n; ++i) a[i]=((long long)a[i-1]*pp+pa+i)%pm;
}
int main(){
scanf("%d",&n);
make(P); for(int i=1;i<=n;++i) node[i].p=P[i];
make(C); for(int i=1;i<=n;++i) node[i].c=C[i];
make(L); for(int i=1;i<=n;++i) node[i].l=L[i];
make(R); for(int i=1;i<=n;++i) node[i].r=R[i];
}
};
namespace Solve{
int hh[maxn],que[maxn],cc[maxn],cur[maxn],answer[maxn],tl[maxn],tr[maxn];
struct Array{
int A[maxn];
int lowbit(int t){ return t&(-t); }
void update(int pos,int delta){ while(pos<maxn) A[pos]+=delta,pos+=lowbit(pos); }
void add(int l,int r,int k){ update(l,k),update(r+1,-k); }
int query(int x){ if(!x) return 0; int sum=0; while(x>0) sum+=A[x],x-=lowbit(x); return sum; }
}T;
void solve(int x,int y,int l,int r){
if(l>r||x>y) return;
if(l==r){
for(int i=x;i<=y;++i) answer[que[i]]=cc[l];
return;
}
int mid=(l+r)>>1,p=0,q=0,kk=x-1;
for(int i=mid+1;i<=r;++i)
for(int j=0;j<G[i].size();++j) T.add(node[G[i][j]].l,node[G[i][j]].r,1);
for(int i=x;i<=y;++i) {
int delta=cur[que[i]]+T.query(node[que[i]].p);
if(delta>=que[i]) tr[++q]=que[i];
else tl[++p]=que[i],cur[que[i]]=delta;
}
for(int i=mid+1;i<=r;++i)
for(int j=0;j<G[i].size();++j) T.add(node[G[i][j]].l,node[G[i][j]].r,-1);
for(int i=1;i<=p;++i) que[++kk]=tl[i];
for(int i=1;i<=q;++i) que[++kk]=tr[i];
solve(x,x+p-1,l,mid),solve(y-q+1,y,mid+1,r);
}
int main()
{
//=======================================离散化
int cnt=0,mx=0;
for(int i=1;i<=n;++i)
{
hh[++cnt]=node[i].l;
hh[++cnt]=node[i].r;
hh[++cnt]=node[i].p;
}
sort(hh+1,hh+1+cnt);
for(int i=1;i<=n;++i)
{
node[i].p=lower_bound(hh+1,hh+1+cnt,node[i].p)-hh;
node[i].l=lower_bound(hh+1,hh+1+cnt,node[i].l)-hh;
node[i].r=lower_bound(hh+1,hh+1+cnt,node[i].r)-hh;
if(node[i].l>node[i].r)swap(node[i].l,node[i].r);
}
for(int i=1;i<=n;++i) cc[i]=node[i].c;
sort(cc+1,cc+1+n);
for(int i=1;i<=n;++i) node[i].c=lower_bound(cc+1,cc+1+n,node[i].c)-cc;
//========================================离散完毕
for(int i=1;i<=n;++i) G[node[i].c].push_back(i),mx=max(mx,node[i].c);
for(int i=1;i<=n;++i) que[i]=i;
solve(1,n,0,mx);
long long tmp=0;
for(int i=1;i<=n;++i) tmp+=answer[i],tmp%=mod;
printf("%lld",tmp);
}
};
int main(){
//setIO("input");
DATA_Maker::main();
Solve::main();
return 0;
}
BZOJ2161: 布娃娃 整体二分的更多相关文章
- 整体二分QAQ
POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...
- BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
[题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- bzoj 2527: [Poi2011]Meteors 整体二分
给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——整体二分
[题目分析] 上次用树状数组套主席树做的,这次用整体二分去水. 把所有的查询的结果一起进行二分,思路很好. [代码] #include <cstdio> #include <cstr ...
- BZOJ 1901 & 整体二分
题意: 带修改的区间第K小. SOL: 看了很久很久很久很久的整体二分,网上的各种题解也不是很多,也一直很不了解所谓的"贡献","将询问一起递归"是什么意思.. ...
- bzoj1146整体二分+树链剖分+树状数组
其实也没啥好说的 用树状数组可以O(logn)的查询 套一层整体二分就可以做到O(nlngn) 最后用树链剖分让序列上树 #include<cstdio> #include<cstr ...
- 【BZOJ 3110】 [Zjoi2013]K大数查询(整体二分)
[题目] Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到 ...
随机推荐
- 使用JS&jQuery改善用户体验
第一章 JavaScript基本语法 一.运算符 运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&= ...
- C++介绍与入门学习
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计.C++擅长面向对象程序设计的同时,还可以 ...
- Pyhton学习——Day34
# 任何语言都会发生多线程,会出现不同步的问题,同步锁.死锁.递归锁# 异步: 多任务, 多个任务之间执行没有先后顺序,可以同时运行,执行的先后顺序不会有什么影响,存在的多条运行主线# 同步: 多任务 ...
- 汇编(assembling)简介(源:阮一峰)
简介 计算机真正能够理解的是低级语言,它专门用来控制硬件.汇编语言就是低级语言,直接描述/控制 CPU 的运行.如果你想了解 CPU 到底干了些什么,以及代码的运行步骤,就一定要学习汇编语言. 我们知 ...
- 树莓派(Raspberry Pi):完美的家用服务器
出处:http://linux.cn/thread/11884/1/1/ 树莓派(Raspberry Pi):完美的家用服务器 自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和 ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)
---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...
- 使用python备份数据库并删除备份超过一定时长的文件
#!/usr/bin/env python #-*- coding: utf-8 -*- """ @Project:Py @author:sandu @Email: sa ...
- [luogu] P3333 [ZJOI2013]丽洁体(贪心)
P3333 [ZJOI2013]丽洁体 题目描述 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在 ...
- Mysql学习总结(35)——Mysql两千万数据优化及迁移
最近有一张2000W条记录的数据表需要优化和迁移.2000W数据对于MySQL来说很尴尬,因为合理的创建索引速度还是挺快的,再怎么优化速度也得不到多大提升.不过这些数据有大量的冗余字段和错误信息,极不 ...
- DQL命令(查询)
select *或字段1,字段2... from 表名 [where 条件] 提示:*符号表示取表中所有列:没有where语句表示 查询表中所有记录:有wh ...