[日常训练]变戏法
Description
一開始有$n$個只有顏色不同的小球。定義使用一次膜法的效果是重新排列第$l_i$個到第$r_i$個小球。給定了$n$個小球的初始狀態(tài)和最終狀態(tài),以及$m$次膜法的范圍$l_i,r_i$。判斷是否可以從初始狀態(tài)轉(zhuǎn)移到最終狀態(tài)。
Input
第一行有一個整數(shù)$t$表示數(shù)據(jù)組數(shù)。
每組數(shù)據(jù)中,
第一行兩個整數(shù)$n,m$,表示總共有$n$個小球,$m$次操作。
第二行$n$個整數(shù)$a_i$,表示初始狀態(tài)。
第三行$n$個整數(shù)$b_i$,表示最終狀態(tài)。
接下來$m$行,每行兩個整數(shù)$l_i,r_i$。
Output
輸出共$t$行。對于每組數(shù)據(jù),如果合法,輸出"$TAK$",否則輸出"$NIE$"。
Sample Input
3
10 3
1 2 3 4 5 6 7 8 9 10
2 1 3 6 4 5 9 8 7 10
4 8
1 3
5 9
10 3
1 2 3 4 5 6 7 8 9 10
2 1 3 6 10 4 5 9 8 7
4 8
1 3
5 9
10 3
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 9
4 8
1 3
5 9
Sample Output
TAK
NIE
NIE
HINT
$1\;\leq\;t\;\leq\;10,1\;\leq\;n,m,a_i,b_i\;\leq\;1000$.
Solution
對于顏色相同的小球,如果可行,一定存在一種不改變它們相對順序的方法。所以我們可以將所有小球一一對應(yīng)。然后將最終狀態(tài)的小球從$1$到$n$標(biāo)號,然后每次操作相當(dāng)于區(qū)間排序。最后判斷是否相等即可。
#include<cmath> #include<ctime> #include<queue> #include<stack> #include<cstdio> #include<vector> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 1005 using namespace std; int a[N],c[N][N],t[N],n,m,ti; bool flag; inline int read(){int ret=0;char c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c)){ret=(ret<<1)+(ret<<3)+c-'0';c=getchar();}return ret; } inline void Aireen(){ti=read();while(ti--){n=read();m=read();memset(t,0,sizeof(t));for(int i=1;i<=n;++i)a[i]=read();for(int i=1,k;i<=n;++i){k=read();c[k][++t[k]]=i;}for(int i=n,k;i;--i){k=a[i];a[i]=c[k][t[k]--];}for(int i=1,l,r;i<=m;++i){l=read();r=read();sort(a+l,a+1+r);}flag=true;for(int i=1;i<=n;++i)if(a[i]!=a[i-1]+1){flag=false;break;}if(flag) puts("TAK");else puts("NIE");} } int main(){freopen("mogic.in","r",stdin);freopen("mogic.out","w",stdout);Aireen();fclose(stdin);fclose(stdout);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/AireenYe/p/6243701.html
總結(jié)
- 上一篇: 关于C中内存操作
- 下一篇: 将jsp页面转化为图片或pdf(一)(q