Educational Codeforces Round 89 (Rated for Div. 2) B - Shuffle (思维)

题目传送
题意
给你一个大小为n的数组,其中一个位置的元素值为1(这个位置记为x),其他的元素值为0,现在依次有m次操作,每次给定一个范围 l 和 r,你可以在这个范围内,任意选择两个数交换其值,现在问在m次操作从,数组中值为1的元素下标有几种可能?

思路
显然只要现在给定的区间内有值为1的元素,那么这个区间中所有的元素,在最后的时候都有可能变为1,那么我们现在就只需要更新他现在能到达的左边界和右边界即可。

AC代码

#include 
inline long long read(){char c = getchar();long long x = 0,s = 1;
while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}
while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();}
return x*s;}
using namespace std;
#define NewNode (TreeNode *)malloc(sizeof(TreeNode))
#define Mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x)&(-x)
const int N = 1e5 + 10;
const long long INFINF = 0x7f7f7f7f7f7f7f;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-7;
const unsigned long long mod = 998244353;
const double II = acos(-1);
const double PP = (II*1.0)/(180.00);
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> piil;
int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    ll t;
    cin >> t;
    while(t--)
    {
        ll n,x,m;
        cin >> n >> x >> m;
        ll l = x,r = x,ans = 1;//现在的左边界和右边界都是x
        while(m--)
        {
            ll a,b;
            cin >> a >> b;
            if(r >= a && b >= l)//这个条件说明区间一定相交,相交也就说明,我现在可以任意交换元素,那么这个大的区间内一定都可以变为1
                l = min(l,a),r = max(r,b);
        }
        cout << r-l+1 << endl;
    }
}

你可能感兴趣的:(codeforces,思维)