<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$ ...
随机推荐
- HTML5视频播放插件Video.js使用详解
一.Video.js简介 Video.js 是一个开源的 Html5 jquery 视频插件,这个插件可以用来处理 Flash 视频,它还是一个多平台支持的产品. Moreover,YouTube,V ...
- 006、容器 What、Why、How(2018-12-21 周五)
参考https://www.cnblogs.com/CloudMan6/p/6751516.html What - 什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,是应用 ...
- 数据库的一致性读,赃读,多线程与赃读,ACID,UNDO
赃读 对于对象额同步异步方法,我们在设计自己的程序的时候,一定要考虑的问题整体,不然会出现数据不一致的错误,很经典的就是赃读(dityread) 示例: package com.nbkj.thre ...
- MyBatis全局配置文件MyBatis-config.xml代码
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- 第17月第28天 python yield
1. class Fab(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def _ ...
- NULL、0、nullptr的区别
某些时候,我们需要将指针赋值为空指针,以防止野指针. 有人喜欢使用NULL作为空指针常量使用,例如:int* p = NULL;. 也有人直接使用0值作为空指针常量,例如:int* p = 0;. ...
- Error: Cannot find module PhantomJS
node install.js Considering PhantomJS found at /usr/local/bin/phantomjs Looks like an `npm install - ...
- http raw post 之理解
参考链接: https://imququ.com/post/four-ways-to-post-data-in-http.html http://blog.csdn.net/leyangjun/art ...
- mysql 架构 ~异地容灾
一 简介 我们来探讨下多机房下的mysql架构二 目的: 首先要清楚你的目的 1 实现异地机房的容灾备份 2 实现异地机房的双活 三 叙说 1 实现异地机房的容灾备份 ...
- windows安装anaconda 报错failed to create anacoda menu ?
windows安装anaconda 报错failed to create anacoda menu ? 装了无数次,每次都是 failed to create anacoda menu然后无选择忽略, ...