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 ...
随机推荐
- php fpm安装curl后,nginx出现connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied)的错误
这里选择直接apt-get安装,因为比起自己编译简单多了,不需要自己配置什么 #sudo apt-get install curl libcurl3 libcurl3-dev php5-curl 安装 ...
- iOS触摸事件哦
主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在视图的层次结构里找到能响应消息的那个视图.(2)然后在找到的视图里处理消息 ...
- Docker构建nginx的nginx-rtmp-module视频服务器镜像
文章地址:https://www.cnblogs.com/linyilong3/p/5862595.html GitHub nginx-rtmp-module 及配置 Dockerfile构建配置: ...
- java基础讲解11-----java中的异常
1.java利用 try catch语句块捕获异常 2.finally语句 表示总是执行,不管程序是否异常 注意:1.在finally语句块异常 2.在前面的代码中使用Sysrtem.exit ...
- js中keydown和keypress的区别
keydown和keypress这些事件是当一个对象具有焦点时进行按下或松开一个键时发生的. keydown在按下的时候返回键盘上的代码值,然后由TranslateMessage函数翻译成字符,并且由 ...
- ASP.Net 自定义HttpModule注册管道事件
背景: 一个请求在到达处理器时 可能需要做很多重复的工作 比如使用固定的算法推算出用户id 角色 如果在应用程序各处做重复解析 会产生大量代码冗余 还有能想到的诸如记录访问者 应用日志 统计流量 ...
- maven打包classes为jar
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-p ...
- linux之mail
使用该命令自动把系统发给root用户的邮件发送到自己的邮箱 #vi /etc/aliases # 编辑该文件并在最后一行添加即可,如图所示
- emblog后台拿shell
emlog版本:5.3.1 先本地弄好shell 新建一个文件夹,里面放shell,shell名称和文件名要一致.压缩为zip 然后在安装插件处上传. 成功后的路径content/plugins/te ...
- org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class
转载自:http://songjianyong.iteye.com/blog/1663170 org.springframework.transaction.CannotCreateTransacti ...