• 《Codeforces Global Round 9》


    C:

    将序列排开。

    a[1]  a[x]  a[x+1]  a[n].

    可以发现,若满足a[1] < a[n].

    那么对于a[x] > a[1]  和 a[x+1] < a[n] ,将肯定会存在一种情况满足。

    然后就可以不断缩减区间数。最后变成a[1] , a[n].

    所以当a[1] < a[n]时,就可以实现,否则当从左向右延伸最小值时,无法实现。

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef pair<int,int> pii;
    const int N = 3e5+5;
    const int M = 1e6+5;
    const int Mod = 317000011;
    #define pi acos(-1)
    #define INF 1e8
    #define INM INT_MIN
    #define pb(a)  push_back(a)
    #define mk(a,b) make_pair(a,b)
    #define dbg(x) cout << "now this num is " << x << endl;
    #define met0(axx) memset(axx,0,sizeof(axx));
    #define metf(axx) memset(axx,-1,sizeof(axx));
    #define sd(ax) scanf("%d",&ax)
    #define sld(ax) scanf("%lld",&ax)
    #define sldd(ax,bx) scanf("%lld %lld",&ax,&bx)
    #define sdd(ax,bx) scanf("%d %d",&ax,&bx)
    #define sddd(ax,bx,cx) scanf("%d %d %d",&ax,&bx,&cx)
    #define sfd(ax) scanf("%lf",&ax)
    #define sfdd(ax,bx) scanf("%lf %lf",&ax,&bx)
    #define pr(a) printf("%d\n",a)
    #define plr(a) printf("%lld\n",a)
    int a[N];
    void run()
    {
        int t;sd(t);
        while(t--)
        {
            int n;sd(n);
            for(int i = 1;i <= n;++i) sd(a[i]);
            if(a[1] < a[n] || n == 1) printf("YES\n");
            else printf("NO\n");
        }
    }
    int main()
    {
        run();
        //system("pause");
        return 0;
    }
    View Code

     D:

    可以将序列排成

    1 2 3 4 ~ n 的最终序列。

    若当前的最小值为0,那就将它替换为没有完成的任意一个位置。

    当替换后,显然最小值就是没有完成的某一个值。所以此时只需要两步完成一个位置的配对。

    若当前的最小值不为0,那就直接将最小值位置的值变为最小值。此时最需要一步完成一个位置的配对。

    显然最多的替换次数也就是2*n,所以可以证明一定满足移动步数<=2*n。

    这里用set来维护下最小的值,用优先队列爆内存了..。注意的是给已经配对的打上标记。

    这样时间可以缩短不少。总复杂度t*n^2.

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef pair<int,int> pii;
    const int N = 3e5+5;
    const int M = 1e6+5;
    const int Mod = 317000011;
    #define pi acos(-1)
    #define INF 1e8
    #define INM INT_MIN
    #define pb(a)  push_back(a)
    #define mk(a,b) make_pair(a,b)
    #define dbg(x) cout << "now this num is " << x << endl;
    #define met0(axx) memset(axx,0,sizeof(axx));
    #define metf(axx) memset(axx,-1,sizeof(axx));
    #define sd(ax) scanf("%d",&ax)
    #define sld(ax) scanf("%lld",&ax)
    #define sldd(ax,bx) scanf("%lld %lld",&ax,&bx)
    #define sdd(ax,bx) scanf("%d %d",&ax,&bx)
    #define sddd(ax,bx,cx) scanf("%d %d %d",&ax,&bx,&cx)
    #define sfd(ax) scanf("%lf",&ax)
    #define sfdd(ax,bx) scanf("%lf %lf",&ax,&bx)
    #define pr(a) printf("%d\n",a)
    #define plr(a) printf("%lld\n",a)
    int a[1005],vis[1005],ok[1005];
    void run()
    {
        int t;sd(t);
        while(t--)
        {
            int n;sd(n);
            met0(ok);met0(vis);
            set<int> S;
            vector<int> vec;
            for(int i = 1;i <= n;++i) 
            {
                sd(a[i]),vis[a[i]]++;
                if(a[i] == i) ok[i] = 1;//不需要调整
            }
            for(int i = 0;i <= n;++i) if(vis[i] == 0) S.insert(i);
            int pos = 1;
            while(1)
            {
                int minn = *(S.begin()),f = 0;
                if(minn == 0)
                {
                    for(int i = 1;i <= n;++i)
                    {
                        if(!ok[i])
                        {
                            vec.pb(i);
                            f = 1;
                            int ma = a[i];
                            S.erase(S.begin());vis[0]++;
                            vis[ma]--;
                            if(vis[ma] == 0) S.insert(ma);
                            a[i] = 0;
                            break;
                        }
                    }
                    if(!f) break;
                }
                else
                {
                    int ma = a[minn];
                    S.erase(S.begin());
                    vis[ma]--;
                    if(vis[ma] == 0) S.insert(ma);
                    a[minn] = minn;
                    ok[minn] = 1;
                    vec.pb(minn);
                }
            }
            pr(vec.size());
            for(int i = 0;i < vec.size();++i) printf("%d%c",vec[i],i == vec.size()-1 ? '\n' : ' ');
        }
    }
    int main()
    {
        run();
        system("pause");
        return 0;
    }
    View Code
  • 相关阅读:
    Commons.net FTPClient 上传文件
    C盘空间不够,清除VS下的 Font Cache
    Redis 密码设置
    Window bat expdp 定时任务逻辑备份 定时删除N天前的旧文件
    Windows下修改Oracle默认的端口1521
    Intellij idea 乱码问题(英文操作系统)
    给VMware下的Linux扩展磁盘空间(以CentOS6.3为例)转
    TortoiseSVN and TortoiseGit 版本控制图标不见了
    R语言中字符串的拼接操作
    SparkR:数据科学家的新利器
  • 原文地址:https://www.cnblogs.com/zwjzwj/p/13290062.html
Copyright © 2020-2023  润新知