• Codeforces Round #401 (Div. 2)


    和FallDream dalao一起从学长那借了个小号打Div2,他切ABE我做CD,我这里就写下CD题解,剩下的戳这里

    AC:All Rank:33 小号Rating:1539+217->1756

    C.Alyona and Spreadsheet

    题目大意:给出一个n*m的数字矩阵a,k次询问,每次给li,ri,求是否有一列的a[li][j],a[li+1][j],...a[ri][j]组成一个不下降序列。(n*m<=100,000,k<=100,000)

    思路:O(n*m)扫一遍可以预处理出每个ri最小的li,我菜,写了线段树。

    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    using namespace std;
    inline int read()
    {
        int x=0;char c;
        while((c=getchar())<'0'||c>'9');
        for(;c>='0'&&c<='9';c=getchar())x=(x<<3)+(x<<1)+c-'0';
        return x;
    }
    #define MN 100000
    #define N 131072
    #define INF 0x7FFFFFFF
    vector<int> v[MN+5];
    vector<pair<int,int> > q[MN+5];
    int t[N*2+5],ans[MN+5];
    void change(int k,int x){for(t[k+=N]=x;k>>=1;)t[k]=min(t[k<<1],t[(k<<1)+1]);}
    int main()
    {
        int n,m,k,i,j;
        n=read();m=read();
        for(i=0;i<=m;++i)v[0].push_back(INF);
        for(i=1;i<=n;++i)v[i].push_back(0);
        for(i=1;i<=n;++i)for(j=1;j<=m;++j)v[i].push_back(read());
        for(k=read(),i=0;i<k;++i)j=read(),q[read()].push_back(make_pair(j,i));
        memset(t,127,sizeof(t));
        for(i=1;i<=n;++i)
        {
            for(j=1;j<=m;++j)if(v[i][j]<v[i-1][j])change(j,i);
            for(j=0;j<q[i].size();++j)ans[q[i][j].second]=(t[1]<=q[i][j].first);
        }
        for(i=0;i<k;++i)puts(ans[i]?"Yes":"No");
    }

    D.

    题目大意:给N个字符串,从中删掉最少的字符使得字符串按字典序排序。(字符数量<=500,000)

    思路:我写了个分治……solve(l,r,p)表示第l个到第r个前p-1个都一样,从后往前找到第一个s[i][p]>s[i+1][p],把第l个到第i个p以后都截掉,然后按第p个字符分成几块继续分治。其实只要从最后一个往前贪心删掉就可以了。

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define MN 500000
    #define INF 0x7FFFFFFF
    string s[MN+5];
    int L[MN+5];
    int C(int x,int y){return y<=L[x]?s[x][y]:0;}
    void solve(int l,int r,int p)
    {
        int i,j,mn=INF;
        for(i=r;i>=l;--i)
        {
            if(C(i,p)>mn)L[i]=p-1;
            mn=min(mn,C(i,p));
        }
        for(i=l;i<=r;i=j)
        {
            for(j=i;j<=r&&C(i,p)==C(j,p);++j);
            if(C(i,p))solve(i,j-1,p+1);
        } 
    }
    int main()
    {
        int n,i,j;
        cin>>n;
        for(i=1;i<=n;++i)
        {
            cin>>s[i];
            L[i]=s[i].size()-1;
        }
        solve(1,n,1);
        for(i=1;i<=n;++i,puts(""))for(j=0;j<=L[i];++j)putchar(s[i][j]);
    }
  • 相关阅读:
    反射创建对象
    DevExpress 日期输入框
    SsdlToSql10.tt文件内容
    ExecuteNonQuery requires an open and available Connection. The connection's current state is closed.
    DevExpress XtraCharts 图表导出PDF/XLS/JPEG
    Java中堆内存和栈内存详解(转)
    批量合并word文档
    java内部类总结(转)
    Java 之工厂方法和抽象工厂模式(转)
    Java GC 、引用
  • 原文地址:https://www.cnblogs.com/ditoly/p/CF401.html
Copyright © 2020-2023  润新知