나는 반례찾기를 잘 못하는것 같다..ㅜ
알고리즘 구현까지는 쉬운데 그 후에 세부적인 반례에서 자꾸 오래걸린다..
이 코드는 알고리즘은 어렵지 않았다.
일부러 배열을 index+1로 한 후 0번째를 비워두고 1~index까지 이용했다.
입력을 차례차례 받은 후
남자일 경우 배수만큼 0->1 1->0 해주고
여자일 경우 f(n+1) == f(n-1) 일 경우 반대 해주는 식으로 썼다.
이 문제의 키포인트는 알고리즘 구현이 아닌.. 세부적인 범위 조절이었던 것 같다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int x =Integer.parseInt(st.nextToken());
int swt[]=new int[x+1];
int sex, num,stu;
st = new StringTokenizer(br.readLine());
for(int i=1;i<=x;i++) {
swt[i]=Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
stu =Integer.parseInt(st.nextToken());
for(int i=1;i<=stu;i++) {
st = new StringTokenizer(br.readLine());
sex =Integer.parseInt(st.nextToken());
num =Integer.parseInt(st.nextToken());
int num_2;
if(sex==1) {
num_2=num;
while(num_2<=x) {
swt[num_2]=opposite(swt[num_2]);
num_2+=num;
}
}
else if(sex==2) {
swt[num]=opposite(swt[num]);
int t=1;
while((((num-t)>0)&&((num+t)<=x)&&swt[num-t]==swt[num+t])) {
swt[num-t]=opposite(swt[num-t]);
swt[num+t]=opposite(swt[num+t]);
t++;
}
}
}
for(int i=1;i<=x;i++) {
if(i!=1 && i%20==1)
System.out.print("\n");
System.out.print(swt[i]+" ");
}
}
public static int opposite(int x) {
if (x==0)
x=1;
else if (x==1)
x=0;
return x;
}
}