zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    java初学
    数据库命名及设计规范(转)
    转-ASP.NET页面之间传递值
    程序员个人职业规划
    如何学习别人的代码(转)
    可映射的CSV读取引擎
    iTween扩展
    Unity3d中NGUI加强版血条(Healthbar)的制作
    Unity3D中寻路Navmesh的简单介绍
    多人网络(Valve开发文档翻译[起源引擎])(一)
  • 原文地址:https://www.cnblogs.com/zufezzt/p/6370963.html
Copyright © 2011-2022 走看看