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

本题时限4s。

很明显这是一道模拟题,朴素算法O(nmq)看似过得去,实际上字符串的操作是很慢的,同样对字符串赋值10w次比对数组元素赋值10w次要慢3倍以上。

实际上我们可以像剪布一样,剪出边缘然后整体粘贴过去。

我们就可以建立链表,每次只用修改矩形的边缘点的关系即可。复杂度O((n + m)q)。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<algorithm>
  6 #include<cmath>
  7 #include<ctime>
  8 #define N 1005
  9 using namespace std;
 10 struct data{
 11     int nx,ny,sx,sy,ex,ey,wx,wy;
 12 }pos[N][N];
 13 string qwq[N][N],qaq;
 14 int n,m,q,x1,x2,y3,y2,l,r,tmp1,tmp2,a,b,x,y,c,d,qxq,qyq,qvq;
 15 void ee(int &a,int &b,int c){    //右移
 16     int w=a,e=b;
 17     while(c--){
 18     a=pos[w][e].ex;
 19     b=pos[w][e].ey;
 20     w=a;
 21     e=b;
 22     }
 23 }
 24 void ww(int &a,int &b,int c){   //左移
 25     int w=a,e=b;
 26     while(c--){
 27     a=pos[w][e].wx;
 28     b=pos[w][e].wy;
 29     w=a;
 30     e=b;
 31     }
 32 }
 33 void nn(int &a,int &b,int c){   //上移
 34     int w=a,e=b;
 35     while(c--){
 36     a=pos[w][e].nx;
 37     b=pos[w][e].ny;
 38     w=a;
 39     e=b;
 40     }
 41 }
 42 void ss(int &a,int &b,int c){   // 下移
 43     int w=a,e=b;
 44     while(c--){
 45     a=pos[w][e].sx;
 46     b=pos[w][e].sy;
 47     w=a;
 48     e=b;
 49     }
 50 }
 51 int main(){
 52     scanf("%d%d%d",&n,&m,&q);
 53     for (int i=1;i<=n;i++)
 54      for (int j=1;j<=m;j++){
 55       cin>>qwq[i][j];
 56       pos[i][j].nx=i-1;
 57       pos[i][j].ny=j;
 58       pos[i][j].sx=i+1;
 59       pos[i][j].sy=j;
 60       pos[i][j].wx=i;
 61       pos[i][j].wy=j-1;
 62       pos[i][j].ex=i;
 63       pos[i][j].ey=j+1;
 64     }
 65     for (int i=0;i<=n;i++){
 66         pos[i][0].ex=i;
 67         pos[i][0].ey=1;
 68         pos[i][n+1].wx=i;
 69         pos[i][n+1].wy=n;
 70     }
 71     for (int i=0;i<=m;i++){
 72         pos[0][i].sx=1;
 73         pos[0][i].sy=i;
 74         pos[n+1][i].nx=n;
 75         pos[n+1][i].ny=i;
 76     }
 77     while (q--){
 78         scanf("%d%d%d%d%d%d",&x1,&y3,&x2,&y2,&r,&l);
 79         qvq=1;tmp1=0;tmp2=0;
 80         a=pos[x1][0].ex;b=pos[x1][0].ey;y3--;
 81         ee(a,b,y3);
 82         c=pos[x2][0].ex;d=pos[x2][0].ey;y2--;
 83         ee(c,d,y2);
 84         while (true){
 85             if (tmp1==0) {
 86                 pos[pos[c][d].wx][pos[c][d].wy].ex=a;
 87                 pos[pos[c][d].wx][pos[c][d].wy].ey=b;
 88                 pos[pos[a][b].wx][pos[a][b].wy].ex=c;
 89                 pos[pos[a][b].wx][pos[a][b].wy].ey=d;
 90                 qxq=pos[a][b].wx;
 91                 qyq=pos[a][b].wy;
 92                 pos[a][b].wx=pos[c][d].wx;
 93                 pos[a][b].wy=pos[c][d].wy;
 94                 pos[c][d].wx=qxq;
 95                 pos[c][d].wy=qyq;
 96             }
 97             if (tmp2==0) {
 98                 pos[pos[c][d].nx][pos[c][d].ny].sx=a;
 99                 pos[pos[c][d].nx][pos[c][d].ny].sy=b;
100                 pos[pos[a][b].nx][pos[a][b].ny].sx=c;
101                 pos[pos[a][b].nx][pos[a][b].ny].sy=d;
102                 qxq=pos[a][b].nx;
103                 qyq=pos[a][b].ny;
104                 pos[a][b].nx=pos[c][d].nx;
105                 pos[a][b].ny=pos[c][d].ny;
106                 pos[c][d].nx=qxq;
107                 pos[c][d].ny=qyq;
108             }
109             if (tmp1==l-1) {
110                 pos[pos[c][d].ex][pos[c][d].ey].wx=a;
111                 pos[pos[c][d].ex][pos[c][d].ey].wy=b;
112                 pos[pos[a][b].ex][pos[a][b].ey].wx=c;
113                 pos[pos[a][b].ex][pos[a][b].ey].wy=d;
114                 qxq=pos[a][b].ex;
115                 qyq=pos[a][b].ey;
116                 pos[a][b].ex=pos[c][d].ex;
117                 pos[a][b].ey=pos[c][d].ey;
118                 pos[c][d].ex=qxq;
119                 pos[c][d].ey=qyq;
120             }
121             if (tmp2==r-1) {
122                 pos[pos[c][d].sx][pos[c][d].sy].nx=a;
123                 pos[pos[c][d].sx][pos[c][d].sy].ny=b;
124                 pos[pos[a][b].sx][pos[a][b].sy].nx=c;
125                 pos[pos[a][b].sx][pos[a][b].sy].ny=d;
126                 qxq=pos[a][b].sx;
127                 qyq=pos[a][b].sy;
128                 pos[a][b].sx=pos[c][d].sx;
129                 pos[a][b].sy=pos[c][d].sy;
130                 pos[c][d].sx=qxq;
131                 pos[c][d].sy=qyq;
132             }
133             if ((qvq==1)&&(tmp1==l-1)) qvq=2;
134             if ((qvq==2)&&(tmp2==r-1)) qvq=3;
135             if ((qvq==3)&&(tmp1==0)) qvq=4;
136             if (qvq==1) {tmp1++;ee(a,b,1);ee(c,d,1);}
137             if (qvq==2) {tmp2++;ss(a,b,1);ss(c,d,1);}
138             if (qvq==3) {tmp1--;ww(a,b,1);ww(c,d,1);}
139             if (qvq==4) {tmp2--;nn(a,b,1);nn(c,d,1);}
140             if ((qvq==4)&&(tmp2==0)) break;
141         }
142     }
143     a=0;b=0;
144     a=pos[0][1].sx;
145     b=pos[0][1].sy;
146     x=a,y=b;
147     c=a,d=b;
148     while (true){
149         cout<<qwq[x][y]<<‘ ‘;
150         if ((pos[x][y].sx==n+1)&&(pos[x][y].sy==m)&&(pos[x][y].ex==n)&&(pos[x][y].ey==m+1)) break;
151         if (pos[x][y].ey==m+1) {
152             c=pos[a][b].sx;
153             d=pos[a][b].sy;
154             a=c;
155             b=d;
156             x=c;
157             y=d;
158             cout<<endl;
159             continue;
160         }
161         x=pos[c][d].ex;
162         y=pos[c][d].ey;
163         c=x;
164         d=y;
165     }
166     return 0;
167 }

