[POI2011]MET-Meteors(整体二分+树状数组)
题意
给定一个环,每个节点有一个所属国家,k次事件,每次对[l,r]区间上的每个点点权加上一个值,求每个国家最早多少次操作之后所有点的点权和能达到一个值
题解
一个一个国家算会T。
这题要用整体二分。我们二分mid给所有国家判断。把可以满足条件的国家放在左边,把所有不满足的国家放在右边。然后继续递归。
本题要求区间加减单点查询。所以套树状数组维护。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const long long N=;
const long long INF=1e9+;
vector<long long> belong[N];
long long c[N];
long long n,m,target[N],con[N],ls[N],rs[N],val[N],ans[N],k;
long long now,LL[N],RR[N],sum[N];
long long lowbit(long long x){
return x&-x;
}
void add(long long x,long long w){
for(long long i=x;i<=m;i+=lowbit(i)){
c[i]+=w;
}
}
long long check(long long x){
long long tmp=;
for(long long i=x;i>=;i-=lowbit(i)){
tmp+=c[i];
}
return tmp;
}
void change(long long l,long long r,long long w){
if(l<=r){
add(l,w);add(r+,-w);
}
else {
add(l,w);add(m+,-w);
add(,w);add(r+,-w);
}
}
void query(long long l,long long r,long long L,long long R){
if(l>r)return ;
if(L>R)return ;
if(l==r){
for(long long i=L;i<=R;i++){
ans[con[i]]=l;
}
return;
}
long long mid=l+r>>;
while(now<mid){
now++;
change(ls[now],rs[now],val[now]);
}
while(now>mid){
change(ls[now],rs[now],-val[now]);
now--;
}
for(long long i=L;i<=R;i++){
sum[con[i]]=;
for(long long j=;j<belong[con[i]].size();j++){
sum[con[i]]+=check(belong[con[i]][j]);
if(sum[con[i]]>target[con[i]])break;
}
}
long long rcnt=;long long lcnt=;
for(long long i=L;i<=R;i++){
if(sum[con[i]]>=target[con[i]])LL[++lcnt]=con[i];
else RR[++rcnt]=con[i];
}
for(long long i=;i<=lcnt;i++)con[i+L-]=LL[i];
for(long long i=;i<=rcnt;i++)con[i+L-+lcnt]=RR[i];
query(l,mid,L,L+lcnt-);
query(mid+,r,L+lcnt,R);
}
int main(){
scanf("%lld%lld",&n,&m);
for(long long i=;i<=m;i++){
long long a;
scanf("%lld",&a);
belong[a].push_back(i);
}
for(long long i=;i<=n;i++){
scanf("%lld",&target[i]);
con[i]=i;
}
scanf("%lld",&k);
for(long long i=;i<=k;i++){
scanf("%lld%lld%lld",&ls[i],&rs[i],&val[i]);
}
k++;
ls[k]=;rs[k]=m;val[k]=INF;
now=;
query(,k,,n);
for(long long i=;i<=n;i++){
if(ans[i]==k)printf("NIE\n");
else printf("%lld\n",ans[i]);
}
return ;
}
[POI2011]MET-Meteors(整体二分+树状数组)的更多相关文章
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- 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 Meteors - 整体二分 - 树状数组
Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...
- 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大的数 ...
随机推荐
- ikbc 时光机 F87 Ctrl 失灵 解决办法
多按几次Fn+PrtSc,直至按键无错位.
- 消息总线VS消息队列
前段时间实现了一个基于RabbitMQ的消息总线,实现的过程中自己也在不断得思考.总结以及修正.需要考虑各个维度:效率.性能.网络.吞吐量.甚至需要自己去设想API可能的使用场景.模式.不过能有一件事 ...
- [AHOI2013]作业 莫队 树状数组
#include<cmath> #include<cstdio> #include<algorithm> #include<string> #inclu ...
- 路飞学城Python-Day1
1.什么是编程?编程就是写代码,代码是计算机理解的语言,编程就是通过计算机理解的语言实现一些事件,计算机能理解的就是二进制,就是0和1的两个值计算机底层是电路,如何表达0和1?就像灯只能表示开灯和关灯 ...
- NOIp模拟赛二十九
又是受虐的一天呢~接下来四天都要打模拟赛QAQ 今日分数:0(100)+100+0=100 A题O(读入)结论题判断结果时没return 0被subtask卡成0分,喜提fstQAQ,B题DP,C题不 ...
- [洛谷P2370]yyy2015c01的U盘
题目大意:有n个文件,每个文件有一个大小和价值,有一个容量为s的U盘,要装这些文件.传输文件需要接口,一个大小为k的接口能传输的最大文件的大小为k.问最少要多大的接口,才能使传输的文件价值$\ge p ...
- /etc/rc.d/rc.sysinit
[root@web02 ~]# ls /etc/rc.d/rc.sysinit /etc/rc.d/rc.sysinit [root@web02 ~]# [root@web02 ~]# ls /etc ...
- Linux快速入门打开你的学习之道
Linux快速入门打开你的学习之道 相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我们就可以一起探讨一下,学习Linux如何快速入门呢? 首先,希望大家弄清楚自己为什 ...
- malloc 和free例程
#include <stdio.h>#include <stdlib.h>int main(){int a;scanf("%d",&a);int * ...
- pandas 7 合并 merge 水平合并,数据会变宽
pd.merge( df1, df2, on=['key1', 'key2'], left_index=True, right_index=True, how=['left', 'right', 'o ...