正解:动态开点线段树

解题报告:

传送门!

因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ

然后说下,这题有很多种方法,我目前是先只写个最傻逼的方法,等学了splay什么的再来upd一下QAQ(这题好像有,线段树.树状数组.splay等各种方法,我可能都会写只要我麻油咕QAQ

然后就直接进入正题QAQ

首先其实要知道动态开点线段树和线段树思想什么的都是一样儿的,只是实现方法有一点儿区别(就是动态开点线段树节省点儿空间而已QAQ

所以就考虑线段树怎么做昂QAQ

首先可以发现,每次变动之后,有影响的只会是这个点,这一行,最后一列,对趴

所以可以考虑对每一行(不包括最后一个点QAQ)以及最后一列分别开个线段树

然后每次对当前操作(x,y),先记录ans,并把这个编号从x这一行的线段树中删去,加入第n+1棵树的最后一个位置,然后把第n+1棵的x位置加入到第x行的最后一个位置

然后注意以下如果x=n也就是说它本来就在最后一列的时候就不用管了QAQ

然后关于动态开点,我提下QAQ

考虑q的范围,即最多有q个点加入,那么线段树的长度最长为 max(n,m)+q

然后考虑到nmq范围,所以动态开点,over

然后再说一个方法,其实也是动态开点线段树,只是还要简单点儿,因为它还开了个vector

然后有vector的话就每次压进去就好了鸭,就是说线段树是个权值线段树记录被修改后的数字的,具体的值在vector中查询一下就好

具体看代码QAQ

然后记得开ll,,,我也不知道我什么猪脑子开了个int然后还麻油发现有什么不对,,,我都佩服我自己了QAQ

$upd:$半年后$gql$重新来康眼差点忘了咋做了,,,一句话总结就,$vector$存数值.线段树存下标,然后就可以资瓷删除操作了.

       另外安利$loj$最短代码,思想和我是一样的但代码绝短,,,$QAQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define gc getchar()
#define int long long
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i) const int N=3e5+,M=1e7+;
int n,m,q,rt[N],nod_cnt,mx;
struct sgtr{int ls,rs,sz;}tr[M];
vector<int>v[N]; il int read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void modify(int &nw,int l,int r,int to)
{
if(!nw)nw=++nod_cnt;++tr[nw].sz;if(l==r)return;
int mid=(l+r)>>;
if(to<=mid)modify(tr[nw].ls,l,mid,to);else modify(tr[nw].rs,mid+,r,to);
}
il int query(int nw,int l,int r,int to)
{
if(l==r)return l;int mid=(l+r)>>,tmp=mid-l+-tr[tr[nw].ls].sz;
if(to<=tmp)return query(tr[nw].ls,l,mid,to);return query(tr[nw].rs,mid+,r,to-tmp);
}
il int wk1(int x,int y)
{
int pos=query(rt[n+],,mx,x);modify(rt[n+],,mx,pos);
int ans=(pos<=n?1ll*pos*m:v[n+][pos-n-]);
return v[n+].push_back(y?y:ans),ans;
}
il int wk2(int x,int y)
{
int pos=query(rt[x],,mx,y);modify(rt[x],,mx,pos);
int ans=(pos<m?1ll*(x-)*m+pos:v[x][pos-m]);
return v[x].push_back(wk1(x,ans)),ans;
} main()
{
// freopen("ld.in","r",stdin);freopen("ld.out","w",stdout);
n=read();m=read();q=read();mx=max(n,m)+q;
while(q--){int x=read(),y=read();printf("%lld\n",(y==m?wk1(x,):wk2(x,y)));}
return ;
}

先放下开vector做的代码QAQ(然后不开vector的代码可能就咕了QAQ?

洛谷P3960 列队 NOIp2017 线段树/树状数组/splay的更多相关文章

  1. 洛谷 P3960 列队【线段树】

    用动态开点线段树分别维护每一行和最后一列,线段树的作用是记录被选的点的个数以及查询第k个没被选的点,每次修改,从行里标记被选的点,从最后一列标记向左看齐之后少的点,然后用vector维护行列的新增点 ...

  2. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

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

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

  4. 洛谷 P3960 列队 解题报告

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

  5. 洛谷 P3960 列队

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

  6. 洛谷P3960 列队(Splay)

    传送门 感觉自己好久不打数据结构已经完全不会了orz…… 据说正解树状数组?然而并不会 首先考虑一下每一次操作,就是把一个人从这一行中取出并放到行的最后,再从最后一列取出放到列的最后 那么这两种操作其 ...

  7. 洛谷P3960 列队 Splay

    其实思路并不算太难,就是代码量相对较大. 我们将一次离队转换为一次删除和两次加入,这样就可以保证空间是动态分配的,最大也不会暴空间. 说实话写之前感觉会很恶心,但是代码量就还好吧,有些细节需要特殊注意 ...

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

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

  9. 【洛谷P3960】列队题解

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

随机推荐

  1. android设置字符串到剪贴板

    android2.1之后版本 其一:(已运行成功) ClipboardManager clip = (ClipboardManager)getSystemService(Context.CLIPBOA ...

  2. Ubuntu下的Wine&WineQQ

    一.安装Wine 1.添加PPA sudo add-apt-repository ppa:ubuntu-wine/ppa 2.更新列表 sudo apt-get update 3.安装Wine sud ...

  3. plsql 常用函数-转

    PLSQL常用函数 1)处理字符的函数 || 或 CONCAT---并置运算符. 格式∶CONCAT(STRING1, STRING2) 例:’ABC’|| ’DE’=’ABCDE’ CONCAT(‘ ...

  4. Python——特殊属性与方法

    Python 对象 中以双下划线开头和结尾的属性称为特殊属性,由于对象的方法也属于属性,因此以双下划线开头和结尾的方法称为特殊方法.对这些对象执行一些特定的运算时,Python会自动视图调用这些实例的 ...

  5. 关于Solaris 的磁盘的分区

    也许是深受LINUX  Windows  fdisk 影响,每次看完Solaris的format命令,总是云里雾里.我今天总结一下,各位给点指点 一. Linux.Windows  传统的磁盘区层级, ...

  6. 详解 Redis 应用场景及应用实例

    redis(二)高级用法 详解 Redis 应用场景及应用实例 Redis 它是什么?它用来做什么?它的优势与短板如何? 告诉你Redis是一个牛逼货

  7. SSM框架搭建教程(从零开始,图文结合)

    1.准备 IntelliJ IDEA Tomcat JDK Maven mysql spring.springmvc.mybatis 了解 现在假设如上条件你都具备,那么通过我这篇博客 你一定可以整合 ...

  8. 5. RAMN备份与恢复

    一. rman简介 RMAN(Recovery Manager)是一种用于备份(backup).还原(restore)和恢复(recover)数据库的 Oracle 工具.RMAN只能用于ORACLE ...

  9. U3D对齐功能

    1,按快捷键Shift + v 的用法:    [1]先选中你要对齐的模型A,[将物体A对齐到物体B].    [2]按快捷键Shift + v ,此时将鼠标移到模型A的各个顶点处,可发现各个顶点上会 ...

  10. IDEA 2017 安装后 关联SVN

    IDEA 2017 安装后,SVN checkout时候会出现如下错误: Cannot run program "svn" (in directory "D:\demo\ ...