题目链接:https://codeforces.com/problemset/problem/1136/D

题意:

给出 $1 \sim n$ 的某个排列 $p$,再给出若干 $(x,y)$ 表示当序列中出现 $x,y$ 时,两者可以交换位置。问序列中最末尾的数可以前进多少步。

题解:

如果 $p[n-1]$ 可以与 $p[n]$ 交换位置,那么肯定是立刻交换,因为首先 $p[n-1]$ 只能最多只能产生 $1$ 步的贡献,同时就算把 $p[n-1]$ 往前换,等到在未来某个时刻再跟 $p[n]$ 交换,也不可能使得前进步数更多(自己画画就能明白),因此不如立刻换掉。

如果此时 $p[n-1]$ 与 $p[n]$ 不能交换位置,那么想要前进,必然要找一个能 $p[x]$ 能和我 $p[n]$ 交换的,和上面同样的道理,找远的 $x$ 不会比找近的 $x$ 更优,因此优先找最近的那个 $p[x]$ 来跟我交换位置即可。

(这题的序列存储我用了数组模拟链表,时间复杂度是 $O(n \log m)$,不知道我是不是写复杂了……)

AC代码:

#include<bits/stdc++.h>
#define pb(x) push_back(x)
using namespace std;
const int maxn=3e5+;
const int maxm=5e5+;
int n,m;
int a[maxn];
int head,tail,pre[maxn],nxt[maxn];
map<int,bool> mp[maxn]; bool check(int x,const vector<int>& v)
{
for(auto y:v) if(mp[x][y]==) return ;
return ;
}
int main()
{
ios::sync_with_stdio();
cin.tie(), cout.tie(); cin>>n>>m;
nxt[head=]=, pre[tail=n+]=n;
for(int i=;i<=n;i++) cin>>a[i], pre[i]=i-, nxt[i]=i+;
for(int i=,x,y;i<=m;i++) cin>>x>>y, mp[x][y]=; vector<int> need;
need.pb(a[n]);
for(int x=pre[n];x>head;x=pre[x])
{
if(check(a[x],need))
{
int L=pre[x], R=nxt[x];
nxt[L]=R, pre[R]=L;
}
else need.pb(a[x]);
} int cnt=;
for(int p=nxt[head];p<tail;p=nxt[p]) cnt++;
cout<<n-cnt<<endl;
}

Codeforces 1136D - Nastya Is Buying Lunch - [贪心+链表+map]的更多相关文章

  1. Codeforces 1136D Nastya Is Buying Lunch (贪心)

    题意: 给一个序列和一组交换序列(a,b),当且仅当a在b的前面(不允许有间隔),这两个数才能交换,问最后一个数最多能移动多少个位置. 分析: 这题是思路是十分的巧妙呀 , 用一个数组num[x]  ...

  2. cf1136D. Nastya Is Buying Lunch(贪心)

    题意 题目链接 给出一个排列,以及\(m\)个形如\((x, y)\)的限制,表示若\(x\)在\(y\)之前则可以交换\(x, y\). 问\(n\)位置上的数最多能前进几步 \(n \leqsla ...

  3. Nastya Is Buying Lunch CodeForces - 1136D (排列)

    大意: 给定n排列, m个pair, 每个pair(u,v), 若u,v相邻, 且u在v左侧, 则可以交换u和v, 求a[n]最多向左移动多少 经过观察可以发现, 尽量先用右侧的人与a[n]交换, 这 ...

  4. Codeforces Round #546 (Div. 2)-D - Nastya Is Buying Lunch

    这道题,神仙贪心题... 题意就是我给出数的顺序,并给出多个交换,每个只能用于相邻交换,问最后一个元素,最多能往前交换多少步. 我们考虑这样一个问题,如果一个这数和a[n]发生交换,那么这个数作为后面 ...

  5. D. Nastya Is Buying Lunch

    链接 [https://codeforces.com/contest/1136/problem/D] 题意 有N个人,a[i]表示第i个人的编号,m个二元组. 当前一个在后一个的前面一个位置时二者可以 ...

  6. Nastya Is Buying Lunch

    At the big break Nastya came to the school dining room. There are nn pupils in the school, numbered ...

  7. CF1136D Nastya Is Buying Lunch

    思路: 1. 最终答案不超过能与Nastya“直接交换”的人数. 2. 对于排在j前面的i,如果i和i-j之间(包括j)的每个人都能“直接交换”,j才能前进一步. 实现: #include <b ...

  8. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

  9. Codeforces 437C The Child and Toy(贪心)

    题目连接:Codeforces 437C  The Child and Toy 贪心,每条绳子都是须要割断的,那就先割断最大值相应的那部分周围的绳子. #include <iostream> ...

随机推荐

  1. C++ 无锁数据结构

    https://www.zhihu.com/question/52629893/answer/131731126

  2. 【Android自己定义控件】圆圈交替,仿progress效果

    还是我们自定View的那几个步骤: 1.自己定义View的属性 2.在View的构造方法中获得我们自己定义的属性 3.重写onMesure (不是必须) 4.重写onDraw 自己定义View的属性 ...

  3. SharePoint 2016 - 安装QuickFlow2013

    本文记录在SharePoint 2016上安装QuickFlow的步骤. QuickFlow尚未推出针对SP16版本的安装包,不过,for SP13版本的wsp是可以直接用于SP16的 1)添加wsp ...

  4. python3 + flask + sqlalchemy +orm(2):数据库中添加表

    往数据库中添加一张保存文章的表,表明为article,字段有id,title,content 同样一个配置文件:config.py DEBUG = True #dialect+driver://roo ...

  5. Zabbix 3.4过滤多余的windows网卡监控

    在服务器上安装了zabbix 3.4.14之后,zabbix自动发现规则Network interface discovery会自动发现windows服务器上的所有网卡信息,包括一大堆的虚拟网卡等等, ...

  6. C#指定长度截取字符串 并进行拼接。

    需求:有一个字符串需要按照指定长度拆分出来,然后在增加一个字符串拼接上. /// <summary> /// 字符串截取并拼接 /// </summary> /// <p ...

  7. Fortran+ OpenMP实现实例

    PROGRAM parallel_01 USE omp_lib IMPLICIT NONE INTEGER :: i,j INTEGER() :: time_begin, time_end, time ...

  8. tf更新tensor/自定义层

    修改Tensor特定位置的值 如 stack overflow 中提到的方案. TensorFlow不让你直接单独改指定位置的值,但是留了个歪门儿,就是tf.scatter_update这个方法,它可 ...

  9. IFRAME练习 各种调用

    parent.html. <html> <head> <script type="text/javascript"> function say( ...

  10. name转json

    ^(\{)?(?<=\n)(.*)(\})?$ "$2":"", UserId UserOrderId ChargeAccount BuyNum Good ...