【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
3 5
1 3 2 1 3
10 5 7
3
4 2 4
1 3 1
3 5 2
Sample Output
3
NIE
1
将所有国家的答案一起二分,树状数组维护修改操作。另,可以在最后多加一个操作K以方便判NIE。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define LL long long
using namespace std;
const int N=3e5+;
const int inf=0x3f3f3f3f;
int n,m,K,now,op;
int num[N],Li[N],Ri[N],Ai[N],id[N],tmp[N],ans[N];
LL sum,tr[N];
bool f[N];
vector<int> nation[N];
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int lowbit(int x){return x&(-x);}
void add(int x,LL c){while(x<=m)tr[x]+=c,x+=lowbit(x);}
LL query(int x){LL ans=;while(x)ans+=tr[x],x-=lowbit(x);return ans;}
void update(int id,int f)
{
if(Li[id]<=Ri[id])add(Li[id],Ai[id]*f),add(Ri[id]+,-Ai[id]*f);
else add(,Ai[id]*f),add(Ri[id]+,-Ai[id]*f),add(Li[id],Ai[id]*f);
}
void work(int ql,int qr,int L,int R)
{
if(ql>qr)return;
if(L==R){for(int i=ql;i<=qr;i++)ans[id[i]]=L;return;}
int h1=ql,h2=ql,mid=(L+R)>>;
while(op<mid)op++,update(op,);
while(op>mid)update(op,-),op--;
for(int i=ql;i<=qr;i++)
{
sum=;now=id[i];
for(int j=;j<nation[now].size();j++)
{
sum+=query(nation[now][j]);
if(sum>=num[now])break;
}
if(sum>=num[now])f[now]=true,h2++;
else f[now]=false;
}
for(int i=ql;i<=qr;i++)
if(f[id[i]])tmp[h1++]=id[i];
else tmp[h2++]=id[i];
for(int i=ql;i<=qr;i++)id[i]=tmp[i];
work(ql,h1-,L,mid);work(h1,qr,mid+,R);
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++)now=read(),nation[now].push_back(i);
for(int i=;i<=n;i++)num[i]=read(),id[i]=i;
K=read();K++;Li[K]=;Ri[K]=m;Ai[K]=inf;
for(int i=;i<K;i++)Li[i]=read(),Ri[i]=read(),Ai[i]=read();
work(,n,,K);
for(int i=;i<=n;i++)
if(ans[i]==K)printf("NIE\n");
else printf("%d\n",ans[i]);
return ;
}
【bzoj 2527】[Poi2011]Meteors的更多相关文章
- 【BZOJ2527】[Poi2011]Meteors 整体二分
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- 【bzoj2527】[Poi2011]Meteors(树状数组(单点查询,区间修改)+整体二分)
[bzoj2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路
首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
- LCA 【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego
[bzoj 4281] [ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点. ...
- 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...
- 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3940 Solved: 1736 Description ...
- 【BZOJ 2132】圈地计划 && 【7.22Test】计划
两种版本的题面 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土 ...
随机推荐
- pandas to_excel
报错:IllegalCharacterError 其原因是字段中包含了unicode字符. 解决方案: # 首先,安装python包xlsxwriter pip install xlsxwriter ...
- 整车CAN网络介绍
CAN(Controller Area Network)控制器局域网络,CAN网络在早期的整车应用中以BCM(车身控制器)为控制中心,主要是车身零部件(雨刮/大灯/车窗…),智能硬件较少,所以早期的正 ...
- 源码分析-AutoCloseable
AutoCloseable 该接口用于try-with-resources语法糖提供支持,用于自动关闭资源作用 类型:接口 方法:close(); 详解: close():用于自动关闭资源的时候需要进 ...
- 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)
链接:https://ac.nowcoder.com/acm/contest/392/F来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536K ...
- Listener监听器和Filter过滤器
Listener监听器 WEB中的监听器 WEB 中的 Listener 和 Filter 是属于 Servlet 规范中的高级的技术.WEB中的监听器共有三类八种(监听三个域对象)* 事件源:Ser ...
- css 选择其父元素下的某个元素
一,选择器 :first-child p:first-child(first第一个 child子元素)(找第一个子元素为p) :last-child p:last-child(last倒数 ...
- haploview出现“results file must contain a snp column”的解决方法
将plink文件用“--recode HV ”的参数生成即可 /software/plink --file yourfile --recode HV --snps-only just-acgt --o ...
- angularjs的一些问题
1.如果页面报不支持写法的错,请查看是否引用了跨js定义的常量.逐步排错. 2.后台返回json要导入如下依赖: <dependency> <groupId>net.sf.js ...
- 如何自学 Android 的?
http://android.jobbole.com/83380/ 1. Java知识储备 本知识点不做重点讲解:对于有基础的同学推荐看<Java编程思想>,巩固基础,查漏补全,了解并熟悉 ...
- JavaScript的函数声明与函数表达式的区别
1)函数声明(Function Declaration); // 函数声明 function funDeclaration(type){ return type==="Declaration ...