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. Bug是一种财富-------研发同学的错题集、测试同学的遗漏用例集

    此文已由作者王晓明授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 各位看官,可能看到标题的你一定认为这是一篇涉嫌"炒作"的文章,亦或是为了吸引眼球而起的标 ...

  2. 基于jersey和Apache Tomcat构建Restful Web服务(二)

    基于jersey和Apache Tomcat构建Restful Web服务(二) 上篇博客介绍了REST以及Jersey并使用其搭建了一个简单的“Hello World”,那么本次呢,再来点有趣的东西 ...

  3. springmvc基础篇—修改默认的配置文件名称及位置

    springmvc的默认配置文件是放在WEB-INF下的,叫action-servlet.xml.根据咱们编程的习惯,一般都将配置文件放到src的根目录下,那么如何将这个文件迁移过来呢?其实很简单,请 ...

  4. python+UIAutomation+libary

    #! /usr/bin/env python#Author: XIE TIAN# -*- coding:utf8 -*-from __future__ import unicode_literalsi ...

  5. MySQL☞order by与distinct

    asc(升序,默认值)/desc(降序) 1.根据某一列的列值进行升序或者降序操作. select  列名 别名 from 表名 order by 列名 asc/desc 2.根据多个列值进行排序 s ...

  6. 关键词提取TF-IDF算法/关键字提取之TF-IDF算法

    TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与信息探勘的常用加权技术.TF的意思是词频(Term - frequency),  ...

  7. Visual Studio 2005安装包

    点击下载

  8. PyQt5图像全屏显示

    Windows装这个:https://pypi.python.org/pypi/PyQt5Ubuntu输入这个:sudo apt-get install python3-pyqt5 或者直接输入:pi ...

  9. Struts2—整合Spring

    Struts2—整合Spring Spring框架是一个非常优秀的轻量级java EE容器,大部分javaEE应用,都会考虑使用Spring容器来管理应用中的组件. Struts2是一个MVC框架,是 ...

  10. tomcat中配置JNDI方法

    1.项目中spring的数据源配置: <bean id="dataSource" class="org.springframework.jndi.JndiObjec ...