BZOJ_2527_[Poi2011]Meteors_整体二分
BZOJ_2527_[Poi2011]Meteors_整体二分
Description
这个星球经常会下陨石雨。BIU已经预测了接下来K场陨石雨的情况。
BIU的第i个成员国希望能够收集Pi单位的陨石样本。你的任务是判断对于每个国家,它需要在第几次陨石雨之后,才能收集足够的陨石。
输入:
第一行是两个数N,M。
第二行有M个数,第i个数Oi表示第i段轨道上有第Oi个国家的太空站。
第三行有N个数,第i个数Pi表示第i个国家希望收集的陨石数量。
第四行有一个数K,表示BIU预测了接下来的K场陨石雨。
接下来K行,每行有三个数Li,Ri,Ai,表示第K场陨石雨的发生地点在从Li顺时针到Ri的区间中(如果Li<=Ri,就是Li,Li+1,...,Ri,否则就是Ri,Ri+1,...,m-1,m,1,...,Li),向区间中的每个太空站提供Ai单位的陨石样本。
输出:
N行。第i行的数Wi表示第i个国家在第Wi波陨石雨之后能够收集到足够的陨石样本。如果到第K波结束后仍然收集不到,输出NIE。
数据范围:
Input
Output
Sample Input
1 3 2 1 3
10 5 7
3
4 2 4
1 3 1
3 5 2
Sample Output
3
NIE
1
整体二分。
solve(b,e,l,r)表示处理b到e的询问,答案在l到r区间内。
二分mid,把l到mid之间的陨石加进去。
用树状数组维护区间加单点求和。
如果答案在左边就往左走,否则减去左边的贡献往右走。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 300050
int n,m,c[N],ans[N],head[N],to[N],nxt[N],cnt,k;
inline void add(int u,int v) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
struct A {
int id,v;
}q[N],t[N];
struct P {
int l,r,v;
}a[N];
void fix(int x,int v){for(;x<=m;x+=x&(-x)) c[x]+=v;}
int inq(int x){int re=0;for(;x;x-=x&(-x)) re+=c[x]; return re;}
void solve(int b,int e,int l,int r) {
if(b>e) return ;
int i,mid=(l+r)>>1,lp=b,rp=e,j;
if(l==r) {
for(i=b;i<=e;i++) ans[q[i].id]=l;
return ;
}
for(i=l;i<=mid;i++) {
if(a[i].l<=a[i].r) {
fix(a[i].l,a[i].v); fix(a[i].r+1,-a[i].v);
}else {
fix(1,a[i].v); fix(a[i].r+1,-a[i].v);
fix(a[i].l,a[i].v);
}
}
for(i=b;i<=e;i++) {
int sizls=0;
for(j=head[q[i].id];j;j=nxt[j]) {
int pos=to[j]-n;
sizls+=inq(pos);
if(sizls>=q[i].v) break;
}
if(sizls>=q[i].v||sizls<0) t[lp++]=q[i];
else q[i].v-=sizls,t[rp--]=q[i];
}
for(i=b;i<=e;i++) q[i]=t[i];
for(i=l;i<=mid;i++) {
if(a[i].l<=a[i].r) {
fix(a[i].l,-a[i].v); fix(a[i].r+1,a[i].v);
}else {
fix(1,-a[i].v); fix(a[i].r+1,a[i].v);
fix(a[i].l,-a[i].v);
}
}
solve(b,rp,l,mid);
solve(lp,e,mid+1,r);
}
int main() {
scanf("%d%d",&n,&m);
int i,x;
for(i=1;i<=m;i++) {
scanf("%d",&x);
add(x,i+n);
}
for(i=1;i<=n;i++) {
scanf("%d",&q[i].v); q[i].id=i;
}
scanf("%d",&k);
for(i=1;i<=k;i++) {
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].v);
}
solve(1,n,1,k+1);
for(i=1;i<=n;i++) {
if(ans[i]<=k) printf("%d\n",ans[i]);
else puts("NIE");
}
}
BZOJ_2527_[Poi2011]Meteors_整体二分的更多相关文章
- [bzoj2527][Poi2011]Meteors_整体二分_树状数组
Meteors bzoj-2527 Poi-2011 题目大意:题目链接. 注释:略. 想法: 首先答案可以离线,且具有单调性. 这里的单调性就是随着时间的推移,每个国家收集的陨石数增加. 不难想到整 ...
- 2527: [Poi2011]Meteors[整体二分]
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
- 【BZOJ2527】[Poi2011]Meteors 整体二分
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- bzoj 2527: [Poi2011]Meteors 整体二分
给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...
- 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$个太空站排成一个圆 ...
- Luogu3527 POI2011 Meteors 整体二分、树状数组、差分
传送门 比较板子的整体二分题目,时限有点紧注意常数 整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([m ...
- 洛谷P3527 [POI2011]MET-Meteors [整体二分]
题目传送门 Meteors 格式难调,题面就不妨放了. 分析: 一道整体二分的练手题. 就是一般的整体二分的套路,但是要注意,将修改和询问加入队列的时候要先加修改再加询问.另外,博主代码打得太丑,常数 ...
- BZOJ.2527.[POI2011]MET-Meteors(整体二分)
题目链接 BZOJ 洛谷 每个国家的答案可以二分+求前缀和,于是可以想到整体二分. 在每次Solve()中要更新所有国家得到的值,不同位置的空间站对应不同国家比较麻烦. 注意到每次Solve()其国家 ...
随机推荐
- http 状态表
整理一下xmlHttp.status的值(http 状态表) 状态码 状态码 意义 释义 100 1xx (临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 继续 客户端应当继续发送请 ...
- 不是标准execl转换处理方法
不是标准execl的主要原因就是原本的html.xml.txt尾椎的文件,更改成了xls尾椎的文件 面对这种问题,最开始我用了jawin.jar,但是始终会报错,NoClassDefFoundErro ...
- List集合中元素排序
应用场景: 在开发中经常遇到要对List<Object>集合进行排序,并且是根据集合中的对象的某个属性来进行排序 --------以下就此做出的解决方案 public static ...
- minimun path sum(最小路径和)
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- Storm 常用命令
1.启动Nimbus bin/storm nimbus & 2.启动Supervisor bin/storm supervisor & 3.启动UI bin/storm ui & ...
- java并发包分析之———volitale
首要结论:volatile 变量提供了线程的可见性,并不能保证线程安全性和原子性. 什么是线程的可见性: 锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility ...
- Maven编译中的一些坑
错误1: invalid LOC header 这个错误比较好解决,jar下载不完全,去到相应的Maven包目录,把东西删掉重新编译就行. 错误2: java.lang.TypeNotPresentE ...
- Python2和Python3比较分析
一直有看到网上有讨论Python2和Python3的比较,最近公司也在考虑是否在spark-python大数据开发环境中升级到python3.通过本篇博文记录Python2.7.13和Pthon3.5 ...
- Java枚举enum以及应用:枚举实现单例模式
枚举作为一个常规的语言概念,一直到Java5才诞生不得不说有点奇怪,以至于到现在为止很多程序员仍然更喜欢用static final的形式去命名常量而不使用,一般情况下,Java程序员用这种方式去实现枚 ...
- Android自动化框架介绍
随着Android应用得越来越广,越来越多的公司推出了自己移动应用测试平台.例如,百度的MTC.东软易测云.Testin云测试平台…….由于自己所在项目组就是做终端测试工具的,故抽空了解了下几种常见的 ...