Educational Codeforces Round 89 (Rated for Div. 2)---B. Shuffle(1300分)

Educational Codeforces Round 89 (Rated for Div. 2)---B. Shuffle(1300分)
题意:
给你一个由n个整数a1, a2, …, an组成的数组。最初ax=1,所有其他元素都等于0。
你必须进行m次操作。在第i次操作中,你选择两个指数c和d,使li≤c,d≤ri,并交换ac和ad。
计算指数k的数量,以便有可能选择操作,使ak=1。
大概就是说通过m次操作,能把哪几个位置换成1,可以看成ax是被染色的,只要在区间的块都能被染色,求最大的被染色的块。
思路:
先找到第一个包含x的区间,这个区间里的所有数都可以被染色,感觉可以当区间合并做
一开始我的区间只有个一点,m的最大范围只有100个,所以100个区间合并,求在x的区间长度,但是合并有原则得按照顺序合并,当前遍历到的区间不能和之后出现的区间合并,只能和之前的合并
复杂度大概是O(m^2*t)大概1e6

#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
struct node {
    int l,r;
}mo[maxn];
int main()
{
    int n,i,j,t,m,x;
    cin>>t;
    while(t--)
    {
        int l1,r1;
        cin>>n>>x>>m;
        int cnt=0;
        mo[cnt].r=x;
        mo[cnt++].l=x;
        for(i=0;i<m;i++)
        {
            cin>>l1>>r1;
            int flag=0;
            for(j=0;j<1;j++)
            {
                if((l1>=mo[j].l&&l1<=mo[j].r)||(r1<=mo[j].r&&r1>=mo[j].l)||(l1<=mo[j].l&&r1>=mo[j].r))
                {
                    mo[j].l=min(mo[j].l,l1);
                    mo[j].r=max(mo[j].r,r1);
                }
            }
        }
        for(i=0;i<cnt;i++)
        {
            if(x>=mo[i].l&&x<=mo[i].r)
            {
                cout<<mo[i].r-mo[i].l+1<<endl;
                break;
            }
        }
    }
    return 0;
}

上一篇:【模板】程序主体


下一篇:使用Python在Maya中删除菜单项