<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$ ...
随机推荐
- input单选框多选框时可用的事件
change(): 当元素的值发生改变时,会发生 change 事件. 该事件仅适用于文本域(text field),以及 textarea 和 select 元素. change() 函数触发 ch ...
- OpenCV中MAT中数据类型的设置(转)
前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量. ...
- 发现一sonar-runner bug
最近在使用sonar-runner做代码扫描, 在windows环境运行多模块的扫描ok,但是在linux上sonar-runner扫描多模块报错: 先贴sonar-project.propertie ...
- 交叉熵的数学原理及应用——pytorch中的CrossEntropyLoss()函数
分类问题中,交叉熵函数是比较常用也是比较基础的损失函数,原来就是了解,但一直搞不懂他是怎么来的?为什么交叉熵能够表征真实样本标签和预测概率之间的差值?趁着这次学习把这些概念系统学习了一下. 首先说起交 ...
- EOF \n \0 NULL 之间的区别
\n 是换行符 \0 是字符串的结束标志 EOF是流的结束标志 FILE* 这种流 NULL 是指针为空 第一个问题是EOF 它是end of file的缩写,表示"文字流"(s ...
- F - New Distinct Substrings (后缀数组)
题目链接:https://cn.vjudge.net/contest/283743#problem/F 题目大意:给你一个字符串,然后让你求出不同的子串的个数. 具体思路:首先,一个字符串中总的子串个 ...
- SpringMVC——SpringMVC简介
Spring web mvc 和Struts2 都属于表现层的框架,它是Spring 框架的一部分,我们可以从Spring 的整体结构中看得出来:
- UML和模式应用5:细化阶段(1)--第1次迭代
1.前言 从本文开始进入细化阶段,讨论迭代技术的基础,本次讨论将着重讨论第一次迭代,以POS机为例. 2. 第一次迭代处理的需求(以NextGen POS项目处理销售用例) 实现 处理销售 用例中基本 ...
- 【转】wpf中的xmlns命名空间为什么是一个网址,代表了什么意思
wpf中的xmlns命名空间为什么是一个网址,代表了什么意思 http://blog.csdn.net/catshitone/article/details/71213371
- WPF 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项
1.检查代码不存在问题,最后找到问题,Nut管理包没有安装CefSharp.wpf. 2.安装对应的版本即可.