[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\n");return 0;}
        add(a[i],b[i]);
    }
    printf("YES\n");
    return 0;
} 
时间: 2024-08-28 18:57:16

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

Codeforces Beta Round #12 (Div 2 Only) D. Ball 树状数组查询后缀、最值

http://codeforces.com/problemset/problem/12/D 这里的BIT查询,指的是查询[1, R]或者[R, maxn]之间的最值,这样就够用了. 设三个权值分别是b[1], b[2], b[2]; 首先,先把b[1]值离散化,离散成一个个id,那么只能是在id比较大的地方找了.然后把b[2]排序,倒序查询,也就是先查询最大的,当然它是没可能自杀的,因为它已经最大了,然后查询完后,把它压进bit后,以后在bit查询,就不需要管b[2]了,因为在bit里面的b[2

Testing Round #12 A,B,C 讨论,贪心,树状数组优化dp

题目链接:http://codeforces.com/contest/597 A. Divisibility time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Find the number of k-divisible numbers on the segment [a, b]. In other words you need

【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着开学考试.而考试就意味着改卷,改卷 也就意味着答题卡.不幸的是,学校读答题卡的机器的评分软件坏了,wyx 就被 老师要求写一个评分的程序. [问题描述] 软件需要读入学生的姓名.试题答案以及学生的答题卡信息. 学生姓名 学校的信息管理系统中存储了所有学生的姓名,一共 名学生.每个学生的 名字的组成只

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 #in

csu 1770按钮控制彩灯实验(树状数组)

1770: 按钮控制彩灯实验 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 194  Solved: 65[Submit][Status][Web Board] Description 应 教学安排,yy又去开心的做电学实验了.实验的内容分外的简单一串按钮通过编程了的EEPROM可以控制一串彩灯.然而选择了最low的一种一对一的控制 模式,并很快按照实验指导书做完实验的yy马上感觉到十分无趣.于是他手指在一排按钮上无聊的滑来滑去,对应的彩灯也不断的

「CodePlus 2017 12 月赛」火锅盛宴(模拟+树状数组)

1A,拿来练手的好题 用一个优先队列按煮熟时间从小到大排序,被煮熟了就弹出来. 用n个vector维护每种食物的煮熟时间,显然是有序的. 用树状数组维护每种煮熟食物的数量. 每次操作前把优先队列里煮熟时间<=当前时间的弹出,BIT上+1. 每次0操作把食物塞进优先队列和vector 每次1操作先看看树状数组里有没有数,没有输出angry,有的话在树状数组上二分找到最小的数. 每次2操作先看看树状数组里有没有这一种数,有的话输出并-1,没有的话看看vector有没有,有的话输出时间差,没有的话输出

【UOJ 24】树状数组1

[题目描述]: 如题,已知有N个元素组成的数列(下标从1开始计数),你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 [输入描述]: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3个整数,表示一个操作,具体如下: 操作1: 格式:1 x k 含义:将第x个数加上k 操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和 [输出描述]: 输出包含若干

UOJ #24.树状数组1

[题目描述]: 如题,已知有N个元素组成的数列(下标从1开始计数),你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 [输入描述]: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3个整数,表示一个操作,具体如下: 操作1: 格式:1 x k 含义:将第x个数加上k 操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和 [输出描述]: 输出包含若干

UOJ #50.树状数组2

Description 如题,已知一个数列(下标从1开始计数),你需要进行下面两种操作: 1.将某区间每一个数,加上x 2.获取某一个数的值 Input 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,第i个数字表示数列第i项的初始值. 接下来M行每行包含2或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k 操作2: 格式:2 x 含义:输出第x个数的值 Output 输出包含若干行整数,