神奇的代码

这里在整个矩形的外围还围了一圈,这一圈是不会变动的,方便我们定位要修改的矩形的左上角在哪。

实际上只要每个点记录右边和下面的关系就好了。

码力很重要

时间: 2024-08-03 12:00:36

JZOJ.5281【NOIP2017模拟8.15】钦点的相关文章

Cisco PT模拟实验(15) 路由器的Loopback远程登录配置

Cisco PT模拟实验(15) 路由器的Loopback远程登录配置 实验目的: 掌握路由器Loopback接口的特点及作用 掌握Loopback接口的配置,实现对路由器的Telnet登录 掌握RIP动态路由和默认路由的基本配置 实验背景: 随着公司的网络环境日趋复杂,作为网络管理员,需要合理分配公司有限的网络资源(IP地址等),当网络设备发生故障时,仍能稳定地远程登录到设备进行管理,此时配置Loopback接口显得尤为重要. 技术原理: 环回(Loopback)接口,是一种应用最为广泛的虚拟

JZOJ.5331【NOIP2017模拟8.23】壕游戏

Description Input Output Sample Input 6 8 2 2 4 5  1 2 4 0 2 1 3 5 0 2 3 4 1 5 1 2 5 1 0 1 4 6 4 2 2 5 6 0 4 2 1 5 5 9 2 2 6 4 5 2 Sample Output 16 Data Constraint Hint 类似于一种可撤销的贪心,不难想到这是费用流的模型. 考虑到我们实际会用到的边比实际的边少很多,我们可以动态建边,以减少空间的使用,即当流过了一条边之后再建立第二次

