BZOJ2527:[POI2011]Meteors
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=2527
我们增加一次陨石雨,最后一次陨石雨的会给每个收集站都增加\(inf\)个陨石。然后我们把所有的国家一起整体二分答案,如果答案等于最后一次陨石雨那么就输出\(NIE\)。
每次整体二分,我们先将\([l,mid]\)的陨石雨下完。在树状数组上区间修改单点询问。然后我们把每个国家都询问在\([l,mid]\)中可以获得多少陨石,来判断它的答案究竟是在哪个值域区间。
时间复杂度:\(O(nlog^2n)\)
空间复杂度:\(O(n)\)
代码如下:
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
#define low(i) ((i)&(-(i)))
const int maxn=3e5+5;
int n,m,k;
bool bo[maxn];
vector<int>O[maxn];
vector<int>::iterator it;
int ans[maxn],id[maxn],tmp[maxn],q[maxn];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct rain {
int l,r,a;
}p[maxn];
struct tree_array {
ll c[maxn];
void add(int pos,int v) {
for(int i=pos;i<=m;i+=low(i))
c[i]+=v;
}
ll query(int pos) {
ll res=0;
for(int i=pos;i;i-=low(i))
res+=c[i];
return res;
}
}T;
void solve(int l,int r,int st,int ed) {
if(ed<st)return;
if(l==r) {
for(int i=st;i<=ed;i++)
ans[id[i]]=l;
return;
}
int mid=(l+r)>>1,cnt=0;
for(int i=l;i<=mid;i++)
if(p[i].l<=p[i].r)T.add(p[i].l,p[i].a),T.add(p[i].r+1,-p[i].a);
else T.add(p[i].l,p[i].a),T.add(1,p[i].a),T.add(p[i].r+1,-p[i].a);
for(int i=st;i<=ed;i++) {
ll sum=0;
for(it=O[id[i]].begin();it!=O[id[i]].end();it++) {
sum+=T.query(*it);
if(sum>=q[id[i]])break;//不及时break的话会爆ll
}
if(sum>=q[id[i]])cnt++,bo[i]=1;
else q[id[i]]-=sum,bo[i]=0;
}
for(int i=l;i<=mid;i++)
if(p[i].l<=p[i].r)T.add(p[i].l,-p[i].a),T.add(p[i].r+1,p[i].a);
else T.add(p[i].l,-p[i].a),T.add(1,-p[i].a),T.add(p[i].r+1,p[i].a);
int ED=st,ST=st+cnt;
for(int i=st;i<=ed;i++)
if(bo[i])tmp[ED++]=id[i];
else tmp[ST++]=id[i];
for(int i=st;i<=ed;i++)
id[i]=tmp[i];
solve(l,mid,st,ED-1),solve(mid+1,r,ED,ed);
}
int main() {
n=read(),m=read();
for(int i=1;i<=m;i++) {
int x=read();id[i]=i;
O[x].push_back(i);
}
for(int i=1;i<=n;i++)q[i]=read();
k=read();
for(int i=1;i<=k;i++)
p[i].l=read(),p[i].r=read(),p[i].a=read();
p[++k].l=1,p[k].r=m,p[k].a=1e9;
solve(1,k,1,n);
for(int i=1;i<=n;i++)
if(ans[i]==k)puts("NIE");
else printf("%d\n",ans[i]);
return 0;
}
BZOJ2527:[POI2011]Meteors的更多相关文章
- 【BZOJ2527】[Poi2011]Meteors 整体二分
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- 【bzoj2527】[Poi2011]Meteors(树状数组(单点查询,区间修改)+整体二分)
[bzoj2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
- BZOJ2527: [Poi2011]Meteors
补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...
- 2527: [Poi2011]Meteors[整体二分]
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
- bzoj千题计划149:bzoj2527: [Poi2011]Meteors
http://www.lydsy.com/JudgeOnline/problem.php?id=2527 整体二分 区间加,单点查,树状数组维护差分序列 注意 累积可能会爆long long,所以一满 ...
- BZOJ2527[Poi2011]Meteors——整体二分+树状数组
题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...
- BZOJ2527 [Poi2011]Meteors 整体二分 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...
随机推荐
- [C++] 麻将胡牌算法
麻将的玩法规则众多,核心的玩法是一致的,本文将根据联发科2017年编程挑战赛的复赛题规则来实现. 牌的表示方式 ABCDEFGHI代表一到九萬,abcdefghi代表一到九条,123456789代表一 ...
- SecureCRT按退格键出现^H问题
1. 选择选项>>会话选项>>终端>>映射键
- vue-router scrollBehavior无效的问题及解决方案
在使用vue做单页面应用开发时候 使用vue-router作为路由控制器 在使用过程中发现每个页面打开都在原来的位置 不能返回到页面顶部位置 ,然后查看api文档 滚动行为 发现如下代码: con ...
- TCP的三个接收队列
之前对于TCP接收过程中的三个队列的关系之前没搞清楚. 这几天,在同事邱的帮助下,终于把关系理清了,故特此做个笔记. 一.在软中断中加入数据包 tcp_v4_rcv()函数是tcp层收包的入口. in ...
- QT5中如何使用QFtp类
QT5中如何使用QFtp类 http://2662597.blog.51cto.com/2652597/1279806 由于QT5对QML的支持有很大的改进,所以打算将原来基于QT4的程序移植到QT5 ...
- 修改SpringBoot 默认的小叶子图标
Springboot 项目,在浏览器中访问时,浏览器上导航栏的图标是一片绿色的叶子,我们可以修改它. 将格式为.ico的图片放入以下任一项目文件夹即可.但,图片命名必须为favicon.ico 1.类 ...
- vijos 1250 最勇敢的机器人 分组背包+并查集
P1250最勇敢的机器人 背景 Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ 描述 机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品. 它们到了一个仓库,里面有n ...
- sublime 编译C++
http://www.yalewoo.com/sublime_text_3_gcc.html 这篇博客很强 完美解决在sublime里写C++无法输入的问题 sublime text 3配置c/c++ ...
- Tensorflow中使用CNN实现Mnist手写体识别
本文参考Yann LeCun的LeNet5经典架构,稍加ps得到下面适用于本手写识别的cnn结构,构造一个两层卷积神经网络,神经网络的结构如下图所示: 输入-卷积-pooling-卷积-pooling ...
- http://www.cnblogs.com/jscode/archive/2012/09/03/2669299.html
http://www.cnblogs.com/jscode/archive/2012/09/03/2669299.html