BZOJ2527[Poi2011]Meteors——整体二分+树状数组
题目描述
这个星球经常会下陨石雨。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 3 2 1 3
10 5 7
3
4 2 4
1 3 1
3 5 2
样例输出
NIE
1
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
vector<int>q[300010];
int n,m,k,x;
ll v[300010];
int ans[300010];
int s[300010];
struct lty
{
int l,r,val;
}a[300010];
int c[300010];
int b[300010];
int now;
void add(int x,int val)
{
for(int i=x;i<=m;i+=i&-i)
{
v[i]+=1ll*val;
}
}
ll ask(int x)
{
ll res=0;
for(int i=x;i;i-=i&-i)
{
res+=v[i];
}
return res;
}
void change(int id,int opt)
{
if(a[id].l<=a[id].r)
{
add(a[id].l,opt*a[id].val);
add(a[id].r+1,-1*opt*a[id].val);
}
else
{
add(1,opt*a[id].val);
add(a[id].r+1,-1*opt*a[id].val);
add(a[id].l,opt*a[id].val);
}
}
void solve(int l,int r,int L,int R)
{
if(L>R)
{
return ;
}
if(l==r)
{
for(int i=L;i<=R;i++)
{
ans[c[i]]=l;
}
return ;
}
int mid=(l+r)>>1;
for(int i=l;i<=mid;i++)
{
change(i,1);
}
int ql=L,qr=R;
for(int i=L;i<=R;i++)
{
ll res=0;
int len=q[c[i]].size();
for(int j=0;j<len;j++)
{
res+=ask(q[c[i]][j]);
if(res>=s[c[i]])
{
break;
}
}
if(res>=s[c[i]])
{
b[ql++]=c[i];
}
else
{
b[qr--]=c[i];
s[c[i]]-=res;
}
}
for(int i=L;i<=R;i++)
{
c[i]=b[i];
}
for(int i=l;i<=mid;i++)
{
change(i,-1);
}
solve(l,mid,L,ql-1),solve(mid+1,r,ql,R);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&x);
q[x].push_back(i);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
c[i]=i;
}
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].val);
}
solve(1,k+1,1,n);
for(int i=1;i<=n;i++)
{
printf(ans[i]>k?"NIE\n":"%d\n",ans[i]);
}
}
还有一种写法就是维护一个指针$now$表示当前加入了第$[1,now]$场的陨石雨,每次二分时移动$now$指针即可,但这样做的话被放在右区间的国家的$k$就不能减掉当次询问的答案了。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
vector<int>q[300010];
int n,m,k,x;
ll v[300010];
int ans[300010];
int s[300010];
struct lty
{
int l,r,val;
}a[300010];
int c[300010];
int b[300010];
int now;
void add(int x,int val)
{
for(int i=x;i<=m;i+=i&-i)
{
v[i]+=1ll*val;
}
}
ll ask(int x)
{
ll res=0;
for(int i=x;i;i-=i&-i)
{
res+=v[i];
}
return res;
}
void change(int id,int opt)
{
if(a[id].l<=a[id].r)
{
add(a[id].l,opt*a[id].val);
add(a[id].r+1,-1*opt*a[id].val);
}
else
{
add(1,opt*a[id].val);
add(a[id].r+1,-1*opt*a[id].val);
add(a[id].l,opt*a[id].val);
}
}
void solve(int l,int r,int L,int R)
{
if(L>R)
{
return ;
}
if(l==r)
{
for(int i=L;i<=R;i++)
{
ans[c[i]]=l;
}
return ;
}
int mid=(l+r)>>1;
while(now<mid)
{
now++;
change(now,1);
}
while(now>mid)
{
change(now,-1);
now--;
}
int ql=L,qr=R;
for(int i=L;i<=R;i++)
{
ll res=0;
int len=q[c[i]].size();
for(int j=0;j<len;j++)
{
res+=ask(q[c[i]][j]);
if(res>=s[c[i]])
{
break;
}
}
if(res>=s[c[i]])
{
b[ql++]=c[i];
}
else
{
b[qr--]=c[i];
}
}
for(int i=L;i<=R;i++)
{
c[i]=b[i];
}
solve(l,mid,L,ql-1),solve(mid+1,r,ql,R);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&x);
q[x].push_back(i);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
c[i]=i;
}
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].val);
}
solve(1,k+1,1,n);
for(int i=1;i<=n;i++)
{
printf(ans[i]>k?"NIE\n":"%d\n",ans[i]);
}
}
BZOJ2527[Poi2011]Meteors——整体二分+树状数组的更多相关文章
- BZOJ2527 [Poi2011]Meteors 整体二分 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)
整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...
- bzoj 2527 Meteors - 整体二分 - 树状数组
Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...
- BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)
题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
随机推荐
- 博弈论入门之nim游戏
更好的阅读体验点这里 nim游戏 nim游戏 有两个顶尖聪明的人在玩游戏,游戏规则是这样的: 有\(n\)堆石子,两个人可以从任意一堆石子中拿任意多个石子(不能不拿),没法拿的人失败.问谁会胜利 ni ...
- 解决VS2017不连接visual studio emulator for android
参考: http://blog.csdn.net/allen_xu5320/article/details/47280457 查出IP 直接ADB连上去
- MongoDB MapReduce用法简介
Map-Reduce部分:Map-Reduce相当于关系型数据库中的group by,主要用于统计数据之用.MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用. 语法 db ...
- 我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
我的博客即将入驻"云栖社区",诚邀技术同仁一同入驻. 博客搬家邀请码NXLZV
- Markdown语法指南
1.背景 个人比较喜欢用Markdonw写东西,比如写博客随笔,写有道云笔记等,但有的时候会突然忘记某个具体语法怎么写了,如插入图片.插入链接.表格等,那干脆把这个语法简单地总结一下,也方便日后快速查 ...
- redis快照持久化和aof日志持久化
持久化就是即使断电/重启需要存储的数据不会丢失,即将数据存储在设备中,一般存在硬盘内 redis的持久化有2种方式 :1-rdb快照 2-aof日志,可以通过配置redis.conf文件进行配置 r ...
- GMM算法的matlab程序
GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...
- C#默认参数原理探究
起因 写这一篇的起因是想要通过新增默认参数来代替以前的方法,结果发现尽管在调用时写起来一样,实际上也没有被当做同样的方法,两个方法大致如下: // 先前的方法-删除 private static st ...
- 使用PlanViz进行ABAP CDS性能分析
如管理学学者彼得·德鲁克所说:你无法管理你不能衡量的东西( If you can't measure it, you can't manage it).要对已有程序进行性能优化,首先要对它的运行状况做 ...
- 黑客游戏榜中榜 第一期writeup
[榜中榜 第一期传送门] 注:作者对游戏过程中右键点击进行了限制,下文所提到的"查看源代码",均通过在url头前加上"view-source:"来实现 第一题 ...