浅谈离线分治算法: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的更多相关文章

  1. 【BZOJ2527】[Poi2011]Meteors 整体二分

    [BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...

  2. 【bzoj2527】[Poi2011]Meteors(树状数组(单点查询,区间修改)+整体二分)

    [bzoj2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...

  3. BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  4. 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

    题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...

  5. BZOJ2527: [Poi2011]Meteors

    补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...

  6. 2527: [Poi2011]Meteors[整体二分]

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1528  Solved: 556 [Submit][S ...

  7. bzoj千题计划149:bzoj2527: [Poi2011]Meteors

    http://www.lydsy.com/JudgeOnline/problem.php?id=2527 整体二分 区间加,单点查,树状数组维护差分序列 注意 累积可能会爆long long,所以一满 ...

  8. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

  9. BZOJ2527 [Poi2011]Meteors 整体二分 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...

随机推荐

  1. 纯代码编写qt登录界面(转)

    1. 新建Qt Widgets Application,项目名称为login1,在类信息页面保持类名和基类为MainWindow和QMainWindow不变,取消选择创建界面选项,如下图所示.     ...

  2. android 获取视频缩略图终极解决方案(ffmpeg)

    http://blog.csdn.net/u010499721/article/details/50338623 前些天有个师弟(在做一个仿LinkInEyes行车记录仪的app)问我怎么获取视频缩略 ...

  3. wifidog源码分析 - wifidog原理 tiger

    转:http://www.cnblogs.com/tolimit/p/4223644.html wifidog源码分析 - wifidog原理 wifidog是一个用于配合认证服务器实现无线网页认证功 ...

  4. Django-实现图片验证码

    Django实现图片验证码 Python生成随机验证码,需要使用PIL模块. pip3 install pillow 1.基本使用 1. 1 创建图片 from PIL import Image im ...

  5. Django基础知识MTV

    Django简介 Django是使用Python编写的一个开源Web框架.可以用它来快速搭建一个高性能的网站. Django也是一个MVC框架.但是在Django中,控制器接受用户输入的部分由框架自行 ...

  6. poj 1679 The Unique MST 【次小生成树+100的小数据量】

    题目地址:http://poj.org/problem?id=1679 2 3 3 1 2 1 2 3 2 3 1 3 4 4 1 2 2 2 3 2 3 4 2 4 1 2 Sample Outpu ...

  7. mapreduce 实现数子排序

    设计思路: 使用mapreduce的默认排序,按照key值进行排序的,如果key为封装int的IntWritable类型,那么MapReduce按照数字大小对key排序,如果key为封装为String ...

  8. 如何在myEclipse中创建配置文件,比如:XXX.properties

    myEclipse是没有直接生成配置文件的方法,除非去配置某些插件. 目前通用的方法是:随便新建一个文件(比如:XXX.xml),然后对该文件重命名,改成XXX.properties即可. 很简单有没 ...

  9. BZOJ 1941 kd-tree

    模板题 题意说的可能有点不清楚 一开始的点必须在给定的n个点里面 所以枚举点 然后ask最大和最小值 估价函数中 最大值的写法和最小值不同 全部取max 而最小值在估价时 如果在某个点管辖的空间里 就 ...

  10. python读取.mat文件的数据

    首先导入scipy的包 from scipy.io import loadmat 然后读取 m = loadmat("F:/__identity/activity/论文/data/D001. ...