2867 Where Are My Genes
問題概要
数列a1,a2,……,anに転置(i,j)を施すと、aiからajの部分が逆順になる。
元の数列は1,2,3,...,Nで、ここに与えられた転置を施すとき、元の数列のi番目の数字は何番目に来るか答えよ。
N≦50000,転置回数≦1000,求める数字の個数≦100を満たす。
解法
Nが大きいので転置を全てシミュレートするとTLE.
クエリが少ないので、クエリにある数だけ行き先を調べる。
i番目の数が転置(a,b)の影響を受けると、a+b-iの位置に来る。
ソースコード
int n,r,q,a[1000],b[1000],cs; int main() { while(scanf("%d",&n),n) { printf("Genome %d\n",++cs); scanf("%d",&r); rep(i,r)scanf("%d%d",a+i,b+i); scanf("%d",&q); rep(i,q) { int p; scanf("%d",&p); rep(j,r)if(a[j]<=p&&p<=b[j])p=a[j]+b[j]-p; printf("%d\n",p); } } return 0; }