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()其国家 ...
随机推荐
- python---haproxy---文件操作
haproxy 文件操作,操作属于简单操作,不复杂 # -*- coding:utf-8 -*- # LC def search(*args): #查找Haproxy文件中的服务器 list1 = [ ...
- FatMouse' Trade -HZNU寒假集训
FatMouse' Trade FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the wa ...
- python3学习笔记1---引用http://python3-cookbook.readthedocs.io/zh_CN/latest/
2018-02-28数据结构和算法(1) 1.1解压序列赋值给多个变量: 任何的序列(或者是可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量. 唯一的前提就是变量的数量必须跟序列元素的数量是 ...
- java之jsp内置对象
1.out对象 <% out.println("金鳞岂是池中物,<br>"); out.println("一遇风云变化龙.<br>" ...
- C#读取shp文件并获取图形保存到sde要素类中(不使用ESRI的类库,纯c#实现)
说明:首先要将sde要素类发布成对应的要素服务,通过对要素服务的操作,实现数据在sde要素类中的增删 //向服务器发出请求 public string getPostData(string postS ...
- [ Java面试题 ] 框架篇
1.谈谈你对Struts的理解. 1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionServlet ...
- httpd基础配置和虚拟主机的配置方法
RedHat6.5 httpd实验的大概步骤 #解包 tar zxf httpd-2.2.17.tar.gz -C /usr/src#切换到目录 cd /usr/src/httpd-2.2.17/# ...
- Tornado day1
Tornado 之路由配置 首先导入模块,使用Application方法中可配置多个路由,格式必须为列表中是元组 元组的第一个是配置的url,第二个参数时自定义的类(继承自RequestHandler ...
- Python_Excel文件操作
''' 使用xlrd模块写入Excel文件 ''' import xlrd book=xlrd.open_workbook(r'/Users/c2apple/Desktop/纪录/测试报告/张涛文件盘 ...
- 图灵程序设计丛书(SQL必知必会)笔记
SQL必知必会 第二课:检索数据 1.分页 (1).SQL Server 栗子 : select top 2 columns from tableName (2).Oracle 栗子 :select ...