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 ...
随机推荐
- Telnet使用
#使用telnet telnet #使用telnet,并连接到[ip] [port] telnet [ip] [port] baidu zone - telnet使用方法
- CentOS忘记root密码解决办法
如果是忘记普通的用户密码,那还好说,用root登录命令行界面,修改即可. 但如果是root的话,那就需要这样修改了. 记住,这几篇文章说的都是对的,只是我复杂了,实际只需要将光标移到最后" ...
- 【原创】打造基于Dapper的数据访问层
[原创]打造基于Dapper的数据访问层 前言 闲来无事,花几天功夫将之前项目里用到的一个数据访问层整理了出来.实现单个实体的增删改查,可执行存储过程,可输出返回参数,查询结果集可根据实际情况返回 ...
- ParameterizedThreadStart,ThreadStart的使用,线程Thread传参数
Thread threadWithParam = new Thread(new ParameterizedThreadStart(new ThreadTest().ShowMsg));//thread ...
- LNMP架构
LNMP架构介绍 lnmp里的php会启动一个服务,nginx把用户请求的php交给php-fpm处理,比如登录网站php要和mysql做交互,查用户的账号和密码,处理完之后,php-fpm会告诉ng ...
- .Net并行编程高级教程(二)-- 任务并行
前面一篇提到例子都是数据并行,但这并不是并行化的唯一形式,在.Net4之前,必须要创建多个线程或者线程池来利用多核技术.现在只需要使用新的Task实例就可以通过更简单的代码解决命令式任务并行问题. 1 ...
- sourceInsight设置
复制后光标定格在行尾 Options -> Preferences -> Typing -> After pasting,select:at end of pasted text t ...
- 安装gstreamer开发环境
ubuntu中安装gstreamer开发环境: * 安装gstreamer基本库,工具,以及插件 sudo apt--dev gstreamer-tools gstreamer0.-tools gst ...
- SpringBoot入门系列:第三篇 日志输出
http://blog.csdn.net/lxhjh/article/details/51752419
- iOS UITableViewHeaderFooterView设置背景色为透明
给UITableViewHeaderFooterView设置背景色分2种情况 1.tableView在group模式下,UITableViewHeaderFooterView的背景色默认是透明的,此时 ...