​​


题意

给出一个n×nn×nn×n的棋盘,保证每行每列只有一个棋子,给出多种操作,将所有棋子先上/下/左/右移动kkk步(遇到边界则停止移动),提问某一个棋子的现在的位置或问当前有多少对棋子是在一个格子里的。

题解

棋盘的两个方向可以分别考虑,我们现在只考虑水平方向
用区间[l,r][l,r][l,r]表示对于初始棋盘来说,水平坐标在[l,r][l,r][l,r]范围内的棋子是没有触碰到边界的
比如样例中的棋盘,向左移动2格后,只有初始坐标在[3,4][3,4][3,4]的棋子是没有碰到边界的,但真实情况是坐标集中在区间[1,2][1,2][1,2],所以还要记录一个变量ttt表示两个坐标的偏差值
为什么这样做?
这样是为了询问棋子坐标的操作,当水平坐标x&lt;lx&lt;lx<l时,说明在边界上,那么l−tl-tl−t就是真实的坐标,同理,x&gt;rx&gt;rx>r时为r−tr-tr−t,l&lt;=x&lt;=rl&lt;=x&lt;=rl<=x<=r时为x−tx-tx−t
[l,r][l,r][l,r]的维护方法就留给读者自己考虑(代码中有提示)
接下来是询问在同一格子的对数
棋子的整体移动可以等效为棋盘边界的反方向移动,那么很容易观察到会有多个棋子的格子只能在边界的四个角上,这样用4个变量维护4个角的棋子个数就可以了
维护方法
左上角的为liftanduplift\ and\ uplift and up,所以变量为lululu, ldrurdld\ ru\ rdld ru rd也是同理
上边界和下边界有两条扫描线
当区间[u,d][u,d][u,d]更新时,看边界经过的点的坐标x与区间[l,r][l,r][l,r]的关系

关系 操作
x&lt;lx&lt;lx<l 左边界已经扫过,说明这个点已经在角格子了,对应变量直接加1
l&lt;x&lt;rl&lt;x&lt;rl<x<r 说明该点不在边界,则mark[x]=1mark[x]=1mark[x]=1,标记一下,更新[l,r][l,r][l,r]时加到对应变量里
r&lt;xr&lt;xr<x 右边界已经扫过,说明这个点已经在角格子了,对应变量直接加1

当区间[l,r][l,r][l,r]更新时,如果mark[]==1mark[]==1mark[]==1,说明之前已经遇到上下边界,现在左右边界又遇到了,那么肯定以后都在角格子里了,对应计数的变量加1

代码:

#include<bits/stdc++.h>
#define N 300010
#define INF 0x3f3f3f3f
#define eps 1e-10
#define pi 3.141592653589793
#define P 998244353
#define LL long long
#define pb push_back
#define cl clear
#define si size
#define lb lower_bound
#define ub upper_bound
#define mem(x) memset(x,0,sizeof x)
#define sc(x) scanf("%d",&x)
#define scc(x,y) scanf("%d%d",&x,&y)
#define sccc(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;int dx,dy,n,m,l,r,u,d,p;
int x[N],y[N],a[N],b[N],c[N],lu,ld,ru,rd;
LL C[N];void workL()
{//real [l-dy,r-dy]//if l-dy<1 update l, else update dyint t=l-dy-p;if (t>=1) dy+=p;else{int  pl=l;l-=t-1;if (l>r) l=r;dy=l-1;for (int i=pl+1;i<=l-(l==r);i++) lu+=a[i],ld+=b[i];}
}void workR()
{//if r-dy>n update r, else update dyint t=r-dy+p-n;if (t>0){int pr=r;r-=t;if (l>r) r=l;dy=r-n;for (int i=pr-1;i>=r+(l==r);i--) ru+=a[i],rd+=b[i];}else dy-=p;
}void workU()
{int t=u-dx-p;if (t>=1) dx+=p;else{int pu=u;u-=t-1;if (u>d) u=d;dx=u-1;for (int i=pu+1;i<=u-(d==u);i++){if (c[i]>=r) ru++;elseif (c[i]>l) a[c[i]]=1;else lu++;}}
}void workD()
{int t=d-dx+p-n;if (t>0){int pd=d;d-=t;if (u>d) d=u;dx=d-n;for (int i=pd-1;i>=d+(d==u);i--){if (c[i]>=r) rd++;elseif (c[i]>l) b[c[i]]=1;else ld++;}}else dx-=p;
}void cal()
{if (l==r && u==d) {printf("%lld\n",C[n]);}elseif (l==r){printf("%lld\n",C[lu+ru]+C[ld+rd]);}elseif (u==d){printf("%lld\n",C[lu+ld]+C[ru+rd]);}elseprintf("%lld\n",C[lu]+C[ru]+C[ld]+C[rd]);
}void query()
{int ax=max(min(x[p],d),u),ay=max(min(y[p],r),l);ax-=dx; ay-=dy;printf("%d %d\n",ax,ay);
}int main()
{for (int i=0;i<N;i++) C[i]=(LL) i*(i-1)/2;int T;sc(T);while(T--){scc(n,m);dx=dy=0;l=u=0;r=d=n+1;for (int i=1;i<=n;i++) scc(x[i],y[i]),a[i]=b[i]=0,c[x[i]]=y[i];lu=ld=ru=rd=0;while(m--){char x[4];scanf("%s",x);if (x[0]=='!') cal(); else{sc(p);if (x[0]=='L') workL();elseif (x[0]=='R') workR();elseif (x[0]=='U') workU();elseif (x[0]=='D') workD();elseif (x[0]=='?') query();}}}
}

