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大的数 ...
随机推荐
- javascript进阶之AJAX
AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ...
- Python使用Plotly绘图工具,绘制水平条形图
水平条形图与绘制柱状图类似,大家可以先看看我之前写的博客,如何绘制柱状图 水平条形图需要在Bar函数中设置orientation= 'h' 其他的参数与柱状图相同.也可以通过设置barmode = ' ...
- js 条件判断
练习 小明身高1.75,体重80.5kg.请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: 低于18.5:过轻 18.5-25:正常 25-28:过重 28-32:肥 ...
- selenium-弹窗操作(八)
本次以笔者公告栏的 打赏 弹窗为例 对弹窗中的一些操作进行封装后,在测试中使用 作用:减少对弹窗反复操作时进行定位的麻烦,以后使用中都直接调用即可达到目的 # coding=utf-8 from se ...
- C# Tostring()方法
在C#中 JArray japroimg = new JArray(); strproimg.ToString();这样会导致tostring之后的字符串中会有大量的空格 使用 japroimg.T ...
- 谈谈你对this对象的理解
理解: 1.this是js 的一个关键字,随着函数的使用场合的不同,this 的值会发生变化. 2.一个总原则:即this指的是调用函数的那个对象. 3.一般情况下,this 是全局对象,可以作为方法 ...
- 重装助手教你如何禁用Windows 10快速启动
快速启动是首先在Windows 8中实现并延续到Windows 10的功能,可在启动PC时提供更快的启动时间.它是一个方便的功能,也是大多数人在不知情的情况下使用的功能,但还有一些功能会在他们掌握新P ...
- Windows系统资源监控
1.windows自带系统资源监控工具 2.Windows监控的数据来源:Performance Counters 2.1 Performance Counter架构 2.2 Performance ...
- SQLServer约束介绍
约束定义 对于数据库来说,基本表的完整性约束分为列级约束条件和表级约束条件: 列级约束条件 列级约束条件是对某一个特定列的约束,包含在列定义中,可以直接跟在该列的其他定义之后,用空格分隔 ...
- 周末班:Python基础之网络编程
一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据, ...