[NOIP2017]列队(树状数组)
定义第i行为所有的点(i,j),0<j<m
可以发现,每一行是相对独立的,每一次操作只会影响到当前行和最后一列
考虑每一行和最后一列各开一个树状数组,但这样显然会爆空间
实际上,对于没有离队过的点是没必要储存的,可以直接算出编号,
因此只要用vector储存每一行和最后一列后加入的点即可
还需要预处理一个数组d[i]表示第i次询问当前行的离队的点的纵坐标
这个可以离线做出来,然后只需要对最后一列维护一个树状数组即可
Code
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#define ll long long
#define lowbit(x) ((x)&(-x))
#define N 300010
using namespace std; struct info{int p,id;}A[N];
int n,m,qn,mx,d[N],a[N<<1],q[N][2];
vector<info> t[N];
vector<ll>v[N],lst;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void add(int x,int y){for(;x<=mx;x+=lowbit(x))a[x]+=y;}
int Q(int x){
int r=0;for(;x;x-=lowbit(x))r+=a[x];
return r;
} int Find(int R){
int tmp=0;
for(int l=0,r=mx;l<=r;){
int mid=(l+r)>>1;
if(Q(mid)>=R) tmp=mid,r=mid-1;
else l=mid+1;
}
return tmp;
} void Init(){
n=read(),m=read(),qn=read(),mx=max(n,m)+qn;
for(int i=1;i<=qn;++i){
q[i][0]=read(),q[i][1]=read();
if(q[i][1]!=m) t[q[i][0]].push_back((info){q[i][1],i});
}
for(int i=1;i<=mx;++i) add(i,1);
for(int i=1;i<=n;++i){
for(info x:t[i]) add(d[x.id]=Find(x.p),-1);
for(info x:t[i]) add(d[x.id],1);
}
} void solve(){
ll Ans;
for(int i=1;i<=qn;++i){
int x=Find(q[i][0]);
Ans=(x<=n)?(ll)x*m:lst[x-n-1];
add(x,-1);
if(q[i][1]!=m){
v[q[i][0]].push_back(Ans);
Ans=(d[i]<m)?(q[i][0]-1)*1ll*m+d[i]:v[q[i][0]][d[i]-m];
}
lst.push_back(Ans);
printf("%lld\n",Ans);
}
} int main(){Init();solve();}
[NOIP2017]列队(树状数组)的更多相关文章
- LOJ P3960 列队 树状数组 vector
https://www.luogu.org/problemnew/show/P3960 树状数组预处理之后直接搞就可以了,也不是很好解释,反正就是一个模拟过程的暴力用树状数组维护,还挺巧妙的. 我为什 ...
- 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay
正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...
- [UOJ#334][NOIP2017]列队 平衡树/线段树/树状数组
题目链接 题意不说了,一辈子也忘不掉 解法1.平衡树 这题就是平衡树裸题,每一行开一棵维护前 \(m-1\) 个,最后一列单独维护,因为很多人没有用到,所以平衡树每个节点是一个区间(pair),分裂时 ...
- NOIP 2017 列队 - Splay - 树状数组
题目传送门 传送点I 传送点II 题目大意 (家喻户晓的题目应该不需要大意) (我之前咋把NOIP 2017打成了NOIP 2018,好绝望) Solution 1 Splay 每行一颗Splay,没 ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- bzoj1878--离线+树状数组
这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
随机推荐
- Prototype Pattern
- C#图解教程读书笔记(第6章 类进阶)
类成员声明语句由下列部分组成:核心声明.一组可选的修饰符和一组可选的特性(attribute). [特性] [修饰符] 核心声明 修饰符: 如果有修饰符,必须放在核心声明之前. 如果有多个修饰符,要有 ...
- 使用Android Studio和Gradle编译NDK项目之Experimental Plugin User Guide
转载自:http://tools.android.com/tech-docs/new-build-system/gradle-experimental Introduction The new exp ...
- Avito Cool Challenge 2018 B. Farewell Party 【YY】
传送门:http://codeforces.com/contest/1081/problem/B B. Farewell Party time limit per test 1 second memo ...
- CMD命令不完全版
cmd命令: 感谢GSC大佬提供命令 clearmgr : 清理垃圾 taskmgr : 任务管理器 eventvwr : 事件管理器 shutdown -s -t 10 : 关机 shutdown ...
- ethereumjs/ethereumjs-account-1-简介和API
https://github.com/ethereumjs/ethereumjs-account Encoding, decoding and validation of Ethereum's Acc ...
- 学习openGL一——配置环境
openGL支持很多语言,C#, Java, Python, 和Lua.如果你没有使用C/C++,你必须下载和安装一个openGL包或库. 如果你使用了C/C++,你必须先建立一个编译环境,visua ...
- Java JVM技术
.1. java监控工具使用 .1.1. jconsole jconsole是一种集成了上面所有命令功能的可视化工具,可以分析jvm的内存使用情况和线程等信息. 启动jconsole 通 ...
- iOS多语言设置
最近公司做的项目需要向国外推广,因此app需要添加相应的语言设置,为此整理记录下多语言设置的过程.如有不对的地方,欢迎各位大神指正.下面就详细介绍下设置的过程: 1.基本设置 第一步:首先在 项目工程 ...
- 大专生自学iOS到找到工作的前前后后
先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...