ICPC 2018 焦作 C题 Supreme Command相关推荐

  1. 2018-2019ICPC焦作C题Supreme Command kd-tree

    焦作赛VP打的非常一般,签完4道题之后,还有一个签到没签上,原因是有一个全局的queue忘记清空,由于那题输入过于繁琐,注意力没有集中在算法上,三个人都没看出,算是吸取了一个教训,而剩下有两道银牌题我 ...

  2. ICPC 2018 焦作赛区网络预赛G Give Candies 组合数学隔板法+欧拉降幂

    G Give Candies 计蒜客 G Give Candies 题意 n n n个糖果, n n n个人从 1 1 1~ n n n编号,每次给一个人发糖可以发任意数量但不能小于 1 1 1,直到 ...

  3. ACM-ICPC 2018 焦作赛区网络预赛 H题 String and Times(SAM)

    Now you have a string consists of uppercase letters, two integers AA and BB. We call a substring won ...

  4. 2018焦作ICPC E - Resistors in Parallel(规律+Java大数)

    2018焦作ICPC E - Resistors in Parallel题目链接 Time limit  2000 ms Memory limit  1048576 kB In this physic ...

  5. ACM-ICPC 2018 焦作赛区网络预赛 J(二分+JAVA高精)

    传送门 题面: 65536K Jessie and Justin want to participate in e-sports. E-sports contain many games, but t ...

  6. L. Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛,ac自动机+矩阵快速幂 或 BM线性递推)

    描述 God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells hi ...

  7. ACM-ICPC 2018 焦作赛区网络预赛(A B E F G H I K L)

    ACM-ICPC 2018 焦作赛区网络预赛(A B E F G H I K L) 发了博客一万年之后才发现H1写错了(tao A. Magic Mirror 题目链接 题面: Jessie has ...

  8. 2021 ICPC 沈阳赛区J题 Luggage Lock

    2021 ICPC 沈阳赛区J题 Luggage Lock 题意 有TTT组样例,其中每组样例为: 给定一个密码为b0b1b2b3b_0b_1b_2b_3b0​b1​b2​b3​的密码锁,已知当前密码 ...

  9. 牛客网 2018校招真题 美团点评 K的倍数

    Description 牛客网 2018校招真题 K的倍数 Solving Ideas sum[i + 1]: 表示序列p[0]...p[i]的和 从长度最大的子串开始判断,当剩余需要判断子串长度不可 ...

最新文章

  1. http://www.shanghaihaocong.com-WORDPRESS开发的企业主题站
  2. Basic005. Intro to statistics basic terms统计名词介绍
  3. mapinfo在线地图插件_表格中如何可视化地址数据?用 SeaTable 的地图插件很方便...
  4. 上项线体表位置_心理成熟的人都有哪些具体表现呢?
  5. Eclipse修改项目编码
  6. Ubuntu系统下如何在不重启的情况下永久修改hostname主机名
  7. 科研不是比赛,而是一种对未知和完美的自我追求——跟邢波(Eric Xing)面对面聊科研...
  8. 基于ffmpeg的h264播放器无法播放HI3516开发板保存的h264码流的问题
  9. 计算机电脑桌面怎么设置,老司机教你电脑屏保怎么设置
  10. 考研面试php,考研复试 | 盘点:这些院校已公布2019考研复试内容
  11. 【模电】0014 运放自激振荡和消除(补偿)
  12. c/c++ 求解数独
  13. 波浪下划线怎么设置_波浪线符号(word小技巧)
  14. django 自定义中间件实现访问频率限制和IP禁用
  15. 【数学理论】最优化问题:拉格朗日乘子法、KKT条件以及对偶问题
  16. 数据库的未来 - HTAP,软件、硬件、云生态的融合
  17. 【考研政治】时政(思维导图)
  18. PyCharm快捷键替换变量
  19. Java业务系统配置管理设计方案实现
  20. android 利用数据库实现历史搜索记录功能

热门文章

  1. xd卡数据丢失原因和三种数据恢复方法介绍
  2. 硬件开发笔记(一):高速电路设计Cadence Aleegro软件介绍和安装过程
  3. ygomobile卡组下载网站_ygomobile卡组导入攻略来了
  4. 英语常用缩写(Abbreviations) ---一般常用缩写
  5. Zeppelin Job monitor打开
  6. 华为云微认证考试简介
  7. FPGA之VGA转HDMI之编码模块的编写
  8. IT行业转行UI设计有前景吗
  9. 【160313 18:00】四则运算 2 的单元测试
  10. 操作系统-------用P,V操作解决生产者和消费者问题(详解!!!)