Meteors

Time Limit: 60 Sec  Memory Limit: 128 MB
[Submit][Status][Discuss]

Description

  这个星球经常会下陨石雨。BIU已经预测了接下来K场陨石雨的情况。
  BIU的第i个成员国希望能够收集Pi单位的陨石样本。你的任务是判断对于每个国家,它需要在第几次陨石雨之后,才能收集足够的陨石。

Input

  第一行是两个数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单位的陨石样本。

Output

  输出N行。第i行的数Wi表示第i个国家在第Wi波陨石雨之后能够收集到足够的陨石样本。如果到第K波结束后仍然收集不到,输出NIE。

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

HINT

   1<=n,m,k<=3*10^5 , 1<=Ai,Pi<=10^9

Main idea

  每个国家有一个需要价值,一个国家可以控制多个点,定义国家已经获得的价值为每个控制点上的价值和,每次操作可以将一段区间上每个点都加上一个价值,问每个国家在第几个操作时达到了需要价值,若达不到则输出NIE。

Solution

  我们先从二分层面去考虑,对于一个点来说,可以二分答案来求解,那么我们就可以利用整体二分。

  整体二分,就是我们将所有的询问一起来做,然后二分操作区间L,R,执行L,MID的部分,

  然后判断询问是否可行,如果可行,将这个询问放到左边区间,否则加上左边的价值再把这个询问放到右区间。然后继续递归操作区间。

  对于这道题来说,由于一个国家可以控制多个点,我们用链表来存,然后用Bit来判断是否可行。

  这样就解决了这道题\(≧▽≦)/。

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<map>
using namespace std; typedef long long s64; const int ONE=;
const int INF=; int n,m,k;
int x;
int next[ONE],first[ONE],go[ONE],tot;
int Ans[ONE]; struct power
{
int need;
int id;
}a[ONE],qL[ONE],qR[ONE]; struct opera
{
int l,r;
int val;
}oper[ONE]; int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} void Add(int u,int v)
{
next[++tot]=first[u]; first[u]=tot; go[tot]=v;
} namespace Bit
{
struct power
{
s64 value;
}Node[ONE]; int lowbit(int i)
{
return i&-i;
} void Update(int R,int x)
{
for(int i=R;i<=m;i+=lowbit(i))
Node[i].value+=x;
} s64 Query(int R)
{
s64 res=;
for(int i=R;i>=;i-=lowbit(i))
res+=Node[i].value;
return res;
}
} void Update(int l,int r,int val)
{
if(l>r)
{
Bit::Update(l,val); Bit::Update(m+,-val);
Bit::Update(,val); Bit::Update(r+,-val);
}
else
{
Bit::Update(l,val); Bit::Update(r+,-val);
}
} void Solve(int l,int r,int L,int R)//l,r 询问;L,R 操作
{
if(l>r) return;
if(L==R)
{
for(int i=l;i<=r;i++)
Ans[a[i].id] = L;
return;
} int M=(L+R)>>;
for(int i=L;i<=M;i++)
Update(oper[i].l, oper[i].r, oper[i].val); int l_num=,r_num=;
for(int i=l;i<=r;i++) //判断询问在哪个区间
{
s64 sum=;
for(int e=first[a[i].id];e;e=next[e])
{
sum+=Bit::Query(go[e]);
if(sum>=a[i].need) break;
} if(sum>=a[i].need)
{
qL[++l_num]=a[i];
}
else
{
qR[++r_num]=a[i];
qR[r_num].need-=sum;
}
}
int t=l;
for(int i=;i<=l_num;i++) a[t++]=qL[i];
for(int i=;i<=r_num;i++) a[t++]=qR[i]; for(int i=L;i<=M;i++)
Update(oper[i].l, oper[i].r, -oper[i].val); Solve(l,l+l_num-,L,M);
Solve(l+l_num,r,M+,R);
} int main()
{
n=get(); m=get();
for(int i=;i<=m;i++) {x=get(); Add(x,i);}
for(int i=;i<=n;i++)
{
a[i].need=get();
a[i].id=i;
} k=get();
for(int i=;i<=k;i++)
{
oper[i].l=get(); oper[i].r=get(); oper[i].val=get();
} Solve(,n,,k+); for(int i=;i<=n;i++)
{
if(Ans[i] > k) printf("NIE");
else printf("%d",Ans[i]);
printf("\n");
}
}

【BZOJ2527】【POI2011】Meteors [整体二分]的更多相关文章

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

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

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

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

  3. BZOJ2527: [Poi2011]Meteors(整体二分)

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

  4. 【BZOJ2527】[Poi2011]Meteors 整体二分

    [BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...

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

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

  6. [bzoj2527][Poi2011]Meteors_整体二分_树状数组

    Meteors bzoj-2527 Poi-2011 题目大意:题目链接. 注释:略. 想法: 首先答案可以离线,且具有单调性. 这里的单调性就是随着时间的推移,每个国家收集的陨石数增加. 不难想到整 ...

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

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

  8. 2527: [Poi2011]Meteors[整体二分]

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1528  Solved: 556 [Submit][S ...

  9. bzoj 2527: [Poi2011]Meteors 整体二分

    给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...

  10. Luogu3527 POI2011 Meteors 整体二分、树状数组、差分

    传送门 比较板子的整体二分题目,时限有点紧注意常数 整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([m ...

随机推荐

  1. Python的异常

    一.异常的常用形式 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行.一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Pyth ...

  2. 29、phonegap入门

    0. PhoneGap介绍 0.1  什么是PhoneGap? PhoneGap是一个基于HTML.CSS.JS创建跨平台移动应程序的快速开发平台.与传统Web应用不同的是,它使开发者能够利用iPho ...

  3. Python 3 学习笔记之——数据类型

    1. 数字 类型 int, float, bool, complex type() 查看变量类型 isinstance(a, int) 查看变量类型 运算符 % 取余 // 返回商的整数部分 ** 幂 ...

  4. Python 3 学习笔记之——键盘输入和读写文件

    1. 键盘输入 Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘.input 可以接收一个 Python 表达式作为输入,并将运算结果返回. str = inp ...

  5. Word2vec之CBOW

    一.Word2vec word2vec是Google与2013年开源推出的一个用于获取word vecter的工具包,利用神经网络为单词寻找一个连续向量看空间中的表示.word2vec是将单词转换为向 ...

  6. winform 控件半透明设置

    1.backcolor属性为color.FromArgb(100, 220, 220, 220); 2.全透明设置为transparent方法.

  7. R6的压力测试

    VersionCode:{102} VersionName:{1.0.2}

  8. elementUI中的el-form怎么使用正则进行验证

    http://element.eleme.io/#/zh-CN/component/form里给出了一个form验证的例子,但是都是使用el-form带有的验证规则,怎么使用自己定义的规则进行验证呢? ...

  9. 解决微信小程序配置https不成功问题

    拿到一个微信小程序的项目,需要配置https安全链接(为什么必须使用https不再赘述),预想这个已经很成熟的流程,应该不会有太大问题,结果还真是出乎意料,竟然掉进一个大坑,折腾好久. 申请证书配置的 ...

  10. 处理大并发量订单处理的 KafKa部署总结

    处理大并发量订单处理的 KafKa部署总结 今天要介绍的是消息中间件KafKa,应该说是一个很牛的中间件吧,背靠Apache 与很多有名的中间件搭配起来用效果更好哦 ,为什么不用RabbitMQ,因为 ...