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 }
时间: 2024-12-25 07:32:29

UOJ【UR #12】实验室外的攻防战的相关文章

[UOJ #180][UR #12]实验室外的攻防战(树状数组)

Description 时针指向午夜十二点,约定的日子——2月28日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 picks 博士所在的实验室. 当然,picks 博士不会坐以待毙,他早就率领着他的猴子们在实验室外修筑了许多的坚固防御工事. 经过跳蚤侦察兵的勘察,跳蚤国王发现 picks 博士的防御工事有着 n 处薄弱点,于是他把他的跳蚤大军分成了 n 支小队,并打算让它们分别进攻每一个薄弱点.但是因为战场混乱,这 n 支小队的位置被打乱了,重新整队之后,跳蚤国王发现第 i

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

[题目链接] 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<

uoj180 【UR #12】实验室外的攻防战

题目 我们发现对于排列\(A\)中,一组\(i<j,a_i<a_j\),那么我们不可能通过交换把\(a_j\)换到\(a_i\)前面 但是一组\(i<j,a_i>a_j\),我们却可以通过交换使得\(a_j\)更靠前,也就是我们在\(A\)中的交换只能消除一些逆序对,而不能产生新的逆序对 于是我们想要得到排列\(B\),必须使得\(B\)中的任意一个逆序对在\(A\)中也是逆序的,否则就不可能通过交换使得\(A\)变成\(B\):即一旦\(B\)中一个逆序对在\(A\)中是顺序的,

Python 观察者模式 (刺客护卫攻防战)

想了个挺二的例子.剑客是刺客,是被锁定的目标.忍者和火枪手是观察者,观察刺客的移动和攻击. lineseq = '==' * 20 class Assassin( object ): def __init__( self, name, position ): self._name = name self._position = position[:] self._list_of_observer_guards = [] def be_locked_target( self, guard ): i

嵌入式软件设计第12实验报告-140201133-李宇昕

学号:140201133                   姓名:李宇昕 组别:第3组           实验地点:D19 一.实验目的: 1.掌握通过GSM短信远程与嵌入式设备进行交互的方法. 二.实验内容: 1.编写程序把嵌入式开发板采集到的温度信息通过GSM短信传送给指定号码.(每10秒发送1次) 2.编写程序,使手机可以通过短信指令的方式控制嵌入式开发板的蜂鸣器和LED灯.(比如手机编辑"BEEP_ON"和"BEEP_OFF"控制嵌入式开发板的蜂鸣器)

12 实验二 递归下降语法分析 11/26

一.实验目的: 利用C语言编制递归下降分析程序,并对简单语言进行语法分析. 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析. 二.实验原理 每个非终结符都对应一个子程序. 该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端: 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析:不匹配,则进行出错处理 每遇到一个非终结符,则调用相应的子程序 三.实验要求说明 输入单词串,以“#

Android安全攻防战,反编译与混淆技术完全解析(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/49738023 之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值得骄傲的事情.不过单纯从技术角度上来讲,掌握反编译功能确实是一项非常有用的技能,可能平常不太会用得到,但是一旦真的需要用到的了,而你却不会的话,那就非常头疼了.另外既然别人可以反编译程序,我们当然有理由应该对程序进行一定程度的保护,因此代码混淆也是我们必须要掌握的一项技术.那么最近的两篇文章我们就围

UOJ UR#2树上GCD(缓存)

#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; int read() { int x=0,f=1; char ch=getchar(); while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();} whi

变革还是绝杀 汽车内置导航的攻防战

对于很多人来说,汽车远远不只是一个代步工具,更是象征着"诗与远方".而能够支撑这个梦想的,"不迷路"的导航当属最大臂助.但对于汽车内置导航来说,当下却面临着一个迫在眉睫的问题--汽车厂商想继续借导航提价,消费者却对内置地图愈发不满. 尤其是当人们借助智能手机拥有更好且几乎免费的地图去导航时,为何还需花费上千元乃至更高的价钱去为汽车内置导航买单?就此,一场有关汽车内置导航的攻防战也正式拉开序幕. 汽车内置导航的弊端:更新慢.不聪明..昂贵 虽然汽车已经有百余年的历史且