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大的数 ...
随机推荐
- XSS 漏洞介绍
概念: XSS 攻击:跨站脚本攻击 (Cross Site Scripting),为不和层叠样式表 (Cascading Style Sheets, CSS) 的缩写混淆.故将跨站脚本攻击缩写为 XS ...
- 【Dojo 1.x】笔记2 使用服务器环境及使用模块
又开坑了.上次静态html页面完成本地module的引用,算是成功了,但是并不知道是怎么运作的,没关系慢慢来. 我用的环境是VSCode,这次因为官方说要在服务器环境下运行,所以就用上了VSCode的 ...
- 使用 WeihanLi.Npoi 操作 CSV
使用 WeihanLi.Npoi 操作 CSV Intro 最近发现 csv 文件在很多情况下都在使用,而且经过大致了解,csv 格式简单,相比 excel 文件要小很多,读取也很是方便,而且也很通用 ...
- 关于SQL数据库 msdb.dbo.sp_send_dbmail 函数发送邮件的几个实例
在推行系统中,时不时会有用户提出希望系统能自动推送邮件,由于手头的工具和能力有限,不少需求都借助于sql server的邮件触发来实现. 步骤: 1.配置邮箱.步骤略,网上有不少帖子说明,手工直接在管 ...
- c/c++ 头文件的血案
头文件的血案 不小心在一个头文件里,加了函数的定义,结果导致编译时,提示这个函数被重复定义:( Quote.h #ifndef __QUOTE_H__ #define __QUOTE_H__ #inc ...
- Python面试常见的问题
So if you are looking forward to a Python Interview, here are some most probable questions to be ask ...
- Redis其他常用操作
详细Redis操作手册: http://doc.redisfans.com/ ============================================================= ...
- day17-异常处理
今天的内容比较少,只是单独的异常处理 开始今日份整理 1.异常 定义:异常时错误发生的信号,一旦出错,并且程序没有处理这个错误,就会抛出异常,并且程序会运行中止 2.异常的分类 2.1语法错误:pyt ...
- linux-python3.8安装
环境: centos7.5 版本:python3.8 1.依赖包安装 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-deve ...
- Linux:Day13(下) GRUB
GRUB(Boot Loader): grub:GRand Unified Bootloader grub 0.x:grub legacy grub 1.x:grub2 grub legacy: st ...