<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$ ...
随机推荐
- ipython 编辑器 jupyter notebook如何将 ipynb 转成 py 并在 jupyter notebook 中继续引用
首先将 要被做成 module 的 ipython 代码 download as py 然后将 down 下来的 py 文件上传至 work 目录(也就是编写导入模块的py文件目录) 这部分 的 wo ...
- Parent Proxy 和 Origin Server配置学习
Parent Proxy Configuration proxy.config.http.parent_proxy_routing_enable 开启/关闭parent caching: proxy. ...
- windows上使用mkdocs搭建静态博客
windows上使用mkdocs搭建静态博客 之前尝试过用HEXO搭建静态博客,最近发现有个叫mkdocs的开源项目也是搭建静态博客的好选择,而且它支持markdown格式,下面简要介绍一下mkdoc ...
- C# Winform中慎用Application.DoEvents
private void Add() { ; i < ; i++) { Button button = new Button(); button.Width = ; button.Height ...
- python安装curses库
windows系统在安装curses库时,如果直接使用conda或者pip安装,总是失败,到如下网址直接下载.whl文件,然后再用pip安装即可. https://www.lfd.uci.edu/~g ...
- if语句与switch语句
if语句可以替代switch语句,但是switch语句不能完全替代if语句.比如下面这种就是不对的 switch (len) { case (len <= 4): domLen = 4; bre ...
- 【Gradle】Gradle环境配置
Windows环境 下载 作者下载的是gradle-4.1-all.zip,下载地址:http://services.gradle.org/distributions 环境配置 GRADLE_HOME ...
- Python2和Python3中print的不同点
在Python2和Python3中都提供print()方法来打印信息,但两个版本间的print稍微有差异 主要体现在以下几个方面: 1.python3中print是一个内置函数,有多个参数,而pyth ...
- python manage.py syncdb Unknown command: 'syncdb'问题解决方法
在django1.9后的版本中,python manage.py syncdb命令修改为python manage.py migrate,执行正常. 选择sqlite可视化sqlitestudio-3 ...
- mysql 原理 ~ change buffer
一 简介:今天咱们来聊聊mysql的change buffer二 详细说明 1 +-change Buffer和数据页一样,也是物理页的一个组成部分,数据结构也是一颗B+树,这棵B+树放在共享表空 ...