题意

给定一个环,每个节点有一个所属国家,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(整体二分+树状数组)的更多相关文章

  1. 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

    题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...

  2. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  3. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

  4. BZOJ2527 [Poi2011]Meteors 整体二分 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...

  5. bzoj 2527 Meteors - 整体二分 - 树状数组

    Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...

  6. BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)

    整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...

  7. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  8. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  9. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

随机推荐

  1. C# 位域[flags]

    .NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,例如: [Flags]   enu ...

  2. POJ 2431 Expedition (priority_queue或者multiset可解)

    Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18655   Accepted: 5405 Descr ...

  3. web监控脚本

    #!/bin/bashvalues=`curl -H 'Cache-Control: no-cache' -k -s -m 10 --connect-timeout 10 "$1" ...

  4. RocketMQ学习笔记(1)----RocketMQ的简介

    1. 什么是RocketMQ? 是一个队列模型的消息中间件,具有高性能.高可靠.高实时.分布式特点. Producer.Consumer.队列都可以分布式.  Producer 吐一些队列轮流収送消息 ...

  5. centos安装nvidia驱动

    大部分 Linux 发行版都使用开源的显卡驱动 nouveau,对于 nvidia 显卡来说,还是闭源的官方驱动的效果更好.最明显的一点是,在使用 SAC 拾取震相的时候,使用官方显卡驱动在刷新界面的 ...

  6. Mint-UI 没有样式?

    如果用mint-ui组件,如toast没有样式,是因为没有映入全局样式和导入MintUI 方法如下: 1.安装 npm install mint-ui -S -S表示 --save 2.在main.j ...

  7. Python学习笔记(二):字符串类型

    在上一篇随笔(https://www.cnblogs.com/g-qiang/p/10448813.html)中,说到 Python 有六种标准数据类型,而数字类型和字符串类型又是其中基本的数据类型. ...

  8. Qt之自定义布局管理器(QCardLayout)

    简述 手动布局另一种方法是通过继承QLayout类编写自己的布局管理器. 下面我们详细来举一个例子-QCardLayout.它由同名的Java布局管理器启发而来.也被称之为卡片布局,每个项目偏移QLa ...

  9. cocos2dx 触摸钢琴

    1.触摸钢琴项目描写叙述 1.1触摸钢琴功能描写叙述 实现手指点按琴键发出相应的音调,按下位置出现星云的粒子特效,滚动实现移动到别的琴键的位置,按下安卓返回键运行关闭. 1.2触摸钢琴所需技术 粒子特 ...

  10. USACO 1.2 Palindromic Squares (进制转换,回文)

    /* ID:twd30651 PROG:palsquare LANG:C++ */ #include<iostream> #include<fstream> #include& ...