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$个太空站排成一个圆 ...
随机推荐
- 把Android原生的View渲染到OpenGL Texture
http://blog.csdn.net/u010949962/article/details/41865777 最近要把Android 原生的View渲染到OpenGL GLSurfaceView中 ...
- Django---Blog系统开发之注册页面(验证码&ajax发送文件)
前端页面及渲染: 静态文件的配置:setting.py: static 文件放在app下 STATIC_URL = '/static/' STATIC_ROOT = ( os.path.join(BA ...
- HDU 3449 Consumer
这是一道依赖背包问题.背包问题通常的解法都是由0/1背包拓展过来的,这道也不例外.我最初想到的做法是,由于有依赖关系,先对附件做个DP,得到1-w的附件背包结果f[i]表示i花费得到的最大收益,然后把 ...
- Android系统--Binder系统具体框架分析(一)补充
Android系统--Binder系统具体框架分析(一)补充 补充:对Binder驱动分析一的代码补充,添加saygoobye和saygoodbye_to服务 test_server.h #ifnde ...
- 解决MySQL因不能创建 PID 导致无法启动的方法
问题描述 MySQL 启动报错信息如下: ? 1 2 Starting mysqld (via systemctl): Job for mysqld.service failed because t ...
- ElasticSearch入门常用命令
基于开源项目MyAlice智能客服学习ElasticSearch https://github.com/hpgary/MyAlice/wiki/%E7%AC%AC01%E7%AB%A0%E5%AE%8 ...
- excel比较筛选两列不一样的数据
在excel表中,罗列两列数据,用B列数据与A列比较,筛选出B列中哪些数据不同,并用红色标记出来. 首先选中B列.直接鼠标左键点击B列即可选中."开始"--->&qu ...
- Kafka详解二:如何配置Kafka集群
问题导读1.Kafka有哪几种配制方法?2.如何启动一个Consumer实例来消费消息? Kafka集群配置比较简单,为了更好的让大家理解,在这里要分别介绍下面三种配置 单节点:一个broker的集群 ...
- https阿里云证书购买与apache环境配置
1.在阿里云云盾安全->CA证书购买 2.下载证书解压文件,一般有四个文件 3.在/etc/apache2 下创建一个文件夹cert 放入以上四个文件(路径可自己任意选择) 4.$sudo a ...
- SoapUI使用方法-01发送http请求
soap ui http://blog.csdn.net/russ44/article/details/51680083 一.发送HTTP请求消息 1.打开soapUI. 2.新建一个项目,实例如下: ...