题目链接:https://codeforces.com/contest/1136/problem/D
题目大意:
给你1-n的n个数,给出一个序列,序列由这n个数组成,然后给m对数u,v,一对数u,v代表在序列中如果u和v相邻,且u在v的左边,则可以交换这两个数,现在问你序列中的最后一个数最多可以向左移动几次
思路:设序列中最后一个数为x,考虑哪些数在x的左边时可以将x向左移动,将这些数用一个集合V记录下来。
用一个指针pos指向最后一个数,然后看pos左边的数是不是这些记录下来的数中的一个,如果是的话就交换这两个数,并且将左边这个数从集合V中删除,然后pos-1,ans++,如果不是,则看pos左边这个数y,看可以将y向左移动的数有哪些,将这些数与V求交集然后更新V,因为X只能与V中的数交换,所以能与y交换的数若不在V中就不能使得X左移,然后让pos指向y,重复上面的过程,直到V为空集或者指着走到最左边
AC代码:
1 |
|