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 ...
随机推荐
- mongodb安装的两条命令
1. 安装 下载并安装,注意安装方式为custom,路径自定义(d:\chengxu\mongodb),安装成功后在mongodb文件夹下新建data文件夹(内新建db文件夹)和logs文件夹(内新建 ...
- Win7各个版本之间的区别
Windows7包含6个版本,分别为Windows7 Starter(初级版).Windows7 Home Basic(家庭普通版).Windows7 Home Premium(家庭高级版).Wind ...
- Atitit.获取某个服务 网络邻居列表 解决方案
Atitit.获取某个服务 网络邻居列表 解决方案 原理,带入某个ip扫描从0---255 很快,多线程几秒就可以出来. 使用CountDownLatch来join线程.. 返回 [{ " ...
- Makefile 之 $(Q)
# To put more focus on warnings, be less verbose as default # Use 'make V=1' to see the full command ...
- jdk8 StreamApi
List<User> userList=new ArrayList<>(); userList.add(User.builder().age().name()).build() ...
- 猫猫学iOS 之微博项目实战(5)微博自己定义搜索框searchBar
猫猫分享.必须精品 原创文章.欢迎转载. 转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 用UITextField简单定义一个搜索框 二:调用 ...
- nodejs对文件进行分页
//从文件中提取文件指从x行到y行的内容 //awk -v start=5 -v end=10 -F "\x01" '{if(NR>=start && NR& ...
- oracle 存储过程中使用date 时、分、秒丢失
今天有一开发兄弟找我.说出现一奇怪现象,在存储过程中赋date类型的值,时.分.秒都丢失了,以下来做个试验: SQL> drop table test purge; SQL> create ...
- 用HTML5/CSS3/JS开发Android/IOS应用框架大全
现在人人都想成为安卓/IOS应用开发工程师.其实,安卓/IOS应用可以用很多种语言来实现.由于我们前端开发工程师,对HTML5/CSS/JavaScript的网络编程已经相当熟悉了.所以,今天大家将会 ...
- Easyui data方法扩展finder
finder: function(jq, conditions){ if(!$(jq).data("OriginalData")){ $(jq).data("Origin ...