CodeForces 731D 80-th Level Archeology

区间并。

对于上下两个数字,如果不一样,那么可以计算出哪一段范围内可以保证字典序,并且后面所有位置都无需再考虑。对所有范围求交集就是答案了。

求交集写起来有点烦,直接对不可取的范围求并即可。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-10;
void File()
{
    freopen("D:\in.txt","r",stdin);
    freopen("D:\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
    char c = getchar();
    x = 0;
    while(!isdigit(c)) c = getchar();
    while(isdigit(c))
    {
        x = x * 10 + c - '0';
        c = getchar();
    }
}

vector<int>v[500010];
int n,c,L,R,len[500010],ans[1000010];

bool check(int a,int b)
{
    if(v[a].size()<=v[b].size()) return 0;
    for(int j=0;j<v[b].size();j++) if(v[a][j]!=v[b][j]) return 0;
    return 1;
}

int main()
{
    scanf("%d%d",&n,&c);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&len[i]);
        for(int j=0;j<len[i];j++)
        {
            int x; scanf("%d",&x);
            v[i].push_back(x);
        }
    }

    for(int i=1;i<n;i++)
    {
        for(int j=0;j<len[i];j++)
        {
            if(v[i-1].size()-1<j) break;
            if(v[i-1][j]!=v[i][j])
            {
                if(v[i-1][j]>v[i][j])
                {
                    ans[0]++;
                    ans[c-v[i-1][j]+1]--;

                    ans[c-v[i][j]+1]++;
                    ans[c]--;
                }
                else
                {
                    ans[c-v[i][j]+1]++;
                    ans[c-v[i-1][j]+1]--;
                }
                break;
            }
        }

    }

    for(int i=0;i<=c;i++) ans[i]=ans[i]+ans[i-1];

    int fail=1; int q;
    for(int i=0;i<=c-1;i++) if(ans[i]==0) q=i,fail=0;

    for(int i=1;i<n;i++)
    {
        if(check(i-1,i))
        {
            fail=1; break;
        }
    }

    if(fail==1) printf("-1
");
    else printf("%d
",q);

    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/6370963.html