这题我改了三天,考场上部分分暴力拿了50,考完试发现与正解很接近只是没写出来。

对于每一行和最后一列建n+1颗线段树,维护前缀和。

复杂度qlogn

假如你移动一个坐标为(x,y)的人,你要将第x行线段树中前缀和为y处的值变为0,再将其移至最后一列的末尾,然后将最后一列中前缀和为x处的值变为一,并将这个位置上的数添加到第x行线段树的末尾。

   #include<bits/stdc++.h>
using namespace std;
int n,m,q;
typedef long long ll;
struct node
{
int l,r,s;bool lz;ll x,y;
}t[]; int idx,mx[],ed[],id[];
void pd(int z)
{
if(!t[z].lz)
{
t[z].l=++idx;
t[z].r=++idx;
ll m=(t[z].x+t[z].y)>>;
t[t[z].l].x=t[z].x;t[t[z].l].y=m;
t[t[z].r].x=m+;t[t[z].r].y=t[z].y;
t[t[z].l].s=t[t[z].l].y-t[t[z].l].x+;
t[t[z].r].s=t[t[z].r].y-t[t[z].r].x+;
t[z].s=t[t[z].l].s+t[t[z].r].s;
t[z].lz=;
}
}
void change(int z,int l,int r,int L,int R,ll l1,ll r1)
{
if(l==L&&r==R)
{
t[z].x=l1;t[z].y=r1;t[z].s=r1-l1+;return;
} pd(z);
int m=(l+r)>>;
if(R<=m)change(t[z].l,l,m,L,R,l1,r1);
else if(L>m)change(t[z].r,m+,r,L,R,l1,r1);
else
{
change(t[z].l,l,m,L,m,l1,l1+m-L);
change(t[z].r,m+,r,m+,R,l1+m-L+,r1);
}
t[z].s=t[t[z].l].s+t[t[z].r].s;
}
ll pos1,pos2;
void query(int z,int l,int r,int s)
{
if(l==r)
{
pos1=l;pos2=t[z].x;return;
}
if(t[z].l==) t[z].l=++idx;
if(t[z].r==) t[z].r=++idx;
pd(z);
int m=(l+r)>>;
if(t[t[z].l].s>=s)
query(t[z].l,l,m,s);
else
query(t[z].r,m+,r,s-t[t[z].l].s);
}
int xx[],yy[];
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=q;++i)
{
scanf("%d%d",&xx[i],&yy[i]);
mx[xx[i]]++;
}
for(int i=;i<=n;++i)
{
mx[i]+=m-;id[i]=++idx;
change(id[i],,mx[i],,m-,1ll*(i-)*m+,1ll*i*m-);
ed[i]=m-;
}
id[n+]=++idx;mx[n+]=n+q;ed[n+]=n;
for(int i=;i<=n;++i)
change(id[n+],,mx[n+],i,i,1ll*i*m,1ll*i*m);
int x,y;
for(int i=;i<=q;++i)
{
x=xx[i];y=yy[i];
if(y==m)
{
query(id[n+],,mx[n+],x);
change(id[n+],,mx[n+],pos1,pos1,,-);
ed[n+]++;
change(id[n+],,mx[n+],ed[n+],ed[n+],pos2,pos2);
printf("%lld\n",pos2);
}
else
{
//cout<<666<<endl;
query(id[x],,mx[x],y);
ll a1=pos1,a2=pos2;ed[n+]++;ed[x]++;
query(id[n+],,mx[n+],x); change(id[x],,mx[x],a1,a1,,-);
change(id[x],,mx[x],ed[x],ed[x],pos2,pos2); change(id[n+],,mx[n+],pos1,pos1,,-);
change(id[n+],,mx[n+],ed[n+],ed[n+],a2,a2); printf("%lld\n",a2);
}
}
return ;
}

