BZOJ2527 [Poi2011]Meteors 整体二分 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html
题目传送门 - BZOJ2527
题意
有$n$个国家。
太空里有$m$个太空站排成一个圆圈。其中第$i$的太空站是第$O_i$个国家的。
第$i$个国家要通过自己的太空站收集$P_i$数量的陨石雨。
现在有$k$场陨石雨,第$i$场陨石雨会给$L_i~R_i$(顺时针数)的所有太空站分别带来$A_i$数量的陨石雨。
再解释下这个$L_i~R_i$,如果$L_i<=R_i$,那么代表的区间是$L_i,L_i+1,...,R_i-1,R_i$;如果$L_i>R_i$,那么代表的区间是$L_i,L_i+1,m-1,m,\ \ \ \ 1,2,R_i-1,R_i$。
现在对于每一个国家问至少要经过几次陨石雨才能收集到足够的陨石雨。如果$k$次之后都收集不够,那么输出$NIE$。
$n,m,k\leq 3\times 10^5,\ \ P_i,A_i\leq 10^9$
题解
整体二分基础题吧、、
二分下要经历的陨石雨次数。
树状数组实现区间修改和单点询问。
然后好像说完了。
整体二分的思路类似于这一题BZOJ3110
具体看代码。
我也是真悲催,题意看错好几次。
煞笔错误好几个。QAQ
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=300005;
int n,m,k,p[N],id[N],ans[N],Ltmp[N],Rtmp[N];
vector <int> pos[N];
LL tree[N];
struct Rain{
int L,R,a;
void get(){
scanf("%d%d%d",&L,&R,&a);
}
}rain[N];
int lowbit(int x){
return x&-x;
}
void add(int x,LL y){
for (;x<=m;x+=lowbit(x))
tree[x]+=y;
}
LL sum(int x){
LL ans=0;
for (;x>0;x-=lowbit(x))
ans+=tree[x];
return ans;
}
void raining(int L,int R,LL v){
if (L<=R)
add(L,v),add(R+1,-v);
else
add(1,v),add(R+1,-v),add(L,v),add(m+1,-v);
}
void solve(int kL,int kR,int L,int R){
if (L>R)
return;
if (kL==kR){
for (int i=L;i<=R;i++)
ans[id[i]]=kL;
return;
}
int l=0,r=0,kmid=(kL+kR)>>1;
for (int i=kL;i<=kmid;i++)
raining(rain[i].L,rain[i].R,rain[i].a);
for (int i=L;i<=R;i++){
LL res=0;
for (int j=0;j<pos[id[i]].size();j++){
res+=sum(pos[id[i]][j]);
if (res>=p[id[i]])
break;
}
if (res>=p[id[i]])
Ltmp[++l]=id[i];
else
Rtmp[++r]=id[i],p[id[i]]-=res;
}
for (int i=kL;i<=kmid;i++)
raining(rain[i].L,rain[i].R,-rain[i].a);
for (int i=L;i<=L+l-1;i++)
id[i]=Ltmp[i-L+1];
for (int i=R-r+1;i<=R;i++)
id[i]=Rtmp[i-R+r];
solve(kL,kmid,L,L+l-1);
solve(kmid+1,kR,R-r+1,R);
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
pos[i].clear();
for (int i=1,x;i<=m;i++)
scanf("%d",&x),pos[x].push_back(i);
for (int i=1;i<=n;i++)
scanf("%d",&p[i]),id[i]=i;
scanf("%d",&k);
for (int i=1;i<=k;i++)
rain[i].get();
k++;
rain[k].L=1,rain[k].R=m,rain[k].a=1e9;
solve(1,k,1,n);
for (int i=1;i<=n;i++)
if (ans[i]<k)
printf("%d\n",ans[i]);
else
puts("NIE");
return 0;
}
BZOJ2527 [Poi2011]Meteors 整体二分 树状数组的更多相关文章
- BZOJ2527[Poi2011]Meteors——整体二分+树状数组
题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)
整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...
- bzoj 2527 Meteors - 整体二分 - 树状数组
Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...
- BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)
题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
随机推荐
- 百度echarts插件x轴坐标显示不全决解方法
X轴显示不全: xAxis.axisLabel.interval number, Function [ default: 'auto' ] 坐标轴刻度标签的显示间隔,在类目轴中有效. 默认会采用标签不 ...
- 进程命令ps/top/kill
进程: 通俗的说就是 当前正在执行的一个程序 命令: ps 英文: process status 作用: 查看进程的详细状况 选项: a:显示终端上的所有进程,包括其他用户的进程 u:显示进程的详细状 ...
- ubuntu安装pycharm并建立桌面快捷方式
环境:ubuntu18.04 参考文章:本地安装:https://blog.csdn.net/liuxiao214/article/details/78893457 在线安装:https://www. ...
- 信息摘要算法之二:SHA1算法分析及实现
SHA算法,即安全散列算法(Secure Hash Algorithm)是一种与MD5同源的数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛 ...
- (五)STL算法
.算法 1.算法通过迭代器来操作容器中的数据: 2.算法为模板函数: 二.迭代器与算法 1.根据移动能力,将迭代器分成了五类 2.使用萃取,输出各个容器中,迭代器的类别 3.其中istream, os ...
- 用echarts写的轨迹图demo
轨迹图预览: [下载地址]:https://github.com/zhangzn3/trail-graph.git
- map函数和reduce函数的区别
①从参数方面来讲:map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数.reduce()函数 ...
- 充分认识Mysql
使用开源产品是一种潮流.在使用之前,我们首先需要对Mysql 有一定的了解,特别是Mysql 的缺点.只有了解其缺点后,我们才知道,能不能真正的应用到我们的业务场景中去. 2.1 Mysql 数据库简 ...
- 将labelme 生成的.json文件进行可视化的代码+label.png 对比度处理的matlab代码
labelme_to_dataset 指令的代码实现: show.py文件 #!E:\Anaconda3\python.exe import argparse import json import o ...
- ActiveSync中的SendMail
SendMail命令是专门用于发送MIME格式邮件的.在这里,子元素ClientId必须不同,否则会被认为是同一封邮件,被服务器拒绝. 疑问:ClientId应该是和账户 ...