数据结构题还是挺好玩的

注意到每次只变动三个点:(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. fx投影效果分离

    虽然忙着花花二期三期bug.bug  ing,修改等待中突然看见一张logo.文字下面的阴影图,如下,就满脑子在想阴影到底咋做的.. 七拼八凑的尝试后大体样子是有,终究没有上图那种字体轮廓的阴影... ...

  2. PAT 甲级 1112 Stucked Keyboard

    https://pintia.cn/problem-sets/994805342720868352/problems/994805357933608960 On a broken keyboard, ...

  3. java与C++相比增加和缺少的特性--持续更新

    缺少的特性 java值类型中没有无符号数 java没有运算符重载语法 java中没有struct和union等用户自定义值类型 java中没有虚函数的概念,所有函数默认具有虚函数的特性 java采用单 ...

  4. 一文总结之MyBatis

    目录 MyBatis 目标 MyBatis演示 Configuration.xml 映射文件 初始化配置文件 Dao Spring与MyBatis集成 pom Spring配置文件 MyBatis配置 ...

  5. UVA 12633 Super Rooks on Chessboard(FFT)

    题意: 给你一个R*C的棋盘,棋盘上的棋子会攻击,一个棋子会覆盖它所在的行,它所在的列,和它所在的从左上到右下的对角线,那么问这个棋盘上没有被覆盖的棋盘格子数.数据范围R,C,N<=50000 ...

  6. Go 示例测试实现原理剖析

    简介 示例测试相对于单元测试和性能测试来说,其实现机制比较简单.它没有复杂的数据结构,也不需要额外的流程控制,其核心工作原理在于收集测试过程中的打印日志,然后与期望字符串做比较,最后得出是否一致的报告 ...

  7. png?wxfrom=5&wx_lazy=1

    作为一名游戏行业的视频&平面设计师,平时的工作就是为公司发行的游戏制作宣传视频.广告.平面宣传图,打交道最多的自然就是Adobe家族的设计软件,Photoshop.AfterEffects.P ...

  8. 【BZOJ2724】蒲公英(分块)

    [BZOJ2724]蒲公英(分块) 题面 洛谷 谴责权限题的行为 题解 分块什么的都不会,根本就没写过几次. 复杂度根本不会分析,吓得我赶快来练练. 这题要求的是区间众数,显然没有什么很好的主席树之类 ...

  9. LaTex Font Size 字体大小

    目录 命令 效果图 命令 LaTex中字体大小由以下命令控制: \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LA ...

  10. 【bzoj2438】 中山市选2011—杀人游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2438 (题目链接) 题意 n个点的有向图,其中有一个是杀手,每个人成为杀手的概率相同.警察询问一个人 ...