Codeforces Round #631 (Div. 2) - Thanks, Denis aramis Shitov!

Posted luoyugongxi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #631 (Div. 2) - Thanks, Denis aramis Shitov!相关的知识,希望对你有一定的参考价值。

A题

题意:

给n个数据,m次操作,使得1~A,全都出现。如果其中有数据没在n里出现,就m--

思路:

模拟就行

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define ull unsigned long long
 5 #define il inline
 6 #define it register int
 7 #define inf 0x3f3f3f3f
 8 #define lowbit(x) (x)&(-x)
 9 #define pii pair<int,int>
10 #define mak(n,m) make_pair(n,m)
11 #define mem(a,b) memset(a,b,sizeof(a))
12 #define mod 998244353
13 #define fi first
14 #define se second
15 #define sz(x) (int)(x).size()
16 #define all(x) (x).begin(), (x).end()
17 const int maxn=1e3+10;
18 ll ksm(ll a,ll b){if(b<0)return 0;ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;}
19 int t,n,m;
20 int v[maxn];
21 int main(){
22     scanf("%d",&t);
23     while(t--){
24         scanf("%d%d",&n,&m);
25         int a;mem(v,0);
26         for(it i=0;i<n;i++){
27             scanf("%d",&a);v[a]=1;
28         }
29         int maxx=0;
30         for(it i=1;m;i++){
31             if(v[i]==0){v[i]=1;m--;maxx=i;}
32             else{maxx=i;}
33         }
34         for(it i=maxx+1;;i++){
35             if(v[i]){maxx=i;}
36             else{break;}
37         }
38         printf("%d
",maxx);
39     }
40     return 0;
41 }
View Code

B题

题意:

给n个数据,这写数据范围,1<=a[i]<=n-1

问能不能割断,比如

2 1 3 4 | 2 1,这样左边就是1234,右边12

如果有输出全部,如果没有输出0

思路:

从前遍历,从后遍历,出现两次相同的数字就是不符合,如果没重复的个数达到最大值,记录位置。

再验证一下后面的数据是否符合条件,比如有可能2 1 3 4 1 1这种。

还有wa了一次是因为,如果从前遍历,从后遍历,相同位置,就输出一个即可,比如1 2 2 1

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define ull unsigned long long
 5 #define il inline
 6 #define it register int
 7 #define inf 0x3f3f3f3f
 8 #define lowbit(x) (x)&(-x)
 9 #define pii pair<int,int>
10 #define mak(n,m) make_pair(n,m)
11 #define mem(a,b) memset(a,b,sizeof(a))
12 #define mod 998244353
13 #define fi first
14 #define se second
15 #define sz(x) (int)(x).size()
16 #define all(x) (x).begin(), (x).end()
17 const int maxn=2e5+10;
18 ll ksm(ll a,ll b){if(b<0)return 0;ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;}
19 int t,n,m;
20 int a[maxn],vis[maxn];
21 int main(){
22     scanf("%d",&t);
23     while(t--){
24         scanf("%d",&n);
25         mem(vis,0);int f=1,maxx=-1;
26         for(it i=1;i<=n;i++){
27             scanf("%d",&a[i]);
28             //vis[a[i]]++;
29             if(maxx<a[i]){maxx=a[i];}
30         }
31         int ge=0;
32         for(it i=1;i<=n;i++){
33             if(vis[a[i]]==0){ge++;vis[a[i]]=1;}
34             else{f=0;break;}
35             if(ge==maxx){ge=i;break;}
36         }
37         int ff=2,g2=0;mem(vis,0);
38         for(it i=n;i>=1;i--){
39             if(vis[a[i]]==0){g2++;vis[a[i]]=1;}
40             else{ff=0;break;}
41             if(g2==maxx){g2=i;break;}
42         }
43         //cout<<ge<<g2<<endl;
44         if(!f && !ff){printf("0
");}
45         else{
46 
47             if(f){
48                 int zhi=n-ge;
49                 for(it i=1;i<=zhi;i++){vis[i]=0;}
50                 for(it i=ge+1;i<=n;i++){
51                     vis[a[i]]++;
52                 }
53                 for(it i=1;i<=zhi;i++){
54                     if(vis[i]==0){f=0;break;}
55                 }
56             }
57             if(ff){
58                 int zhi=g2;
59                 for(it i=1;i<zhi;i++){vis[i]=0;}
60                 for(it i=1;i<zhi;i++){
61                     vis[a[i]]++;
62                 }
63                 for(it i=1;i<zhi;i++){
64                     if(vis[i]==0){ff=0;break;}
65                 }
66             }
67             if(!f && !ff){printf("0
");}
68             else{
69                 if(ff && f){
70                     if(ge==g2-1){
71                          printf("1
%d %d
",ge,n-ge);
72                     }
73                     else{
74                         printf("2
%d %d
%d %d
",ge,n-ge,g2-1,n-g2+1);
75                     }
76                 }
77                 else if(f){
78                     printf("1
%d %d
",ge,n-ge);
79                 }
80                 else{
81                     printf("1
%d %d
",g2-1,n-g2+1);
82                 }
83             }
84         }
85     }
86     return 0;
87 }
View Code

 

D题

题意:

You are given two integers d,md,m, find the number of arrays aa, satisfying the following constraints:

  • The length of aa is nn, n1n≥1
  • 1a1<a2<?<and1≤a1<a2<?<an≤d
  • Define an array bb of length nn as follows: b1=a1b1=a1, i>1,bi=bi1ai∀i>1,bi=bi−1⊕ai, where ⊕ is the bitwise exclusive-or (xor). After constructing an array bb, the constraint b1<b2<?<bn1<bnb1<b2<?<bn−1<bn should hold.

Since the number of possible arrays may be too large, you need to find the answer modulo mm.

看条件就了解,找到符合的种类

思路:

因为是位运算,我一开始想的是二进制,然后1,2,4,8的找规律,样例给了规律

就是1(二进制一位),转换成2 (二进制两位)的时候是+2,2转换4(二进制三位)的是+6,4转换位8(二进制四位)的是+30

1  2  3   4   5   6    7     8    9

1  3  5  11 17  23  29   59   89  

  2  2  6   6   6     6    30    30

刚好是4前面3的数据+1,8前面7的数据+1,比赛的时候脑瘫,不相信这规律,特地验证了一波,为什么是+1,举个例子8为什么是加30,因为会出现1 8这种数据,其他29就是前者数据后面都加个8(别问为什么举例的是8,呜呜呜)

证明完以后就十分钟写,因为数据10^9,所以要存二进制,分别用a存二进制位数时候要+多少,b存二进制位数前一个数据量是多少。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
const int maxn=1e5+10;
ll ksm(ll a,ll b){if(b<0)return 0;ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;}
int t;
ll n,m;
ll a[40],b[40];
int main(){
  
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld",&n,&m);
        if(n==1){printf("%d
",n%m);continue;}
        ll k=n;
        ll c=0;
        while(k){
            if(k==0){break;}
            c++;k>>=1;
        }
          a[0]=1,a[1]=2;b[0]=1;b[1]=1;
        for(ll i=2;i<=c;i++){
            ll c=(ll)1<<i,c1=(ll)1<<(i-1);
            b[i]=((c-c1)%m*a[i-1]%m+b[i-1])%m;
            a[i]=(b[i]+1)%m;
        }
   // cout<<a[5]<<a[3]<<a[4]<<endl;
    //cout<<b[2]<<b[3]<<b[4]<<endl;
        printf("%lld
",(b[c-1]%m+((n+1-(1<<(c-1)))*a[c-1])%m)%m);
    }
    return 0;
}

有1说1,十二分钟搓出来,都没来得及交上去。呜呜呜迷惑C题,

以上是关于Codeforces Round #631 (Div. 2) - Thanks, Denis aramis Shitov!的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #344 (Div. 2) 631 C. Report (单调栈)

Codeforces Round #631 (Div. 2) B. Dreamoon Likes Permutations(排列组合)

Codeforces Round #631 (Div. 2) - Thanks, Denis aramis Shitov!

Codeforces Round #631 (Div. 2) - Thanks, Denis aramis Shitov!

Codeforces Round #631 (Div. 2) Dreamoon Likes Sequences

Codeforces Round #631 (Div. 2) C. Dreamoon Likes Coloring(贪心好题/意识流题解)