NOIP2017 D2T3列队的更多相关文章

  1. 【学术篇】NOIP2017 d2t3 列队phalanx splay做法

    我可去他的吧.... ==============先胡扯些什么的分割线================== 一道NOIP题我调了一晚上...(其实是因为昨晚没有找到调试的好方法来的说...) 曾经我以 ...

  2. [luogu P3960] [noip2017 d2t3] 队列

    [luogu P3960] [noip2017 d2t3] 队列 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Syl ...

  3. 【NOIP2017】列队(Splay)

    [NOIP2017]列队(Splay) 题面 洛谷 题解 其实好简单啊... 对于每一行维护一棵\(Splay\) 对于最后一列维护一棵\(Splay\) \(Splay\)上一个节点表示一段区间 每 ...

  4. 【NOIP题解】NOIP2017 TG D2T3 列队

    列队,NOIP2017 TG D2T3. 树状数组经典题. 题目链接:洛谷. 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. ...

  5. [NOIP2017 TG D2T3]列队

    题目大意:有一个$n \times m$的方阵,第$i$行第$j$列的人的编号是$(i-1) \times m + j$. 现在有$q$个出列操作,每次让一个人出列,然后让这个人所在行向左看齐,再让最 ...

  6. P2649 - 【NOIP2017】列队

    Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m 名学生,方阵的行数为 ...

  7. 【NOIP2017】 列队

    线段树博客先开个点随笔.... 这意味着啥呢? 今天绝对要把这道题写出来并且更掉这篇blog!!!! ~ upd:懂了哈哈哈哈哈哈哈 先贴代码 回家+讲解 ---------------------- ...

  8. [LUOGU] [NOIP2017] P3960 列队

    题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n \times mn×m 名学生,方阵的行 ...

  9. 2018.11.01 loj#2319. 「NOIP2017」列队(线段树)

    传送门 唉突然回忆起去年去noipnoipnoip提高组试水然后省二滚粗的悲惨经历... 往事不堪回首. 所以说考场上真的有debuffdebuffdebuff啊!!!虽然当时我也不会权值线段树 这道 ...

随机推荐

  1. Liunx 下载文件夹下所有文件

    136down voteaccepted You may use this in shell: wget -r --no-parent http://abc.tamu.edu/projects/tzi ...

  2. 使用infinite-scroll实现Ghost博文列表的滚动加载

    Ghost博客系统默认提供的博文列表为传统的翻页方式(通过点击上一页.下一页等按钮来切换),随着移动客户端的发展,瀑布流式的滚动加载方式得到广泛应用,有效地提高了用户浏览信息的流畅度.下面详述如何通过 ...

  3. CodeForces - 1003D

    Polycarp has nn coins, the value of the ii-th coin is aiai. It is guaranteed that all the values are ...

  4. 【转】E: Sub-process /usr/bin/dpkg returned an error code (1)

    原链接: jaryWang:E: Sub-process /usr/bin/dpkg returned an error code (1)错误解决 1.$ sudo mv /var/lib/dpkg/ ...

  5. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  6. perl6正则 5: [ ] / | / ||

    也就是可以把多种要匹配的写进[ ] 中, 第种用 | 分开就行了. | 与 || 有差别 |的话, 当匹配位置 相同时, 会取最长的, 而 || , 当前面的匹配成功, 后面的就不会再去匹配. / / ...

  7. C基础 time.h 简单思路扩展

    前言 - time 简单需求 时间业务相关代码. 基本属于框架的最底层. 涉及的变动都很小. 以前参与游戏研发时候, 这方面需求不少, 各种被策划花式吊打. 转行开发互联网服务之后很少遇到这方面需求. ...

  8. Python Random模块生成伪随机数字

    This module implements pseudo-random number generators for various distributions. 对于整数,有一个范围的均匀选择: 对 ...

  9. C/C++——static修饰符

    1. static变量 static 用来说明静态变量.如果是在函数外面定义的,那么其效果和全局变量类似,但是,static定义的变量只能在当前c程序文件中使用,在另一个c代码里面,即使使用exter ...

  10. 设计模式(一)工厂模式Factory(创建型)(转)

    原文链接:http://blog.csdn.net/hguisu/article/details/7505909 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符 ...