+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

https://www.luogu.org/problemnew/show/3527

http://www.lydsy.com/JudgeOnline/problem.php?id=2527

(事先说明,本人是开O2过的洛谷,如果不开的话请用数组模拟STL)

(代码和题解参考洛谷的题解第一篇)

(采用BZOJ翻译)

Byteotian Interstellar Union有N个成员国。现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站。这个星球经常会下陨石雨。
BIU已经预测了接下来K场陨石雨的情况。BIU的第i个成员国希望能够收集Pi单位的陨石样本。你的任务是判断对于每个国家,它需要在第几次陨石雨之后,才能收集足够的陨石。
输入:
第一行是两个数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单位的陨石样本。
输出:
N行。第i行的数Wi表示第i个国家在第Wi波陨石雨之后能够收集到足够的陨石样本。如果到第K波结束后仍然收集不到,输出NIE。
数据范围: 
1<=n,m,k<=3*10^5 1<=Pi<=10^9 1<=Ai<10^9

显然是一道维护区间的题,如果不考虑用什么奇葩难写的数据结构的话,还是整体二分+树状数组好些。

……但是一旦会了整体二分之后不就是水题了吗……

我们二分每个成员国最少需要多少波操作会到达他们的预定值,剩下的就是套路了。

不过需要注意这题可能爆longlong,开longlong的同时记的判断并及时跳出。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=;
inline ll read(){
ll X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct question{
int l,r,op,id;
ll k;
}q[N],tmp1[N],tmp2[N];
vector<int>g[N];
int ans[N],aim[N];
ll tree[N];
int n,m,p;
inline int lowbit(int t){return t&(-t);}
inline void add(int x,ll y){//将a[x]+y
for(int i=x;i<=m;i+=lowbit(i))tree[i]+=y;
}
inline ll query(int x){//1-x区间和
ll res=;
for(int i=x;i>;i-=lowbit(i))res+=tree[i];
return res;
}
inline void modify(ll x,ll y,ll z){
add(x,z);add(y+,-z);
}
void solve(int L,int R,int l,int r){
if(L>R)return;
if(l==r){
for(int i=L;i<=R;i++){
if(q[i].op==)ans[q[i].id]=l;
}
return;
}
int idx1=,idx2=,mid=(l+r)>>;
for(int i=L;i<=R;i++){
if(q[i].op==){
ll tmp=;
for(int j=;j<g[q[i].id].size();j++){
tmp+=query(g[q[i].id][j]);
if(tmp>q[i].k)break;
}
if(tmp>=q[i].k)tmp1[idx1++]=q[i];
else{q[i].k-=tmp;tmp2[idx2++]=q[i];}
}else{
if(q[i].id<=mid){
if(q[i].op==)modify(q[i].l,q[i].r,q[i].k);
else modify(q[i].l,m,q[i].k),modify(,q[i].r,q[i].k);
tmp1[idx1++]=q[i];
}else tmp2[idx2++]=q[i];
}
}
for(int i=;i<idx1;i++){
question k=tmp1[i];
if(k.op==)modify(k.l,k.r,-k.k);
else if(k.op==)modify(k.l,m,-k.k),modify(,k.r,-k.k);
}
bool ok1=,ok2=;
int MID=L+idx1;
for(int i=L;i<MID;i++)q[i]=tmp1[i-L],ok1=;
for(int i=MID;i<=R;i++)q[i]=tmp2[i-MID],ok2=;
if(ok1)solve(L,MID-,l,mid);
if(ok2)solve(MID,R,mid+,r);
return;
}
int main(){
n=read(),m=read();
for(int i=;i<=m;i++)g[read()].push_back(i);
for(int i=;i<=n;i++)aim[i]=read();
p=read();
for(int i=;i<=p;i++){
q[i].l=read();q[i].r=read();q[i].k=read();
if(q[i].r>=q[i].l)q[i].op=;
else q[i].op=;
q[i].id=i;
}
for(int i=;i<=n;i++){
q[i+p].k=aim[i];q[i+p].op=;q[i+p].id=i;
}
solve(,n+p,,p+);
for(int i=;i<=n;i++){
if(ans[i]!=p+)printf("%d\n",ans[i]);
else puts("NIE");
}
return ;
}

BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解的更多相关文章

  1. 洛谷 P3518 [POI2011] SEJ-Strongbox 题解

    思路: 首先先将每个输入的数据与n的最大公约数求出(因为如果a[i]是密码,那么所有a[i]与n最大公约数的倍数也是密码:于是如果a[i]不是密码,那么所有a[i]与n最大公约数的倍数也都不是密码)再 ...

  2. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  3. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  4. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  5. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  6. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  7. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  8. 洛谷P3513 [POI2011]KON-Conspiracy

    洛谷P3513 [POI2011]KON-Conspiracy 题目描述 Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动. 国王需要选一些人来进行这场运动,而这些人被分为 ...

  9. [洛谷P3527] [POI2011]MET-Meteors

    洛谷题目链接:[POI2011]MET-Meteors 题意翻译 Byteotian Interstellar Union有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1 ...

随机推荐

  1. 全局脚手架了解一下【fle-cli】

    本文来自网易云社区 介绍 fle-cli旨在帮助我们从复杂繁琐的编译配置中解放出来,全身心地投入业务开发中,提高开发效率. 它是真正意义上的全局脚手架,区别于市面上其他的全局脚手架,它不会在项目工程中 ...

  2. unity面试题二

    1.以下哪一个选项不属于Unity引擎所支持的视频格式文件(D) A.后缀为mov的文件 B.后缀为mpg的文件 C.后缀为avi的文件 D.后缀为swf的文件 2.Unity引擎使用的是左手坐标系还 ...

  3. The 2018 ACM-ICPC Asia Qingdao Regional Contest K XOR Clique

    K XOR Clique BaoBao has a sequence a​1​​,a​2​​,...,a​n​​. He would like to find a subset S of {1,2,. ...

  4. WEB安全--高级sql注入,爆错注入,布尔盲注,时间盲注

    1.爆错注入 什么情况想能使用报错注入------------页面返回连接错误信息 常用函数 updatexml()if...floorextractvalue updatexml(,concat() ...

  5. JVM监控远程服务器

    1. 首先配置服务器端,进入服务器tomcat的bin目录下,打开catalina.sh配置文件,xxx为服务器配置路径. # cd /xxx/apache-tomcat-/bin # vim cat ...

  6. python基础之变量和简单数据类型

    1.1 变量的命名和使用规范 变量名可以包含数字.字母.下划线,但是不能以数字开头. 变量名不能包含空格,可使用下划线来分割其中的单词. 不要将Python关键字和函数名用作变量名. 变量名应既简短又 ...

  7. lintcode204 单例

    单例   单例 是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例.例如,对于 class Mouse (不是动物的mouse哦),我们应 ...

  8. 【python 3.6】从网站抓图并存放到本地路径

    #!/usr/bin/python # -*- coding: UTF-8 -*- _author_ = 'BH8ANK' import urllib.request import re import ...

  9. 1.EOS源码编译运行

    目前网络上都是针对老版EOS2.0源码编译的文章,我在mac上参考这些文章编译,最后发现根本就不对,最新版本只需一条命令(./eosio_build.sh,依赖库会自动安装的)即可.我根据这些文章手动 ...

  10. 一个改变this指向bind的函数,vue源代码

    function bind(fn, ctx) { return function (a) { var l = arguments.length; return l ? l > 1 ? fn.ap ...