zoukankan      html  css  js  c++  java
  • [UOJ #180][UR #12]实验室外的攻防战(树状数组)

    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
    ");return 0;}
            add(a[i],b[i]);
        }
        printf("YES
    ");
        return 0;
    } 
  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/Zars19/p/6882304.html
Copyright © 2011-2022 走看看