【BZOJ2527】[Poi2011]Meteors 整体二分
【BZOJ2527】[Poi2011]Meteors
Description
这个星球经常会下陨石雨。BIU已经预测了接下来K场陨石雨的情况。
BIU的第i个成员国希望能够收集Pi单位的陨石样本。你的任务是判断对于每个国家,它需要在第几次陨石雨之后,才能收集足够的陨石。
输入:
第一行是两个数N,M。
第二行有M个数,第i个数Oi表示第i段轨道上有第Oi个国家的太空站。
第三行有N个数,第i个数Pi表示第i个国家希望收集的陨石数量。
第四行有一个数K,表示BIU预测了接下来的K场陨石雨。
接下来K行,每行有三个数Li,Ri,Ai,表示第K场陨石雨的发生地点在从Li顺时针到Ri的区间中(如果Li<=Ri,就是Li,Li+1,...,Ri,否则就是Ri,Ri+1,...,m-1,m,1,...,Li),向区间中的每个太空站提供Ai单位的陨石样本。
输出:
N行。第i行的数Wi表示第i个国家在第Wi波陨石雨之后能够收集到足够的陨石样本。如果到第K波结束后仍然收集不到,输出NIE。
数据范围:
Input
Output
Sample Input
1 3 2 1 3
10 5 7
3
4 2 4
1 3 1
3 5 2
Sample Output
NIE
1
题解:“整体二分就是对答案的cdq分治”
我们在cdq分治的过程中,不断将询问分成两个部分,在mid前能完成的放在左边,不能完成的放在右边,然后继续递归处理询问,直到递归结束,就能得出答案。
整体二分的核心部分在于保存一个指针(或数组),记录当前的状态,然后向当前的状态中不断添加(或删除)操作,从而得到另一个状态(说的不太具体,详见代码第42-43行)
当然不是所有的整体二分都可以做到这一点(比如只能添加不能删除)
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,m,now,K;
const int maxn=300010;
typedef long long ll;
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int next[maxn],head[maxn];
ll s[maxn],P[maxn],qa[maxn],cur[maxn];
int p[maxn],q[maxn],ql[maxn],qr[maxn],ans[maxn];
void updata(int x,ll v)
{
for(int i=x;i<=m;i+=i&-i) s[i]+=v;
}
ll query(int x)
{
ll ret=0;
for(int i=x;i;i-=i&-i) ret+=s[i];
return ret;
}
void modify(int x,int f)
{
if(ql[x]<=qr[x]) updata(ql[x],qa[x]*f),updata(qr[x]+1,-qa[x]*f);
else updata(1,qa[x]*f),updata(qr[x]+1,-qa[x]*f),updata(ql[x],qa[x]*f);
}
void solve(int l,int r,int L,int R)
{
if(l>r) return ;
if(L==R)
{
for(int i=l;i<=r;i++) ans[p[i]]=L;
return ;
}
int i,j,mid=l-1,MID=L+R>>1;
while(now<MID) modify(++now,1);
while(now>MID) modify(now--,-1);
for(i=l;i<=r;i++)
{
cur[p[i]]=0;
for(j=head[p[i]];j&&cur[p[i]]<P[p[i]];j=next[j]) cur[p[i]]+=query(j);
if(cur[p[i]]>=P[p[i]]) mid++;
}
int l1=l,l2=mid+1;
for(i=l;i<=r;i++)
{
if(cur[p[i]]>=P[p[i]]) q[l1++]=p[i];
else q[l2++]=p[i];
}
for(i=l;i<=r;i++) p[i]=q[i];
solve(l,mid,L,MID),solve(mid+1,r,MID+1,R);
}
int main()
{
n=rd(),m=rd();
int i,j,a;
for(i=1;i<=m;i++) a=rd(),next[i]=head[a],head[a]=i;
for(i=1;i<=n;i++) P[i]=rd(),p[i]=i;
K=rd();
for(i=1;i<=K;i++) ql[i]=rd(),qr[i]=rd(),qa[i]=rd();
K++;
ql[K]=1,qr[K]=m,qa[K]=1<<30;
solve(1,n,1,K);
for(i=1;i<=n;i++)
{
if(ans[i]<K) printf("%d\n",ans[i]);
else printf("NIE\n");
}
return 0;
}
【BZOJ2527】[Poi2011]Meteors 整体二分的更多相关文章
- BZOJ2527 [Poi2011]Meteors 整体二分 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...
- BZOJ2527[Poi2011]Meteors——整体二分+树状数组
题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...
- BZOJ2527: [Poi2011]Meteors(整体二分)
Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
- [bzoj2527][Poi2011]Meteors_整体二分_树状数组
Meteors bzoj-2527 Poi-2011 题目大意:题目链接. 注释:略. 想法: 首先答案可以离线,且具有单调性. 这里的单调性就是随着时间的推移,每个国家收集的陨石数增加. 不难想到整 ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- 2527: [Poi2011]Meteors[整体二分]
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
- bzoj 2527: [Poi2011]Meteors 整体二分
给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...
- Luogu3527 POI2011 Meteors 整体二分、树状数组、差分
传送门 比较板子的整体二分题目,时限有点紧注意常数 整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([m ...
随机推荐
- CodeIgniter 无法上传 CSV 文件
本篇文章由:http://xinpure.com/codeigniter-unable-to-upload-a-csv-file/ 解决 CodeIgniter 中使用 Upload 类无法上传 CS ...
- Ubuntu下开启mysql远程登陆权限
在腾讯云上租了个云服务器,并且安装启动了mysql. 这时候用本地的mysql workbench去连接就会报错,提示无法成功连接. 其实这是因为没有开启账户的远程登陆权限.那么下面就开启一下: 1. ...
- 无法删除尚未附加的实体-linq中使用反射删除记录出现错误,应该如何解决。
db.airports.Attach(data); db.airports.DeleteOnSubmit(data); db.SubmitChanges();
- ftp客户端的创建
1.本段代码采用了 select I/O端口复用 2.含有三种功能:ls, 上传文件, 下载文件.这是拷贝别人的代码,自己添加了注释,随后会进行修改, 自己需要的功能:上传文件, 下载文件, (并 ...
- Lintcode---区间求和 I
给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表.每一个查询列表有两个整数 [start, end] . 对于每个查询,计算出数组中从下标 start 到 end ...
- Canvas转换为Blob对象并使用Ajax发送
Canvas转换为Blob对象并使用Ajax发送 转换为Blob对象后,可以使用Ajax上传图像文件. 先从canvas获取dataurl, 再将dataurl转换为Blob对象 var dataur ...
- Unity3D刚体不同力的测试(ForceMode,AddForce,RelativeAddForce)
摘自圣典的一段翻译: ForceAdd a continuous force to the rigidbody, using its mass.添加一个可持续力到刚体,使用它的质量.Accelerat ...
- Atitit.使用引擎加脚本架构的设计 使用php,js来开发桌面程序。。
Atitit.使用引擎加脚本架构的设计 使用php,js来开发桌面程序.. 1. 引擎加脚本架构 跨平台,桌面与web的优势1 2. 架构桌面引擎(java,c#)2 3. php桌面引擎要点2 3. ...
- [svc][op]杀进程
杀进程: 杀服务名 /usr/bin/killall -HUP syslogd 杀掉进程号 /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/nul ...
- IOS,objective_C中用@interface和 @property 方式声明变量的区别
转自:http://www.cnblogs.com/letmefly/archive/2012/07/20/2601338.html 一直有疑问,在objective_C中声明变量会有 2种方式,今天 ...