UOJ【UR #12】实验室外的攻防战
生活随笔
收集整理的這篇文章主要介紹了
UOJ【UR #12】实验室外的攻防战
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
給出一個排列$A$,問是否能夠經過以下若干次變換變為排列$B$
變換:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$
考慮一個數字從A排列到B排列連出來的路徑與其他數字是否相交,相交就表示大小關系需要判斷,(類似于二維偏序)用線段樹維護區間最小值即可。
?
?
權值為1,2的線分別與權值為4的線相交,而且4在它們左邊,所以需要判斷它們的大小關系,發現${4>1}$,${4>2}$,所以滿足條件。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 #include<cstdlib> 6 #include<cmath> 7 #include<cstring> 8 using namespace std; 9 #define maxn 20000010 10 #define MAXN 2000100 11 #define llg int 12 #define inf 0x7fffffff 13 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); 14 llg n,m,minl[maxn],a[MAXN],c[MAXN],rank[MAXN]; 15 16 llg min_(llg o,llg l,llg r,llg L,llg R) 17 { 18 if (l>=L && r<=R) 19 { 20 return minl[o]; 21 } 22 llg lc=o<<1,rc=o<<1|1,mid=(l+r)>>1; 23 llg ans=inf; 24 if (L<=mid) ans=min(ans,min_(lc,l,mid,L,R)); 25 if (R>mid) ans=min(ans,min_(rc,mid+1,r,L,R)); 26 return ans; 27 } 28 29 void add(llg o,llg l,llg r,llg wz,llg val) 30 { 31 if (l==r) 32 { 33 minl[o]=val; 34 return ; 35 } 36 llg lc=o<<1,rc=o<<1|1,mid=(l+r)>>1; 37 if (wz<=mid) add(lc,l,mid,wz,val); 38 if (wz>mid) add(rc,mid+1,r,wz,val); 39 minl[o]=min(minl[lc],minl[rc]); 40 } 41 inline int getint() 42 { 43 int w=0,q=0; 44 char c=getchar(); 45 while((c<'0' || c>'9') && c!='-') c=getchar(); 46 if (c=='-') q=1, c=getchar(); 47 while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); 48 return q ? -w : w; 49 } 50 int main() 51 { 52 //yyj("C"); 53 cin>>n; 54 for (llg i=1;i<=n;i++) a[i]=getint(); 55 for (llg i=1;i<=n;i++) c[i]=getint(); 56 for (llg i=1;i<=n;i++) rank[c[i]]=i; 57 for (llg i=1;i<=20000000;i++) minl[i]=inf; 58 for (llg i=1;i<=n;i++) 59 { 60 llg x=rank[a[i]]; 61 llg v=min_(1,1,n,x,n); 62 if (a[i]>v) {cout<<"NO"; return 0;} 63 add(1,1,n,x,a[i]); 64 } 65 cout<<"YES"; 66 return 0; 67 }
?
轉載于:https://www.cnblogs.com/Dragon-Light/p/6376947.html
總結
以上是生活随笔為你收集整理的UOJ【UR #12】实验室外的攻防战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS之一个iOS开发人员完整的学习路线
- 下一篇: 关于vue,angularjs1,rea