<noip2017>列队
题解:
考场实际得分:45
重新看了一下,发现至少80分是很好拿的
对于前30% 暴力
另20% 显然离线搞一下就可以了(大概当初连离线是啥都不知道)
另另30%其实只要维护第一行和最后一列就可以了,显然可以用splay来完成加点删点
满分做法:
1 .splay(是看了题解才知道了)
类似线段树的动态开点,splay也可以先把一个节点作为一段序列的维护,当使用时再裂点
2.动态开点线段树
#upd:8.8写了一下
写了30min,debug了30min左右
思路挺简单的,动态开点线段树维护,对最后一列开一颗线段树
然后细节就是最后一列,注意每次对某一行操作的时候要把正确的最后一位填入到当前行
查询时如果问最后一列,在那颗特殊的线段树里查
#define比void还是快好多啊
洛谷这个评测是什么鬼。。为什么一模一样的总时间差2s
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>IL void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
const int N=3.1e5;
const int N2=1.5e7;
int v[N2],s[N2],rs[N2],ls[N2];
ll now[N2];
int cnt,n,n1,m,q,e[N],root[N];
struct re{
ll a,b;
}jl;
#define min(x,y) ((x)<(y)?(x):(y))
struct sgt{
int m;
// #define mid ((h+t)>>1)
/*IL void sc(int &x,int h,int t)
{
if (x) return;
x=++cnt;
if (h<=m) v[x]=min(t,m)-h+1;
} */
#define sc(x,h,t) if (!(x)) {(x)=++cnt;if ((h)<=(m)) v[x]=min(t,m)-h+1;}
void query(rint x,rint h,rint t,int k,int z)
{
if (h==t)
{
if (k!=v[x])
{
jl=(re){,};
return;
}
v[x]-=z;
jl=(re){h,now[x]};
return;
}
rint &l1=ls[x],&l2=rs[x];
rint mid=(h+t)/,mid2=mid+;
sc(l1,h,mid); sc(l2,mid2,t);
v[x]-=z;
if (v[l1]>=k) query(l1,h,mid,k,z);
else query(l2,mid+,t,k-v[l1],z);
}
void change(int x,int h,int t,int pos,ll k)
{
if (h==t)
{
v[x]=; now[x]=k; return;
}
rint mid=(h+t)/,mid2=mid+;
if (pos<=mid)
{
sc(ls[x],h,mid); change(ls[x],h,mid,pos,k);
} else
{
sc(rs[x],mid2,t); change(rs[x],mid2,t,pos,k);
}
v[x]++;
}
}S[N];
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
read(n1); read(m); read(q); n=max(m,n1)+q;
rep(i,,n1) e[i]=m;
e[n1+]=n1;
rep(i,,n1) root[i]=i,v[i]=m,S[i].m=m;
S[n1+].m=n1;
root[n1+]=n1+,v[n1+]=n1;
cnt=n1+;
rep(i,,q)
{
int x,y;
read(x); read(y);
ll ans,ans2; re k;
S[x].query(root[x],,n,m,);
if (y!=m)
{
S[x].query(root[x],,n,y,); k=jl;
if (!k.b) ans=1ll*(x-)*m+k.a; else ans=k.b;
} else
{
S[n1+].query(root[n1+],,n,x,); k=jl;
if (!k.b) ans=m*k.a; else ans=k.b;
}
cout<<ans<<endl;
S[n1+].query(root[n1+],,n,x,); k=jl;
if (!k.b) ans2=1ll*k.a*m; else ans2=k.b;
S[x].change(root[x],,n,++e[x],ans2);
S[n1+].change(root[n1+],,n,++e[n1+],ans);
}
return ;
}
<noip2017>列队的更多相关文章
- [NOIP2017]列队 离线+SBT
[NOIP2017]列队 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵 ...
- 题解[NOIP2017] 列队
题解[NOIP2017] 列队 题面 解析 看到这题时感觉这个编号很难维护啊? 后来看了lzf大佬的题解才会.. 首先,考虑一个稍微暴力的做法, 维护每一行的前\(m-1\)个人和最后一列的\(n\) ...
- NOIP2017列队(phalanx)解题报告
列队作为NOIP2017最后一道题,其实并不难,只是相对于其它题目,有点小小的工业 首先,这道题我用splay维护的,如果你不会splay,又想学一下splay,可以来这里学一学,接下来步入正题 首先 ...
- NOIP2017 列队 题解报告【56行线段树】
题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n \times mn×m名学生,方阵的行数 ...
- [NOIP2017]列队 (Splay)
题目链接 NOIP2017真的是不按常理出牌: 1.数学题不在Day2T1 2.一道水题一道细节极多的模拟题一道不知道怎么形容的题(小凯的疑惑)(因为我太菜了) 3.3道大火题 当时看到列队这题是毫无 ...
- NOIP2017 列队
https://www.luogu.org/problemnew/show/P3960 p<=500 50分 模拟 每个人的出队只会影响当前行和最后一列 p<=500,有用的行只有500行 ...
- [NOIP2017] 列队(平衡树)
考虑转化题意: 设这次操作删掉点\((x, y)\) 对于每一次向左看齐:在第x行删除\((x, y)\),并将y以后的点全部前移一位 对于每一次向前看齐:x以后的点全部上移一位,并在最后一列插入\( ...
- NOIP2017 列队——动态开点线段树
Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 ...
- Luogu 3960 [NOIP2017] 列队 - splay|线段树
题解 是我从来没有做过的裂点splay... 看的时候还是很懵逼的QAQ. 把最后一列的$n$个数放在一个平衡树中, 有 $n$ 个点 剩下的$n$行数, 每行都开一个平衡树,开始时每棵树中仅有$1$ ...
随机推荐
- mssql拿webshell的方法
首先检测下MSSQL数据库的用户权限,一般有两种,一种是SA权限,这种权限很大,还有一种是DB_OWNER权限,这个权限赋给用户一些对数据库的修改.删除.新增数据库表,执行部分存储过程的权限.但是涉及 ...
- 下拉框combobox用法&级联餐单
如果下来内容不用后台取数据,直接写死的话不用url属性,直接用data即可: <input id="orderstate" name="orderstate&quo ...
- linux space/mark设置
参考链接: http://blog.csdn.net/zhaozh2000/article/details/6460223 串口数据的发送: 数据的发送: 数据位+检验位+停止位, 进行数据的发送.( ...
- Biorhythms HDU - 1370 (中国剩余定理)
孙子定理: 当前存在三个式子,t%3=2,t%5=3,t%7=2.然后让你求出t的值的一个通解. 具体过程:选取3和5的一个公倍数t1能够使得这个公倍数t1%7==1,然后选取3和7的一个公倍数t2使 ...
- python - class类 (七) 三大特性 - 封装 结尾
封装: # 封装 #第一层,类就是麻袋,本身就是一种封装 #第二层,类中定义私有的,至在类的内部使用,外部无法访问 #第三层,封装在于明确区分内外,使得类实现者可以修改封装内的东西二不影响外部调用者 ...
- Elastic-Job-Lite分析——作业调度器 JobScheduler 的创建过程
-----------------------------------1. 创建注册中心的对象----------------------------------------------------- ...
- 【转】htop使用详解--史上最强(没有之一)
在管理进程时通常要借助一些工具,比较常用的就是ps和top了:不过CentOS还为我们提供了一个更加强大的工具htop,下面就来了解一下此工具的使用方法.一.安装htop htop工具在epel源中提 ...
- WCF错误远程服务器返回了意外响应: (413) Request Entity Too Large。解决方案
这个问题出现的原因是 调用wcf服务的时候传递的参数 长度太大 wcf数据传输采用的默认的大小是65535字节. ---------------------------------------- ...
- imp高版本的dmp文件报错问题
imp高版本的dmp文件报错问题 导出方:oracle 11R2 www.2cto.com 导入方:oracle 10R2 通过imp导入时提示如下: 解决方法: 通过编 ...
- 目标检测--Spatial pyramid pooling in deep convolutional networks for visual recognition(PAMI, 2015)
Spatial pyramid pooling in deep convolutional networks for visual recognition 作者: Kaiming He, Xiangy ...