zoukankan      html  css  js  c++  java
  • 桂林 Problem D. Assumption is All You Need 题解(构造+思维)

    题目思路

    暂时无题目链接

    问了一下其他队过的思路,大概是这样

    别人的口胡

    从小到大先把1移到它要去的地方然后再移2一直到n,但是不是直接移动

    比如现在1的位置是5最终要到位置1,你就先区间查询1-4位置的最小值,然后把1移到查询的位置

    然后这个区间的最小值移动到了5这个位置然后继续查询位置1到当前位置的最小值然后再往前移动

    这样次小的可以跟最小的再移动5 4 2 3 1先把1移动到3这个位置5 4 1 3 2你看看除了1往前走了

    其他位置的值还是可以和原本一样移动2选择还可以更多处理完后你还可以将大的值再移动到最后

    你这样保证了移动前后其他位置的选择不会减少你就看成处理完1 就把1这个位置去掉

    因为1不能给贡献了剩下的点选择和之前一样多

    代码

    代码还没测验过,不保证正确性

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define debug cout<<"I AM HERE"<<endl;
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn=2e5+5,inf=0x3f3f3f3f,mod=29;
    const double eps=1e-6;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    int n;
    int a[maxn],b[maxn];
    int posa[maxn],posb[maxn];
    void sw(int i,int j){
        int tmpi=a[i];
        int tmpj=a[j];
        a[i]=tmpj;
        a[j]=tmpi;
        posa[a[i]]=i;
        posa[a[j]]=j;
    }
    signed main(){
        int _;scanf("%d",&_);
        while(_--){
            vector<pair<int,int> > ans;
            scanf("%d",&n);
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
                posa[a[i]]=i;
            }
            for(int i=1;i<=n;i++){
                scanf("%d",&b[i]);
                posb[b[i]]=i;
            }
            bool flag=1;
            for(int i=1;i<=n;i++){
                if(posa[i]==posb[i]) continue;
                if(posa[i]<posb[i]){
                    flag=0;
                    break;
                }
                int nowl=posb[i];
                int nowr=posa[i];
                for(int j=i+1;j<=n;j++){
                    if(posa[j]<=nowr&&posa[j]>=nowl){
                        ans.push_back({posa[j],nowr});
                        int tmp=posa[j];
                        sw(posa[j],nowr);
                        nowr=tmp;
                    }
                }
            }
            for(int i=1;i<=n;i++){
                if(a[i]!=b[i]){
                    flag=0;
                }
            }
            if(!flag){
               printf("-1
    ");
            }else{
                printf("%d
    ",ans.size());
                for(auto x:ans){
                    printf("%d %d
    ",x.fi,x.se);
                }
            }
        }
        return 0;
    }
    
    
    不摆烂了,写题
  • 相关阅读:
    oracle 查看表空间使用率
    解决linux下vim中文乱码问题
    linux 时间同步
    oracle ho与mysql system命令
    mysql 重置root密码
    2020 10 26
    2020 10 24
    2020 10 23
    2020 10 22
    2020 10 21
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/15521486.html
Copyright © 2011-2022 走看看