CF1768

CF1768

A. Greatest Convex

呆呆 A,直接输出 n1 就好了。

Code

B. Quick Sort

可怜 B。对于从 1 开始的递增子序列不需要排序以外,其他都需要。

Code

C. Elemental Decompress

C。事情开始变得有趣起来,被 C 卡了五个小时,正解是对每一行维护一个 set 表示除了强制要选的之外每行可以选啥。

维护一个 visi 表示 i 这个数出现过多少次。

填法就是如果对于一个最大值,如果他没在第一个序列出现过,那就填在第一个序列,反之第二个序列,然后在第二行的 set lower_bound 一个值填进去,这个时候如果出现过一次那就都删掉,如果没出现过那就仅删掉第二行 set 里的值。

看起来就很对。

附赠对拍 checker

#include<bits/stdc++.h>
using namespace std;

const int N=100000;
int mx[N],p[N],q[N];

bool vis[N];

int main(){
  freopen("qwq.in","r",stdin);
  freopen("Error.out","w",stdout);
  int T,n;cin>>T>>n;
  for(int i=1;i<=n;i++) scanf("%d",&mx[i]);
  fclose(stdin);
  freopen("std.out","r",stdin);
  string s1;cin>>s1;
  fclose(stdin);
  freopen("qwq.out","r",stdin);
  string s2;cin>>s2;
  if(s1!=s2) return printf("The Answer in the first Line is Wrong.\n"),0;
  if(s1=="NO"){
    fclose(stdout);
    // cerr<<"Nothing Wrong."<<endl;
    return 0;
  }
  for(int i=1;i<=n;i++) scanf("%d",&p[i]); 
  for(int i=1;i<=n;i++) scanf("%d",&q[i]);
  // for(int i=1;i<=n;i++) printf("%d ",q[i]);
  for(int i=1;i<=n;i++) if(mx[i]!=max(p[i],q[i])){
    return printf("Wrong OutPut For the max.\n"),0;
  }
  for(int i=1;i<=n;i++) vis[i]=0;
  for(int i=1;i<=n;i++) {
    if(vis[p[i]]) return printf("Wrong OutPut P is not a Permutation.\n"),0;
    vis[p[i]]=1;
  }
  for(int i=1;i<=n;i++) vis[i]=0;
  for(int i=1;i<=n;i++) {
    if(vis[q[i]]) return printf("Wrong OutPut Q is not a Permutation.\n"),0;
    vis[q[i]]=1;
  }
  fclose(stdout);
  // cerr<<"Nothing Wrong."<<endl;
}

Code

D. Lucky Permutation

并查集维护环的关系然后,答案就是 ncnt

最后记得看一下存不存在逆序对被调换的情况,存在就 -1,不存在就 +1

Code

posted @   Zimo_666  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示