原文链接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. Python-WEB -VUE初识

    走进Vue_渐进式 JavaScript 框架 通过对框架的了解与运用程度,来决定其在整个项目中的应用范围,最终可以独立以框架方式完成整个web前端项目 what -- 什么是Vue 可以独立完成前后 ...

  2. CodeCraft-19 and Codeforces Round #537 (Div. 2) 题解

    传送门 D. Destroy the Colony 首先明确题意:除了规定的两种(或一种)字母要在同侧以外,其他字母也必须在同侧. 发现当每种字母在左/右边确定之后,方案数就确定了,就是分组的方案数乘 ...

  3. Confluence 6 home 目录中的内容

    Confluence home 目录存储了 Confluence 在运行中所使用的数据.下面对 Confluence home 目录中使用的数据和文件进行一些说明: confluence.cfg.xm ...

  4. Confluence 6 用户目录图例 - 可读写连接 LDAP

    上面的图:Confluence 连接到一个 LDAP 目录. https://www.cwiki.us/display/CONFLUENCEWIKI/Diagrams+of+Possible+Conf ...

  5. HTML5-长按事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...

  6. dell g3:安装ubuntu16.04 + CUDA8.0

    一.Ubuntu 1.选择UEFI模式启动,参考https://blog.csdn.net/qq_34570910/article/details/78084659 2.卡在logo界面进不去,在qu ...

  7. MySQL、MongoDB、Redis 数据库之间的区别

    NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路. M ...

  8. SpringBoot集成Shiro

    Shiro是一个安全框架,控制登陆,角色权限管理(身份认证.授权.回话管理.加密) Shiro不会去维护用户,维护权限:这些需要通过realm让开发人员自己注入 1.在pom.xml中引入shiro的 ...

  9. 【python】给正则匹配部分命名

    可以用?P<name>的方法给正则匹配的部分命名. 例:要将<字母,数字>的部分命名为test x = "abc <haha,123> test @@&q ...

  10. 网络扫描信息收集基于(Windows)

    1.首先说明一下一款网络扫描工具,在之前的博客中我曾简要的写过关于Advance IP Scanner使用方法,最近要写网络扫描的工具,所以对这款工具做一个详细的功能细节上的介绍. 如下图  在输入框 ...