码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-05-20 16:32:03      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:pac   for   size   void   xmlns   string   大于   pre   div   

Description

时针指向午夜十二点,约定的日子——2月28日终于到来了。随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 picks 博士所在的实验室。

当然,picks 博士不会坐以待毙,他早就率领着他的猴子们在实验室外修筑了许多的坚固防御工事。

经过跳蚤侦察兵的勘察,跳蚤国王发现 picks 博士的防御工事有着 n 处薄弱点,于是他把他的跳蚤大军分成了 n 支小队,并打算让它们分别进攻每一个薄弱点。但是因为战场混乱,这 n 支小队的位置被打乱了,重新整队之后,跳蚤国王发现第 i 个位置的小队编号为 Ai(显然 A 是一个排列)。

经过计算,跳蚤国王发现,让第 i 个位置的小队编号为 Bi 时,他的军队可以发挥出最大的战斗力(保证 B 也是一个排列)。

跳蚤国王可以发出指令来改变小队们的排列顺序,每一次,他都会报出一个整数 i(1≤i<n)。如果排在第 i 个位置的小队编号大于第 i+1个位置的小队,那么这两支小队会交换顺序,否则这一个命令将会被忽略

现在跳蚤国王希望他的军队能够发挥出最强大的战斗力,于是他想要知道是否存在一种指令序列,使得小队们可以按照排列 B 的方式排列。

但是因为小队数目实在是太多,跳蚤国王一时间也没有看出答案。于是他派跳蚤绑架来了你——这附近最著名的民间科学家来帮他计算这个问题的答案。

Solution

技术分享

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#define MAXN 100005
using namespace std;
int n,x,a[MAXN],b[MAXN],c[MAXN];
int lowbit(int x){return x&-x;}
void add(int pos,int x)
{
    while(pos<=n)
    c[pos]=max(c[pos],x),pos+=lowbit(pos);
}
int query(int pos)
{
    int res=0;
    while(pos>0)
    res=max(res,c[pos]),pos-=lowbit(pos);
    return res;
} 
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {scanf("%d",&x);a[x]=i;}
    for(int i=1;i<=n;i++)
    {scanf("%d",&x);b[x]=i;}
    for(int i=1;i<=n;i++)
    {
        x=query(a[i]);
        if(x>b[i]){printf("NO\n");return 0;}
        add(a[i],b[i]);
    }
    printf("YES\n");
    return 0;
} 

 

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

标签:pac   for   size   void   xmlns   string   大于   pre   div   

原文地址:http://www.cnblogs.com/Zars19/p/6882304.html

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