BZOJ 2527 [Poi2011]Meteors:整体二分
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2527
题意:
有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站,所有空间站按照顺序形成一个环,也就是说,m号空间站和1号空间站相邻。
现在,将会有k场流星雨降临,每一场流星雨都会给区间[li,ri]内的每个空间站带来ai单位的陨石,每个国家都有一个收集陨石的目标pi,即第i个国家需要收集pi单位的陨石。
询问:每个国家最早完成陨石收集目标是在第几场流星雨过后。
1<=n,m,k<=300000
题解:
整体二分。
将所有的国家一起二分。
对于当前的答案区间[l,r],先模拟下前mid场的流星雨,用树状数组维护。
再将已经超出目标pi的国家放到左边;把没达到目标的放在右边,并将这些国家的需求减去已经收集到的数量。
然后恢复刚才的流星雨,带上相应的国家,分别左右递归。
当访问到叶子节点的时候(即l==r),当前存的国家的答案即为l。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 300005
#define INF 100000000 using namespace std; int n,m,t;
int ct[MAX_N];
int nd[MAX_N];
int L[MAX_N];
int R[MAX_N];
int a[MAX_N];
int ans[MAX_N];
long long sum[MAX_N];
long long dat[MAX_N];
vector<int> sp[MAX_N]; void update(int k,int x)
{
while(k>)
{
dat[k]+=x;
k-=k&-k;
}
} long long query(int k)
{
long long sum=;
while(k<=m)
{
sum+=dat[k];
k+=k&-k;
}
return sum;
} void section(int l,int r,int x)
{
update(r,x);
update(l-,-x);
} void meteor(int x,int f)
{
if(L[x]<=R[x]) section(L[x],R[x],a[x]*f);
else section(L[x],m,a[x]*f),section(,R[x],a[x]*f);
} void read()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d",&ct[i]);
sp[ct[i]].push_back(i);
}
for(int i=;i<=n;i++)
{
scanf("%d",&nd[i]);
}
scanf("%d",&t);
for(int i=;i<=t;i++)
{
scanf("%d%d%d",&L[i],&R[i],&a[i]);
}
t++;
L[t]=; R[t]=t; a[t]=INF;
} void dfs(vector<int> v,int l,int r)
{
if(l==r)
{
for(int i=;i<v.size();i++)
{
ans[v[i]]=l;
}
return;
}
vector<int> vl,vr;
int mid=(l+r)>>;
for(int i=l;i<=mid;i++)
{
meteor(i,);
}
for(int i=;i<v.size();i++)
{
sum[v[i]]=;
}
for(int i=;i<v.size();i++)
{
for(int j=;j<sp[v[i]].size() && sum[v[i]]<nd[v[i]];j++)
{
int temp=sp[v[i]][j];
sum[v[i]]+=query(temp);
}
}
for(int i=;i<v.size();i++)
{
if(sum[v[i]]>=nd[v[i]]) vl.push_back(v[i]);
else nd[v[i]]-=sum[v[i]],vr.push_back(v[i]);
}
for(int i=l;i<=mid;i++)
{
meteor(i,-);
}
dfs(vl,l,mid);
dfs(vr,mid+,r);
} void solve()
{
memset(dat,,sizeof(dat));
vector<int> v;
for(int i=;i<=n;i++) v.push_back(i);
dfs(v,,t);
} void print()
{
for(int i=;i<=n;i++)
{
if(ans[i]==t) printf("NIE\n");
else printf("%d\n",ans[i]);
}
} int main()
{
read();
solve();
print();
}
BZOJ 2527 [Poi2011]Meteors:整体二分的更多相关文章
- bzoj 2527: [Poi2011]Meteors 整体二分
给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...
- BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)
整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...
- 2527: [Poi2011]Meteors[整体二分]
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
- BZOJ.2527.[POI2011]MET-Meteors(整体二分)
题目链接 BZOJ 洛谷 每个国家的答案可以二分+求前缀和,于是可以想到整体二分. 在每次Solve()中要更新所有国家得到的值,不同位置的空间站对应不同国家比较麻烦. 注意到每次Solve()其国家 ...
- BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)
题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...
- BZOJ 2527 [Poi2011]Meteors(整体二分)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2527 [题目大意] 有N个成员国.现在它发现了一颗新的星球, 这颗星球的轨道被分为M份 ...
- 【BZOJ2527】[Poi2011]Meteors 整体二分
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- 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$个太空站排成一个圆 ...
随机推荐
- hdu 1010 Tempter of the Bone 奇偶剪枝
如果所给的时间(步数) t 小于最短步数path,那么一定走不到. 若满足t>path.但是如果能在恰好 t 步的时候,走到出口处.那么(t-path)必须是二的倍数. 关于第二种方案的解释 ...
- 【PHP】富文本HTML过滤器:HTMLPurifier使用教程(防止XSS)
在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤,XSS就是需要重视的一点,先说一下什么是XSS,简单来说就是用户提交数据(例如发 表评论,发表日志)时往Web页面里插入恶意javasc ...
- 06 nginx Location详解之精准匹配
一:Location详解之精准匹配 location 语法 location 有”定位”的意思, 根据Uri来进行不同的定位. 在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分, ...
- Python读取word文档(python-docx包)
最近想统计word文档中的一些信息,人工统计的话...三天三夜吧 python 不愧是万能语言,发现有一个包叫做 docx,非常好用,具体查看官方文档:https://python-docx.read ...
- 安装android Studio和运行react native项目(跳坑篇)
1.需配环境变量,值为sdk的地址. ANDROID_HOME 值:E:\Users\HP\AppData\Local\Android\sdk 2.下载gradle-2.14.1-all.zip 包 ...
- python的进程和线程
关于进程: An executing instance of a program is called a process.程序的执行实例称为进程. Each process provides the ...
- 更换好的yum源
最近重装了虚拟机,因为之前总是碰到一些 yum的软件太 旧了,索性重装了 虚拟机,从零开始,然后配置yum源,以便以后安装 插件包的时候是最新的.如下: 1,进入yum源配置目录cd /etc/yum ...
- tool class
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...
- python3 pillow使用测试
# -*- encoding=utf-8 -*- ''''' pil处理图片,验证,处理 大小,格式 过滤 压缩,截图,转换 图片库最好用Pillow 还有一个测试图片img.jpg, 一个log图片 ...
- python 局部local和全局global变量
global和local变量 虽然简单,但是还是记录一下,主要是转载 转载自:http://blog.sina.com.cn/s/blog_436992740102ux8z.html 先看一段代码 ...