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大的数 ...
随机推荐
- 【原创】大数据基础之Logstash(3)应用之file解析(grok/ruby/kv)
从nginx日志中进行url解析 /v1/test?param2=v2¶m3=v3&time=2019-03-18%2017%3A34%3A14->{'param1':' ...
- JetBrains GoLand 2018 激活码/ 注册码(最新破解方法)
1 前言 本机测试环境如下: Goland版本:2018.1.5 电脑系统:win7 64位 JetbrainsCrack.jar:链接: https://pan.baidu.com/s/1blmN3 ...
- elasticsearch中的java.io.IOException: 远程主机强迫关闭了一个现有的连接
[2018-07-31T14:29:41,289][WARN ][o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [9rTGh-y] caught exc ...
- Python-视图 触发器 事务 存储过程
1.视图2.触发器*** 在某个时间发生了某个事件时 会自动触发一段sql语句3.事务*****4.存储过程***** 5.函数6.备份与恢复*** mysqldump -u -p (库名 [表名] ...
- Modbus库开发笔记:Modbus ASCII Slave开发
与Modbus RTU在串行链路上分为Slave和Master一样,Modbus ASCII也分为Slave和Master,这一节我们就来开发Slave.对于Modbus ASCII从站来说,需要实现 ...
- algorithm的基本注意事项
find(): 返还指向该迭代器的指针,找不到返还last:lnlt find(lnlt first,lnlt last ,const T&val);范围[first,last); list: ...
- linux 源码安装PHP
解压: 解压完: configure: configure成功: make: make完成: 安装完成!!! 测试: 需要./bin/php来运行php 想要任何目录输入PHP就能使用php 方法一: ...
- hdu4276 依赖背包
网上题解都是用spfa求1-n路径的,但其实dfs一次就可以了.. #include <iostream> #include <cstdio> #include <str ...
- getComputedStyle()用法详解
那如果元素即没有在style属性中设置宽高,也没有在样式表中设置宽高,还能用getComputedStyle或currentStyle获取吗?答案是getComputedStyle可以,current ...
- Linux之man命令详解及中文汉化
使用方法 Linux man中的man就是manual的缩写,用来查看系统中自带的各种参考手册 使用方法: man command 示例: [root@VM_0_13_centos ~]# man l ...