原文链接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. I/O 模型

    5种I/O模型的基本区别: 阻塞式I/O 非阻塞式I/O I/O复用 信号异步模型 异步I/O 1. 阻塞 I/O 最流行的I/O模型是阻塞I/O模型,缺省情形下,所有套接口都是阻塞的.我们以数据报套 ...

  2. Light OJ 1214

    简单大数模拟题: #include<bits/stdc++.h> using namespace std; typedef long long ll; string Num; vector ...

  3. JMeter实现唯一参数生成不重复时间戳

    现象: 使用jmeter做接口压测时,总会遇到压测时,提示不允许重复id或提示订单不允许重复现象,那么如何解决呢? 原料工具 jmeter4.0 本地准备好接口服务 思路: 单个接口,小批量接口,一般 ...

  4. [其它]安装ios12 developer beta 3出错

    ios11设备升级到ios12有时候会出现 安装ios12 developer beta 3出错 提示.此时有一种可能就是,你手机或者ipad空间不足2G多(因为ios12是2.13G) 仅作为记录使 ...

  5. Hystrix系列-5-Hystrix的资源隔离策略

    转自:https://blog.csdn.net/liuchuanhong1/article/details/73718794 Hystrix的资源隔离策略有两种,分别为:线程池和信号量. 说到资源隔 ...

  6. Sql语句分页,有待优化

    封装成存储过程,但是有点小问题,如果有弄好了的朋友可留言,谢谢了,我只提供了一个模版哈(也是我想实现的功能) create procedure paging_procedure ( @pageInde ...

  7. 10)django-ORM(创建,字段类型,字段参数)

    一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB first 先在数据库中创建数据库表等 Code first 先创建类,然后根据类创建数 ...

  8. Linux 上的 SQL Server 2017 的安装指南

    一:介绍背景 微软在2016年 3 月首次对外宣布了 Linux 版的 SQL Server,并于2017年 7 月发布了首个公开 RC 版.前几日在美国奥兰多召开的微软 Ignite 2017 大会 ...

  9. SQLPLUS 命令

    定制:sql提示符信息 1.显示SQLPLUS帮助,命令如下:HELP INDEX @ COPY PAUSE SHUTDOWN @@ DEFINE PRINT SPOOL / DEL PROMPT S ...

  10. Confluence 6 基于 Confluence 数据中心的 SAML 单点登录

    安全申明标记语言(Security Assertion Markup Language (SAML))是一个基于 XML 的数据格式,允许各个软件平台通过identity provider (IdP) ...