JZOJ.5274【NOIP2017模拟8.14】数组

Description Input Output Sample Input 输入样例1: 3 2 7 5 4 2 输入样例2: 5 3 1 5 4 3 5 5 Sample Output 输出样例1: 999999732 输出样例2: 0 Data Constraint 这个题要求乘积最小,显然我们希望乘积是负数是最好的,然后就是让这个负数的绝对值尽可能的大. 对于一堆数相乘,绝对值最小的对这个结果影响是最大的,所以我们就每次让绝对值最小的,如果是正数就加上x,负数就减去x,用个优先队列维护绝对

JZOJ.5287【NOIP2017模拟8.16】最短路

Description Input Output Sample Input 9 10 2 1 2 1 1 4 1 3 4 1 2 3 1 3 7 1 7 8 2 7 9 2 1 5 3 1 6 4 5 6 1 1 9 5 7  Sample Output 5 6 Data Constraint 容易发现这是一张仙人掌图(每条边最多属于一个环的无向连通图) 仙人掌图求最短路的常用处理方法是将它变成一棵树,原图里为环的点更改为该环上的点都指向该环的某个点A,然后边长就是该点到点A的最短路径. 再预处

JZOJ.5329【NOIP2017模拟8.22】时间机器

Description Input Output Sample Input 3 2 2 1 4 2 3 5 1 1 4 2 2 5 1 3 2 1 3 1 2 4 1 3 5 1 1 3 2 2 5 1 2 2 1 2 2 1 2 1 1 2 1 1 2 2   Sample Output Yes No Yes Data Constraint Hint 很明显这是要让我们匹配,很容易想到可以二分图匹配,但是又有数量,于是我们可以网络流,但是n还是巨大,使得我们不得不想想其他办法. 我们的期望搭配

JZOJ.5305【NOIP2017模拟8.18】C

Description Input Output Sample Input 10 11 1 2 2 3 3 4 1 4 3 5 5 6 8 6 8 7 7 6 7 9 9 10  6 1 2 3 5 6 9 9 2 9 3 9 10  Sample Output 2 2 2 4 4 1  Data Constraint Hint 题意有点问题,实际上简单路径这里指的是不经过重复边的路径. 这题Tarjan缩点,然后LCA统计两点间环的个数k,答案就是2k个路径. 1 #include<iostr

JZOJ.5286【NOIP2017模拟8.16】花花的森林

Description Input Output Sample Input 3 1 2 3 1 2 1 3 2 1 Sample Output 6 9 6 Data Constraint Hint 题目大意就是要求删边和计算直径. 很明显每次删边后两边BFS计算直径必会超时,但我们可以通过lca和预处理节点到根节点的距离来快速计算,但删边后lca很可能有所变化,重新预处理lca的信息又太慢了. 我们可以试着逆向. 即正着删边看成反着添边. 这样子我们可以发现是等效的. 一开始每棵树的直径就是该点

JZOJ.5306【NOIP2017模拟8.18】棋盘游戏

Description 这个游戏上在一个无限大的棋盘上, 棋盘上只有一颗棋子在位置(x,y)(x,y>=0)棋盘的左下角是(0,0)Amphetamine每次都是第一个移动棋子,然后Amphetamine与Alphago轮流移动.每一轮可以做以下三种中的一种操作: 1)在同一行,将棋子从当前位置向左移动任意格:2)在同一列,将棋子从当前位置向下移动任意格: 3)将棋子从当前位置向下移动k格再向左移动k格(k为任意正整数,且要满足移动后的棋子仍然在棋盘上) 第一个不能在棋盘上移动的人比赛算输(因为

JZOJ.5307【NOIP2017模拟8.18】偷窃

Description Input Output Sample Input 5 5 1 4 0 5 2 2 1 2 0 1 0 2 3 4 4 0 3 0 3 1 1 2 2 1 1 Sample Output 9 Data Constraint Hint 本题直接做比较麻烦,加上金砖可移动. 这题就是要求我们找出一种摆放方式,三视图与之前一样且用得金块数最少. 我们可以重新构造. 对于俯视图,它提供的信息就是我们要在哪里放金砖,哪里不能放金砖. 对于正视图和侧视图,它提供的信息就是某一行或某一