# |
제출 시각 |
아이디 |
문제 |
언어 |
결과 |
실행 시간 |
메모리 |
286890 |
2020-08-31T06:29:07 Z |
문홍윤(#5790) |
회전 (JOI12_rotate) |
C++17 |
|
1016 ms |
26104 KB |
#include <bits/stdc++.h>
#define eb emplace_back
#define mp make_pair
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define svec(x) sort(x.begin(), x.end())
#define press(x) x.erase(unique(x.begin(), x.end()), x.end())
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
typedef pair<int, LL> pil;
typedef pair<LL, int> pli;
const LL llinf=2e18;
const int inf=1e9;
struct NODE{
char c;
int link[4];
}nd[2100000];
int n, q, re, num[1010][1010];
char str[1010][1010];
inline int get_dir(int nw, int from){
for(int j=0; j<4; j++){
if(nd[nw].link[j]==from)return j;
}
}
void init_linkedlist(){
for(int i=0; i<=n+1; i++){
for(int j=0; j<=n+1; j++)num[i][j]=++re;
}
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++)nd[num[i][j]].c=str[i][j];
}
for(int i=0; i<=n; i++){
for(int j=0; j<=n+1; j++){
nd[num[i][j]].link[0]=num[i+1][j];
}
}
for(int i=0; i<=n+1; i++){
for(int j=0; j<=n; j++){
nd[num[i][j]].link[1]=num[i][j+1];
}
}
for(int i=1; i<=n+1; i++){
for(int j=0; j<=n+1; j++){
nd[num[i][j]].link[2]=num[i-1][j];
}
}
for(int i=0; i<=n+1; i++){
for(int j=1; j<=n+1; j++){
nd[num[i][j]].link[3]=num[i][j-1];
}
}
}
vector<int> get_line_y(int x, int sy, int ey){
int prv=num[x][0], nw=nd[num[x][0]].link[1], num=1;
vector<int> ret;
if(sy==0)ret.eb(prv);
while(1){
if(num>ey)return ret;
if(sy<=num)ret.eb(nw);
int to=get_dir(nw, prv);
to=(to+2)%4;
prv=nw;
nw=nd[nw].link[to];
num++;
}
}
vector<int> get_line_x(int y, int sx, int ex){
int prv=num[0][y], nw=nd[num[0][y]].link[0], num=1;
vector<int> ret;
if(sx==0)ret.eb(prv);
while(1){
if(num>ex)return ret;
if(sx<=num)ret.eb(nw);
int to=get_dir(nw, prv);
to=(to+2)%4;
prv=nw;
nw=nd[nw].link[to];
num++;
}
}
void print_linkedlist(){
for(int i=1; i<=n; i++){
vector<int> vc=get_line_y(i, 1, n);
for(auto j:vc)printf("%c", nd[j].c);
puts("");
}
}
void query(int sx, int sy, int ex, int ey){
vector<int> u=get_line_y(sx-1, sy-1, ey+1);
vector<int> d=get_line_y(ex+1, sy-1, ey+1);
vector<int> l=get_line_x(sy-1, sx-1, ex+1);
vector<int> r=get_line_x(ey+1, sx-1, ex+1);
reverse(all(u)); reverse(all(r));
vector<int> u2, d2, l2, r2;
for(int i=1; i<ex-sx+2; i++){
int to=get_dir(l[i], l[i+1]);
to=(to+1)%4;
l2.eb(nd[l[i]].link[to]);
}
for(int i=1; i<ex-sx+2; i++){
int to=get_dir(r[i], r[i+1]);
to=(to+1)%4;
r2.eb(nd[r[i]].link[to]);
}
for(int i=1; i<ex-sx+2; i++){
int to=get_dir(u[i], u[i+1]);
to=(to+1)%4;
u2.eb(nd[u[i]].link[to]);
}
for(int i=1; i<ex-sx+2; i++){
int to=get_dir(d[i], d[i+1]);
to=(to+1)%4;
d2.eb(nd[d[i]].link[to]);
}
for(int i=1; i<ex-sx+2; i++){
int to=get_dir(l[i], l[i+1]);
to=(to+1)%4;
int from=get_dir(l2[i-1], l[i]);
nd[l[i]].link[to]=u2[i-1];
nd[l2[i-1]].link[from]=d[i];
}
for(int i=1; i<ex-sx+2; i++){
int to=get_dir(d[i], d[i+1]);
to=(to+1)%4;
int from=get_dir(d2[i-1], d[i]);
nd[d[i]].link[to]=l2[i-1];
nd[d2[i-1]].link[from]=r[i];
}
for(int i=1; i<ex-sx+2; i++){
int to=get_dir(r[i], r[i+1]);
to=(to+1)%4;
int from=get_dir(r2[i-1], r[i]);
nd[r[i]].link[to]=d2[i-1];
nd[r2[i-1]].link[from]=u[i];
}
for(int i=1; i<ex-sx+2; i++){
int to=get_dir(u[i], u[i+1]);
to=(to+1)%4;
int from=get_dir(u2[i-1], u[i]);
nd[u[i]].link[to]=r2[i-1];
nd[u2[i-1]].link[from]=l[i];
}
}
int main(){
scanf("%d %d", &n, &q);
for(int i=1; i<=n; i++)scanf("%s", str[i]+1);
init_linkedlist();
for(int i=1; i<=q; i++){
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
query(a, b, a+c-1, b+c-1);
}
print_linkedlist();
}
Compilation message
rotate.cpp: In function 'int get_dir(int, int)':
rotate.cpp:30:1: warning: control reaches end of non-void function [-Wreturn-type]
30 | }
| ^
rotate.cpp: In function 'int main()':
rotate.cpp:154:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
154 | scanf("%d %d", &n, &q);
| ~~~~~^~~~~~~~~~~~~~~~~
rotate.cpp:155:33: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
155 | for(int i=1; i<=n; i++)scanf("%s", str[i]+1);
| ~~~~~^~~~~~~~~~~~~~~~
rotate.cpp:159:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
159 | scanf("%d %d %d", &a, &b, &c);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
1024 KB |
Output is correct |
2 |
Correct |
4 ms |
1024 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
615 ms |
25976 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
666 ms |
25936 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
698 ms |
25908 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
793 ms |
26104 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
838 ms |
25908 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
918 ms |
25904 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
955 ms |
26012 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
980 ms |
25976 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1016 ms |
25976 KB |
Output is correct |