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$个太空站排成一个圆 ...
随机推荐
- ⭐内核MKDEV(MAJOR, MINOR)宏
版本:linux-2.6.24.4宏: MKDEV(MAJOR, MINOR); 说明: 获取设备在设备表中的位置. MAJOR 主设备号 MINOR 次设 ...
- QT线程
一.QObject子类 说明:以串口线程传输文件为例子,使用的是MoveTothread函数. void QObject::moveToThread(QThread *targetThread)可以将 ...
- nginx 反向代理配置之---指定单域名
server { listen 80; server_name ngin服务器所对应的的域名; error_log /data/logs/nginx/mainsite.error.log; acces ...
- CodeForces 266E More Queries to Array...(线段树+式子展开)
开始觉得是规律题的,自以为是的推了一个规律,结果测试数据都没过....看了love神的博客才发现只是把式子展开就找到规律了.不过挺6的是我虽然想错了,但是维护的的东西没有错,只是改改(改了进两个小时好 ...
- UvaLive 5811 概率DP
题意 : 有54张牌 问抽多少张牌能使每种花色都至少是给定的数字 两张王牌可以被选择为任何花色 高放学长真是太腻害辣! 设置dp[][][][][x][y] 前四维代表四种真的花色的数量 后两维xy代 ...
- codevs1796 社交网络
Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这 ...
- hdu 4737 A Bit Fun 尺取法
A Bit Fun Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Proble ...
- MySql基础学习-mysql安装
Linux环境下的安装 1检查是否已经安装 sudo service mysql start #若未安装,则提示: mysql: unrecognized service 2安装MySql #安装 M ...
- JavaScript 正则表达收集整理
JavaScript 正则表达收集整理 //可为空 /^\s*$/ //密码验证,必须且只含有数字和字母,可以拥有英文符号,6-17位 /(?=.{,})(?=.*\d)(?=.*[a-z])[\x2 ...
- print webpage
使用浏览器打印网页时(A4纸)有一个固定的尺寸: 高级浏览器: width:700px height:1000px