JZOJ.5281【NOIP2017模拟8.15】钦点
Description
Input
Output
Sample Input
4 4 2
a a b b
a a b b
c c d d
c c d d
1 1 3 3 2 2
3 1 1 3 2 2
Sample Output
d d c c
d d c c
b b a a
b b a a
Data Constraint
很明显这是一道模拟题,朴素算法O(nmq)看似过得去,实际上字符串的操作是很慢的,同样对字符串赋值10w次比对数组元素赋值10w次要慢3倍以上。
实际上我们可以像剪布一样,剪出边缘然后整体粘贴过去。
我们就可以建立链表,每次只用修改矩形的边缘点的关系即可。复杂度O((n + m)q)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<ctime>
#define N 1005
using namespace std;
struct data{
int nx,ny,sx,sy,ex,ey,wx,wy;
}pos[N][N];
string qwq[N][N],qaq;
int n,m,q,x1,x2,y3,y2,l,r,tmp1,tmp2,a,b,x,y,c,d,qxq,qyq,qvq;
void ee(int &a,int &b,int c){ //右移
int w=a,e=b;
while(c--){
a=pos[w][e].ex;
b=pos[w][e].ey;
w=a;
e=b;
}
}
void ww(int &a,int &b,int c){ //左移
int w=a,e=b;
while(c--){
a=pos[w][e].wx;
b=pos[w][e].wy;
w=a;
e=b;
}
}
void nn(int &a,int &b,int c){ //上移
int w=a,e=b;
while(c--){
a=pos[w][e].nx;
b=pos[w][e].ny;
w=a;
e=b;
}
}
void ss(int &a,int &b,int c){ // 下移
int w=a,e=b;
while(c--){
a=pos[w][e].sx;
b=pos[w][e].sy;
w=a;
e=b;
}
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++){
cin>>qwq[i][j];
pos[i][j].nx=i-;
pos[i][j].ny=j;
pos[i][j].sx=i+;
pos[i][j].sy=j;
pos[i][j].wx=i;
pos[i][j].wy=j-;
pos[i][j].ex=i;
pos[i][j].ey=j+;
}
for (int i=;i<=n;i++){
pos[i][].ex=i;
pos[i][].ey=;
pos[i][n+].wx=i;
pos[i][n+].wy=n;
}
for (int i=;i<=m;i++){
pos[][i].sx=;
pos[][i].sy=i;
pos[n+][i].nx=n;
pos[n+][i].ny=i;
}
while (q--){
scanf("%d%d%d%d%d%d",&x1,&y3,&x2,&y2,&r,&l);
qvq=;tmp1=;tmp2=;
a=pos[x1][].ex;b=pos[x1][].ey;y3--;
ee(a,b,y3);
c=pos[x2][].ex;d=pos[x2][].ey;y2--;
ee(c,d,y2);
while (true){
if (tmp1==) {
pos[pos[c][d].wx][pos[c][d].wy].ex=a;
pos[pos[c][d].wx][pos[c][d].wy].ey=b;
pos[pos[a][b].wx][pos[a][b].wy].ex=c;
pos[pos[a][b].wx][pos[a][b].wy].ey=d;
qxq=pos[a][b].wx;
qyq=pos[a][b].wy;
pos[a][b].wx=pos[c][d].wx;
pos[a][b].wy=pos[c][d].wy;
pos[c][d].wx=qxq;
pos[c][d].wy=qyq;
}
if (tmp2==) {
pos[pos[c][d].nx][pos[c][d].ny].sx=a;
pos[pos[c][d].nx][pos[c][d].ny].sy=b;
pos[pos[a][b].nx][pos[a][b].ny].sx=c;
pos[pos[a][b].nx][pos[a][b].ny].sy=d;
qxq=pos[a][b].nx;
qyq=pos[a][b].ny;
pos[a][b].nx=pos[c][d].nx;
pos[a][b].ny=pos[c][d].ny;
pos[c][d].nx=qxq;
pos[c][d].ny=qyq;
}
if (tmp1==l-) {
pos[pos[c][d].ex][pos[c][d].ey].wx=a;
pos[pos[c][d].ex][pos[c][d].ey].wy=b;
pos[pos[a][b].ex][pos[a][b].ey].wx=c;
pos[pos[a][b].ex][pos[a][b].ey].wy=d;
qxq=pos[a][b].ex;
qyq=pos[a][b].ey;
pos[a][b].ex=pos[c][d].ex;
pos[a][b].ey=pos[c][d].ey;
pos[c][d].ex=qxq;
pos[c][d].ey=qyq;
}
if (tmp2==r-) {
pos[pos[c][d].sx][pos[c][d].sy].nx=a;
pos[pos[c][d].sx][pos[c][d].sy].ny=b;
pos[pos[a][b].sx][pos[a][b].sy].nx=c;
pos[pos[a][b].sx][pos[a][b].sy].ny=d;
qxq=pos[a][b].sx;
qyq=pos[a][b].sy;
pos[a][b].sx=pos[c][d].sx;
pos[a][b].sy=pos[c][d].sy;
pos[c][d].sx=qxq;
pos[c][d].sy=qyq;
}
if ((qvq==)&&(tmp1==l-)) qvq=;
if ((qvq==)&&(tmp2==r-)) qvq=;
if ((qvq==)&&(tmp1==)) qvq=;
if (qvq==) {tmp1++;ee(a,b,);ee(c,d,);}
if (qvq==) {tmp2++;ss(a,b,);ss(c,d,);}
if (qvq==) {tmp1--;ww(a,b,);ww(c,d,);}
if (qvq==) {tmp2--;nn(a,b,);nn(c,d,);}
if ((qvq==)&&(tmp2==)) break;
}
}
a=;b=;
a=pos[][].sx;
b=pos[][].sy;
x=a,y=b;
c=a,d=b;
while (true){
cout<<qwq[x][y]<<' ';
if ((pos[x][y].sx==n+)&&(pos[x][y].sy==m)&&(pos[x][y].ex==n)&&(pos[x][y].ey==m+)) break;
if (pos[x][y].ey==m+) {
c=pos[a][b].sx;
d=pos[a][b].sy;
a=c;
b=d;
x=c;
y=d;
cout<<endl;
continue;
}
x=pos[c][d].ex;
y=pos[c][d].ey;
c=x;
d=y;
}
return ;
}
神奇的代码
这里在整个矩形的外围还围了一圈,这一圈是不会变动的,方便我们定位要修改的矩形的左上角在哪。
实际上只要每个点记录右边和下面的关系就好了。
码力很重要
JZOJ.5281【NOIP2017模拟8.15】钦点的更多相关文章
- JZOJ.5279【NOIP2017模拟8.15】香港记者
Description
- JZOJ.5280【NOIP2017模拟8.15】膜法师
Description
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- [JZOJ 5906] [NOIP2018模拟10.15] 传送门 解题报告(树形DP)
题目链接: https://jzoj.net/senior/#contest/show/2528/2 题目: 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传 ...
- [JZOJ 5905] [NOIP2018模拟10.15] 黑暗之魂(darksoul) 解题报告 (拓扑排序+单调队列+无向图基环树)
题目链接: http://172.16.0.132/senior/#main/show/5905 题目: oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰 ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
- JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)
5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...
随机推荐
- ASP.NET MVC3 系列教程 - 模型
I:基础绑定的实现 1.在前面的两篇基础文章(路由 及 控制器&视图)当中,还没对QueryString的绑定进行介绍,因为我觉得它更适合放在这一章节中去介绍.我们在用WebForm去开发的时 ...
- CSS3使用盒模型实现三栏布局
本篇文章由:http://xinpure.com/css3-box-model-to-implement-a-three-column-layout/ 使用 Position 绝对定位也是可以实现三栏 ...
- VSCode集成Git代码管理
一.安装和配置VSCode与Git 1.下载Git并安装: https://git-scm.com/download/ 2.下载VSCode并进行安装: https://code.visualstud ...
- Xcode中利用git源代码版本号控制
git是一个版本号控制系统,能够通过命令行来调用,也有专门的桌面软件.这里主要介绍在Xcode中怎样利用git来进行版本号的控制. 一.创建git源 从Xcode5開始引入了使用git的一些新特性.将 ...
- Wpf ScrollBar自定义样式
Wpf的ScrollBar可以分为六个区域:A.背景.B.向上按钮.C.向下的按钮.D.Track里面向上的按钮.E.Track里面向下的按钮.F.Track的Thumb 详情见下图 下面通过一个例子 ...
- Spark-shell 无法启动之网络问题
由于需要首次手动安装sbt,需要联网,故将虚拟机的网络适配器模式设置为"桥接模式",这样就可以和互联网相连接. 但是后面执行"spark-shell --master ...
- container_of学习笔记
最近在学习c语言宏编程,看到了container_of宏,深入学习了一天,做个笔记留念. 1.看一下书上写的container_of的版本: #define offsetof(TYPE,MEMBER) ...
- Atitit. Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Atitit. Exception in thread "main" java.lang.Error: Unresolved compilation problem: 1.1. ...
- Atitit.swt 线程调用ui控件的方法
Atitit.swt 线程调用ui控件的方法 1 SwingUtilities.invokeLater1 2 display.asyncExec方法1 3 display.timerExec(500 ...
- ajax请求的data数据格式
ajax提交data类型 一.问题来源 今天使用ajax时,发现get传data时,传递json字符串时传不过去参数,所以做了一些实验测试ajax的get和post的传递data时的不同. 二.概念 ...