数据结构题还是挺好玩的

注意到每次只变动三个点:(x,y),(x,m),(n,m),其他地方都是整块移动。

可以开n+1个线段树,前n个存每行前m-1个人,最后一个存第m列的人。

(x,y)位置的人出列时,抽出该位置的标号,加到第n+1个线段树的最后面去,抽出第n+1个线段树的第x个元素(即(x,m),加到第x个线段树的最后面去。

↑实现这一操作,可以记线段树的size,每次二分查询树上第k个元素即可确定位置。

↑当然树不可能全建出来,需要动态开点。尚未申请的结点,size直接用$ r-l+1 $计算。

写到一半想到不需要专门抽出来,只需要记录该行到该位置为止抽出过a个数,找(x,y)时实际找(x,y+a)即可。可以开个vector什么的存新加到队伍最右边的人。

这样的话更加方便&优美,而且可以用树状数组写,代码量也减小了。

但是看着自己写了一大半的代码不舍得丢,还是强行按原计划敲完了。

————

老年退役选手连NOIP题都做不来了。做这题成功遇到了数组开小,变量写混,初始化错误,输出错误等等问题,调了好久。

不开心QAQ

————

 #include<iostream>
#include<cstdio>
#define LL long long
using namespace std;
const int mxn=;
struct node{
int sz,lc,rc;
LL mk;
}t[mxn<<];
int cnt=,mod=;
int root[mxn];
int n,N,m,Q;
inline int getsz(int l,int r,int rt){
if(rt)return t[rt].sz;
return r-l+;
}
void pushup(int l,int r,int rt){
int tmp=;
int mid=(l+r)>>;
tmp+=getsz(l,mid,t[rt].lc);
tmp+=getsz(mid+,r,t[rt].rc);
t[rt].sz=tmp;
return;
}
int anspos;
int query(int k,int l,int r,int &rt){
if(!rt){
rt=++cnt;
t[rt].sz=r-l+;
}
if(l==r){
if(!t[rt].mk){//计算标号
if(mod==n+)t[rt].mk=(LL)l*m;
else t[rt].mk=(LL)(mod-)*m+l;
}
anspos=l;
return rt;
}
int mid=(l+r)>>,tmp=getsz(l,mid,t[rt].lc);
if(k<=tmp)
return query(k,l,mid,t[rt].lc);
else return query(k-tmp,mid+,r,t[rt].rc);
}
void update(LL v,int p,int l,int r,int &rt){
if(!rt){
rt=++cnt;
t[rt].sz=r-l+;
}
if(l==r){
t[rt].mk=v;
if(!v){//del
t[rt].sz=;
}
else t[rt].sz=;
return;
}
int mid=(l+r)>>;
if(p<=mid)update(v,p,l,mid,t[rt].lc);
else update(v,p,mid+,r,t[rt].rc);
pushup(l,r,rt);
return;
}
void info(int l,int r,int rt){
printf(" %d %d rt:%d sz:%d\n",l,r,rt,getsz(l,r,rt));
if(!rt)return;
if(l==r)return;
int mid=(l+r)>>;
info(l,mid,t[rt].lc);
info(mid+,r,t[rt].rc);
return;
}
int main(){
// freopen("2017phalanx.in","r",stdin);
// freopen("2017phalanx.out","w",stdout);
int i,j,x,y,tmp;
LL tmp2;
scanf("%d%d%d",&n,&m,&Q);
N=max(max(n,m),Q)<<;
while(Q--){
scanf("%d%d",&x,&y);
if(y==m){
mod=n+;
tmp=query(x,,N,root[n+]);
tmp2=t[tmp].mk;
printf("%lld\n",t[tmp].mk);
update(,anspos,,N,root[n+]);
tmp=query(n,,N,root[n+]);
update(tmp2,anspos,,N,root[n+]);
}
else{
// printf(" in\n");
mod=x;
tmp=query(y,,N,root[x]);
tmp2=t[tmp].mk;
printf("%lld\n",t[tmp].mk);
update(,anspos,,N,root[x]);//出队
// printf("anspos:%d\n",anspos);
//
mod=n+;
tmp=query(n+,,N,root[n+]);
update(tmp2,anspos,,N,root[n+]);
// printf("UPD: mk:%d pos:%d\n",tmp2,anspos);
//
tmp=query(x,,N,root[n+]);
tmp2=t[tmp].mk;
// printf("bu:%d anspos:%d\n",tmp2,anspos);
update(,anspos,,N,root[n+]);
mod=x;
tmp=query(m-,,N,root[x]);
update(tmp2,anspos,,N,root[x]);
//
}
// info(1,N,root[n+1]);
}
return ;
}

洛谷P3960 [NOIP2017] 列队的更多相关文章

  1. 【洛谷P3960】列队题解

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

  2. NOIP2017提高组Day2T3 列队 洛谷P3960 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...

  3. 洛谷P3960 列队(NOIP2017)(Splay)

    洛谷题目传送门 最弱的Splay...... 暴力模拟30分(NOIP2017实际得分,因为那时连Splay都不会)...... 发现只是一个点从序列里搬到了另一个位置,其它点的相对位置都没变,可以想 ...

  4. 洛谷P3959 [NOIP2017]宝藏

    [题目描述] 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但 ...

  5. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】

    题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...

  6. 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay

    正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...

  7. 洛谷 P3960 列队 解题报告

    P3960 列队 题目描述 \(Sylvia\)是一个热爱学习的女♂孩子. 前段时间,\(Sylvia\)参加了学校的军训.众所周知,军训的时候需要站方阵. \(Sylvia\)所在的方阵中有\(n ...

  8. 洛谷 P3960 列队

    https://www.luogu.org/problemnew/show/P3960 常数超大的treap #pragma GCC optimize("Ofast") #incl ...

  9. 洛谷 P3960 [ NOIP 2017 ] 列队 —— 线段树

    题目:https://www.luogu.org/problemnew/show/P3960 NOIP 题,不用很复杂的数据结构...但又参考了许多: 要求支持维护删除第 k 个和在末尾插入的数据结构 ...

随机推荐

  1. PAT 1069 微博转发抽奖

    https://pintia.cn/problem-sets/994805260223102976/problems/994805265159798784 小明 PAT 考了满分,高兴之余决定发起微博 ...

  2. javascript 容易忘记方法集锦

    定义和用法 1.split() 方法用于把一个字符串分割成字符串数组. 提示: 如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间 ...

  3. php错误报告和调试

    3. 错误报告和调试 常常犯的一个错误是忘记关闭 PHP 错误和数据库错误报告,这样做是有风险的.在任何一个公开的站点,error_reporting 应该设置为0 ,最多只能设置为 E_ERROR, ...

  4. Java 软引用和弱引用

    软引用(SoftReference) 软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示.对于软引用关联着的对象,只有在内存不足的 ...

  5. 题解 P3870 【[TJOI2009]开关】

    这个题我愣是交了好几遍没有过...... 后来@_皎月半洒花dalao告诉我说要^儿子节点的tag,然后就明白了...... 行吧,先上题面: 题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成 ...

  6. 整理:python的二维数组操作

    Python中初始化一个5 x 3每项为0的数组,最好方法是: multilist = [[0 for col in range(5)] for row in range(3)] 如果初始化一个二维数 ...

  7. 【spring】- springmvc 工作原理

    原理 本质是将DispatcherServlet及关联的Spring上下文环境的初始化工作织入Servlet的生命周期内,将外部WEB请求转换为Spring Bean能处理的形式,然后将处理后的结果借 ...

  8. ajax请求提交到controller后总是不成功

    最近在做实习时,点击查询时在js中发送ajax请求到controller后台,但是无论怎么样都不成功,请求地址是正确的,因为在后台用system.out.println输出有值,并且也确实return ...

  9. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

  10. P3320 [SDOI2015]寻宝游戏 解题报告

    P3320 [SDOI2015]寻宝游戏 题目描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有\(N\)个村庄和\(N-1\)条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以 ...