CF616(div.2)

Posted njwsf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF616(div.2)相关的知识,希望对你有一定的参考价值。

紫名祭  

又加了66分,这个数字还是很吉利的。不过这次的赛制是div.2紫名不能参加,对我还是有利的。

只不过这次的D题有点坑,没想到随便找个规律就行了。。。

比赛链接

A题:

满足要求的数的末尾必须是奇数,但要数字和为偶数,所以除了最后一位肯定还有一个奇数。

所以直接在原数中找两个奇数,找不到则输出-1.

上代码:

技术图片
 1 #pragma GCC optimize("Ofast,unroll-loops")
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 #define F first
 5 #define S second
 6 #define P pair
 7 #define FOR(i,a,b) for(int i=a;i<=b;i++)
 8 #define V vector
 9 #define RE return
10 #define ALL(a) a.begin(),a.end()
11 #define MP make_pair
12 #define PB push_back
13 #define PF push_front
14 #define FILL(a,b) memset(a,b,sizeof(a))
15 using namespace std;
16 void solve(){
17     int len;
18     string s;
19     cin>>len>>s;
20     int ans1=-1;
21     for(int i=0;i<len;i++){
22         int t=s[i]-0;
23         if(t&1){
24             if(ans1==-1){
25                 ans1=t;
26             }else{
27                 cout<<ans1<<t<<
;RE ;
28             }
29         }
30     }
31     cout<<"-1
";
32 }
33 int main(){
34     ios::sync_with_stdio(0);
35     cin.tie(0);
36     int n;
37     cin>>n;
38     while(n--)solve(); 
39     RE 0;
40 }
View Code

 

B题:

因为这里不用考虑步数的问题,我们可以把左右两端的数都设为0,再一个一个向中间加1,如果有一个数它既比从左边过来的数小,也比右边过来的数小,那么就输出No,否则输出Yes。

上代码:

技术图片
 1 #pragma GCC optimize("Ofast,unroll-loops")
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 #define F first
 5 #define S second
 6 #define P pair
 7 #define FOR(i,a,b) for(int i=a;i<=b;i++)
 8 #define V vector
 9 #define RE return
10 #define ALL(a) a.begin(),a.end()
11 #define MP make_pair
12 #define PB push_back
13 #define PF push_front
14 #define FILL(a,b) memset(a,b,sizeof(a))
15 using namespace std;
16 int a[300005],n;
17 void solve(){
18     cin>>n;
19     FOR(i,1,n)cin>>a[i];
20     int l=1,r=n,t=0;
21     while(a[l]>=t){
22         t++;l++;
23     }
24     l--;t=0;
25     while(a[r]>=t){
26         r--;t++;
27     }
28     r++;
29     if(r<=l)cout<<"Yes
";else cout<<"No
";
30 }
31 int main(){
32     ios::sync_with_stdio(0);
33     cin.tie(0);
34     int t;
35     cin>>t;
36     while(t--)solve(); 
37     RE 0;
38 }
View Code

 

C题:

这题可以直接枚举我指定多少人取第一个,再枚举剩下的人有多少人取第一个,这样就可以算出我现在可以取的值,再取一个大的。枚举我指定的人时,可以取最大值,但是枚举剩下的人时,就必须取最小值,只要脑子绕过来了就好了。

上代码:

技术图片
 1 #pragma GCC optimize("Ofast,unroll-loops")
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 #define F first
 5 #define S second
 6 #define P pair
 7 #define FOR(i,a,b) for(int i=a;i<=b;i++)
 8 #define V vector
 9 #define RE return
10 #define ALL(a) a.begin(),a.end()
11 #define MP make_pair
12 #define PB push_back
13 #define PF push_front
14 #define FILL(a,b) memset(a,b,sizeof(a))
15 using namespace std;
16 int a[3505],n,m,k;
17 void solve(){
18     cin>>n>>m>>k;m--;k=min(k,m);
19     FOR(i,1,n)cin>>a[i];
20     int maxi=0;
21     FOR(i,0,k){
22         int l=i+1,r=n-k+i;
23         int mini=2147483647;
24         FOR(j,0,m-k){
25             mini=min(mini,max(a[l+j],a[r-m+k+j]));
26         }
27         maxi=max(maxi,mini);
28     }
29     cout<<maxi<<
;
30 }
31 int main(){
32     ios::sync_with_stdio(0);
33     cin.tie(0);
34     int t;
35     cin>>t;
36     while(t--)solve();
37     RE 0;
38 }
View Code

 

D题:

这题的方法有些像是找规律,如果一段长度为1,则输出“Yes”,计算一段中每种字符有多少个,字符种类超过3则肯定不行。字符种类为1,因为前面单个的已经被特判掉了,所以输出“No”;种类为2,如果头尾相同输出“No”,否则输出“Yes”。我是找规律的,至于为什么这样,我也说不清楚。

上代码:

技术图片
 1 #pragma GCC optimize("Ofast,unroll-loops")
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 #define F first
 5 #define S second
 6 #define P pair
 7 #define FOR(i,a,b) for(int i=a;i<=b;i++)
 8 #define V vector
 9 #define RE return
10 #define ALL(a) a.begin(),a.end()
11 #define MP make_pair
12 #define PB push_back
13 #define PF push_front
14 #define FILL(a,b) memset(a,b,sizeof(a))
15 using namespace std;
16 int f[200005][26],t[26];
17 int main(){
18     ios::sync_with_stdio(0);
19     cin.tie(0);
20     string s;
21     cin>>s;
22     int q;
23     cin>>q;
24     int l,r;
25     f[0][s[0]-a]=1;
26     for(int i=1;i<s.size();i++){
27         FOR(j,0,25)f[i][j]=f[i-1][j];
28         f[i][s[i]-a]++;
29     }
30     FOR(i,1,q){
31         cin>>l>>r;
32         if(l==r){
33             cout<<"Yes
";continue;
34         }
35         l--;r--;
36         FOR(j,0,25)t[j]=f[r][j]-f[l][j];
37         t[s[l]-a]++;
38         int count=0;
39         FOR(j,0,25){
40             if(t[j])count++;
41         }
42         if(count>2){
43             cout<<"Yes
";
44         }else{
45             if(count==1){
46                 cout<<"No
";
47             }else{
48                 if(s[l]==s[r]){
49                     cout<<"No
";
50                 }else cout<<"Yes
";
51             }
52         }
53     }
54     RE 0;
55 }
View Code

 

下次比赛用小号,以防好不容易才拿到的紫名丢了。

 

以上是关于CF616(div.2)的主要内容,如果未能解决你的问题,请参考以下文章

CF616E Sum of Remainders(分块&取模)

Codeforces Round #616 (Div. 2)解题报告

Codeforces Round #616 (Div. 2)

CF616D Longest k-Good Segment

Codeforces Round #616 (Div. 2)

Codeforces Round #616 (Div. 2)