码迷,mamicode.com
首页 > 其他好文 > 详细

【UR #12】实验室外的攻防战(BIT)

时间:2016-03-16 22:14:21      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

 

【题目链接】

 

    http://uoj.ac/problem/180

 

【题意】

 

    给定两个1..n的排列AB,只有当ai<ai+1才能交换ai和ai+1,问是否能够将A转换为B。

 

【思路】

 

    令a[i]表示i在A中的出现位置,b[i]表示i在B中的出现位置。

    若满足i<j,且不存在a[i]<a[j]&&b[i]>a[j]则输出YES,否则输出NO。

    用个树状数组维护最大值即可判断。

 

【证明】

 

  技术分享

 

【代码】

 1 #include<set>
 2 #include<cmath>
 3 #include<queue>
 4 #include<vector>
 5 #include<cstdio>
 6 #include<cstring>
 7 #include<iostream>
 8 #include<algorithm>
 9 #define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
10 #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
11 using namespace std;
12 
13 typedef long long ll;
14 const int N = 2e5+10; 
15 
16 ll read() {
17     char c=getchar();
18     ll f=1,x=0;
19     while(!isdigit(c)) {
20         if(c==-) f=-1; c=getchar();
21     }
22     while(isdigit(c))
23         x=x*10+c-0,c=getchar();
24     return x*f;
25 }
26 
27 int a[N],b[N],X[N];
28 int n;
29 
30 int C[N];
31 void upd(int x,int v) 
32 {
33     for(;x<=n;x+=x&-x) 
34         C[x]=max(C[x],v);
35 }
36 int query(int x)
37 {
38     int res=0;
39     for(;x;x-=x&-x) 
40         res=max(res,C[x]);
41     return res;
42 }
43 
44 int main()
45 {
46     n=read();
47     FOR(i,1,n) {
48         X[i]=read();
49         a[X[i]]=i;
50     }
51     FOR(i,1,n) {
52         X[i]=read();
53         b[X[i]]=i;
54     }
55     FOR(i,1,n) {
56         int x=query(a[i]);
57         if(b[i]<x) { puts("NO"); return 0; }
58         upd(a[i],b[i]);
59     }
60     puts("YES");
61     return 0;
62 }

 

P.S. UOJ 棒棒哒~

 

【UR #12】实验室外的攻防战(BIT)

标签:

原文地址:http://www.cnblogs.com/lidaxin/p/5285368.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!