【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors
Time Limit: 60 Sec Memory Limit: 128 MB
Submit: 831 Solved: 306
[Submit][Status][Discuss]
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
NIE
1
HINT
Source
Solution
整体二分+树状数组
对于每个国家整体二分,记录状态的话,修改利用树状数组足够
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-')f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define maxn 300010
int n,m,K,ans[maxn],id[maxn],ti,tmp[maxn];long long need[maxn];
vector<int>a[maxn];
struct BITNode
{
long long tree[maxn];
int lowbit(int x) {return x&(-x);}
void Add(int x,int val)
{
for (int i=x; i<=m; i+=lowbit(i)) tree[i]+=val;
}
long long query(int x)
{
long long re=;
for (int i=x; i; i-=lowbit(i)) re+=tree[i];
return re;
}
}T;
struct MatNode{int L,R;long long A;}mat[maxn];
void Change(int k,int f)
{
if(mat[k].L<=mat[k].R)
T.Add(mat[k].L,f*mat[k].A),T.Add(mat[k].R+,f*(-mat[k].A));
else
T.Add(,f*mat[k].A),T.Add(mat[k].R+,f*(-mat[k].A)),T.Add(mat[k].L,f*mat[k].A);
}
bool mark[maxn];
void work(int l,int r,int L,int R)
{
if(l>r) return;
if(L==R)
{
for(int i=l; i<=r; i++) ans[id[i]]=L;
return;
}
int mid=(L+R)>>;
while (ti<=mid) ti++,Change(ti,);
while (ti>mid) Change(ti,-),ti--;
int cnt=,now;long long tot;
for(int i=l;i<=r;i++)
{
tot=;now=id[i];
for (int j=; j<a[now].size(); j++)
{
tot+=T.query(a[now][j]);
if(tot>need[now])break;
}
if (tot>=need[now]) mark[now]=,cnt++;
else mark[now]=;
}
int l1=l,l2=l+cnt;
for (int i=l; i<=r; i++)
if(mark[id[i]]) tmp[l1++]=id[i];
else tmp[l2++]=id[i];
for(int i=l; i<=r; i++) id[i]=tmp[i];
work(l,l1-,L,mid); work(l1,l2-,mid+,R);
}
int main()
{
n=read(); m=read();
for (int x,i=; i<=m; i++) x=read(),a[x].push_back(i);
for (int i=; i<=n; i++) need[i]=read();
for (int i=; i<=n; i++) id[i]=i;
K=read();
for (int i=; i<=K; i++)
mat[i].L=read(),mat[i].R=read(),mat[i].A=read();
K++,mat[K].L=,mat[K].R=m,mat[K].A=0x7fffffff;
work(,n,,K);
for (int i=; i<=n; i++)
if (ans[i]!=K) printf("%d\n",ans[i]); else puts("NIE");
return ;
}
【BZOJ-2527】Meteors 整体二分 + 树状数组的更多相关文章
- bzoj 2527 Meteors - 整体二分 - 树状数组
Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
- 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$个太空站排成一个圆 ...
- BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)
整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组
题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...
随机推荐
- oracle小知识总结
1,表列的五种约束 not null, unique,primary key, foreign key, check 2,权限分配 grant 权限 on 表 to 用户 3,表和视图的区别 视图是一 ...
- SQL Server 安装 功能详解
安装 SQL Server 功能 在“功能选择”页上,SQL Server 功能分为以下两个主要部分:实例功能和共享功能. “实例功能”表示为每个实例安装一次的组件,这样,您将具有它们的多个副 ...
- 截取视图某一段另存为部分视图(Partial View)
在做ASP.NET MVC后台管理程序时,根据程序需要,Isus.NET需要实现一个功能,就是动态截取视图某一段另存为部分视图Partial View. 思路为在视图中,使用jQury的程序截图以及P ...
- MyEclipse对Struts2配置文件较检异常 Invalid result location value/parameter
有时在编写struts.xml时会报错,但是找不出有什么她方有问题.也能正常运行 MyEclipse有地方去struts的xml进行了验证,经查找把这里 的build去掉就可以了
- 读“日请求亿级的QQ会员AMS平台PHP7升级实践”博客心得笔记
PHP7版本尚未普及,对于前辈们为了性能提升有勇气探索新技术敢于尝螃蟹的精神十分敬佩,倍受鼓舞. PHP7升级面临的风险和挑战 对于一个已经现网在线的大型公共Web服务来说,基础公共软件升级,通常是一 ...
- Adblock Plus for firefox
关于 Adblock Plus for firefox(以下简称 ABP)的一些笔记. 安装好 ABP,将如下代码保存为 html 文件,然后在 firefox 中打开: <p id=" ...
- Multiprotocol Label Switching (MPLS)
Posted by: Margaret Rouse WhatIs.com Contributor(s): Robert Sturt This definition is part of our E ...
- learning to rank
Learning to Rank入门小结 + 漫谈 Learning to Rank入门小结 Table of Contents 1 前言 2 LTR流程 3 训练数据的获取4 特征抽取 3.1 人工 ...
- matlab 绘制条形图
Matlab使用bar和barh函数来绘制二维条形图.分别是绘制二维垂直条形图和二维水平条形图. 转自:http://jingyan.baidu.com/article/64d05a02524e63d ...
- word2vec使用说明补充(google工具包)
[本文转自http://ir.dlut.edu.cn/NewsShow.aspx?ID=253,感谢原作者] word2vec是一个将单词转换成向量形式的工具.可以把对文本内容的处理简化为向量空间中的 ...