题意

给定一个环,每个节点有一个所属国家,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. xBIM 基础04 日志操作

    系列目录    [已更新最新开发文章,点击查看详细]  xBIM使用Log4Net来记录异常不适合的处理错误和警告.它在xBIM几何引擎中被大量使用来记录所有几何错误.如果您的文件看起来不太正确,则应 ...

  2. mysql导入数据,涉及到时间转换,乱码问题解决

    表结构: drop table if exists `qi_an_log`;CREATE TABLE `qian_log` (`dt` LONG NOT NULL COMMENT '产生日期,格式yy ...

  3. Dispatch Groups

    Dispatch Groups are objects that allow several tasks to be grouped for later joining. Tasks can be a ...

  4. ORACLE查询优化之is null和is not null优化

    最近工作的时候遇到了比较大的数据查询,自己的sql在数据量小的时候没问题,在数据量达到300W的时候特别慢,只有自己优化sql了,以前没有优化过,所以记录下来自己的优化过程,本次是关于is null和 ...

  5. js的onclick和jq的click以及on和bind的区别

    onclick和click,只能静态绑定点击事件:bind的可以一次绑定多个事件(click/onmouseover等):on可以动态的绑定事件,当页面加载完成调用on即可

  6. (WC2018模拟十二)【FJOI2016集训Day7T2】点对游戏

    题解: 还好...看懂题目就好做了.(Orzdyh) 首先选择的点是等概率随机的,也就是说每种选择结果的概率都是一样的,所以选择一个点的时候已经选择的点不会有影响,那么就可以直接算出点对个数再求总体的 ...

  7. sql 技巧

    1.想把一张表的 某个字段或多个字段 的 所有数据 复制到另外一张表里  insert into 表名(字段) select (字段) from 表名 2.from Users u , IN(u.ro ...

  8. 平衡二叉树(AVLTREE,双链表实现)

    首先说下好久没更新了,最近打游戏和工作都有点多,o(^▽^)o. 写这个AVL发现自己的代码风格好差,尤其是变量命名这块,后来意识到了,想去改,但是太多了,改了几个就不想改了,做这个是记录下自己的成长 ...

  9. 四则运算1 java+jsp+SQLServer

    1,设计思想(1)在java resourse里定义包和类 (2)在类里定义生成算式,并将算式保存在数据库中的方法 (3)在jsp文件中调用java方法 2,源程序代码 生成算式的方法 public ...

  10. python基础7(函数 Ⅱ)

    1.python代码运行遇到函数时 从python解释器开始执行之后,就在内存中开辟了一个空间 每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来. 但是当遇到函数定义的时候解释器只是象征性 ...