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 ...
随机推荐
- 资源管理器也玩多标签:QT TabBar v1.5.0.0a3
http://zmingcx.com/explorer-also-play-more-tags-qt-tabbar-v1-5-0-0a3.html浏览器中的标签浏览功能非常受欢迎,安装QT TabBa ...
- SqlServer报错:System.Data.SqlClient.SqlException
在将Asp.Net MVC4项目部署到新机器上进行调试的时候,出现了如下错误: System.Data.SqlClient.SqlException 具体的内容如下: System.Data.SqlC ...
- scrapy抓取的中文结果乱码解决办法
使用scrapy抓取的结果,中文默认是Unicode,无法显示中文. 中文默认是Unicode,如: \u5317\u4eac\u5927\u5b66 在setting文件中设置: FEED_EXPO ...
- 003实现字符串反转reverse
这个简单就直接代码了 //写代码翻转一个C风格的字符串. (C风格的意思是"abcd"须要用5个字符来表示,包括末尾的 结束字符) #include <stdio.h> ...
- Mysql bin-log日志文件处理
当MySQL开启bin-log选项后,会不停的记录bin-log,但是几天前的日志肯定就没用了或者可以备份到别处,那么如何正确的处理这些日志呢 参考一下几篇文章 MySQL mysql-bin log ...
- word中特殊符号的替换
首先在word里替换快捷键是ctrl+H,点击“更多”,会出现更多选项,在特殊格式那里可以选在各种符号,比如回车,空格什么的. 有的时候在word里看不到一些格式,需要点一下下图的对着的两个箭头图标: ...
- C#数组、ArrayList和List<T>
1.数组: 数组在内存中是连续的,索引速度快.赋值与修改简单. 数组的两个数据中间插入数据麻烦,且在声明数组的时候必须指定数组长度.数组长度过长,会浪费内存,过短会造成数据溢出. 2.ArrayLis ...
- 【实验二】Spring框架笔记——NamedParameterJdbcTemplate与具名参数
在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 在 Spring JDBC 框架中, 绑定 ...
- import _mysql----ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。
背景:安装了mysql,练习sql 操作,提示 ImportError DLL load failed: %1 不是有效的 Win32 应用程序 解决方法: 操作系统win10,64位,查看安装的my ...
- php 判断时间是否超过
$str="2014-10-11"; echo "".strtotime($str); echo "<br/>"; echo & ...