原文链接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 整体二分 树状数组的更多相关文章

  1. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

  2. 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

    题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...

  3. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  4. BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)

    整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...

  5. bzoj 2527 Meteors - 整体二分 - 树状数组

    Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...

  6. BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)

    题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...

  7. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  8. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  9. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

随机推荐

  1. mysql 5.6升级到5.7.22

    下载对应的包 wget  https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar 备份数据 ...

  2. Light OJ 1007

    求区间欧拉函数平方和... 最后因为longlong 范围爆了WA 了, 0.0 #include<bits/stdc++.h> using namespace std; const in ...

  3. Linux 安装Python和Django

    1.下载python源码包 网址: https://www.python.org/ 在Downloads中打开Source code 由于 Django1.11.15不兼容3.7版本的python 所 ...

  4. C# web Api ajax发送json对象到action中

    直接上代码: 1.Product实体

  5. Struts2框架的概述及学习重点

    什么是Struts2的框架 * Struts2是Struts1的下一代产品,是在 struts1和WebWork的技术基础上进行了合并的全新的Struts 2框架. * 其全新的Struts 2的体系 ...

  6. oracle user locked(timed)处理

    故障现象: SQL> connect scott/scottERROR:ORA-01017: invalid username/password; logon deniedSQL> con ...

  7. Linux Oracle bash: “sqlplus / as sysdba”: command not found 解决方法

    bash: sqlplus: command not found 解决方法 注:本文来源于 <   bash: sqlplus: command not found 解决方法   > 1: ...

  8. vue的单选框

  9. vue-cli脚手架(框架)

    一.创建vue项目 npm install vue-cli -g #-g全局 (sudo)npm install vue-cli -g #mac笔记本 vue-init webpack myvue # ...

  10. 【linux】复制文件夹内容到另一个文件夹

    我一直觉得cp是个非常简单的指令.结果居然遇到坑了.记录一下. 文件夹1:test1/ 文件夹2:test2/ 目标:将test1/中的所有文件和目录拷贝到test2/中 正确指令: cp -rf t ...