Codeforces Round #741 (Div. 2) ABCD1D2题解
Posted quinn18
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #741 (Div. 2) ABCD1D2题解相关的知识,希望对你有一定的参考价值。
文章目录
- A - The Miracle and the Sleeper
- B - Scenes From a Memory
- C - Rings
- D1 - Two Hundred Twenty One (easy version)
- D2 - Two Hundred Twenty One (hard version)
- 总结
A - The Miracle and the Sleeper
添加链接描述
题意:
l
,
r
l, r
l,r 里找两个数
a
>
=
b
a>=b
a>=b 使
a
a
a%
b
b
b最大
好慢啊
想到
(
x
+
(
x
−
1
)
)
(x+(x-1))
(x+(x−1)) %
x
=
=
x
−
1
(
x
+
x
−
1
<
=
r
)
x==x-1 (x+x-1<=r)
x==x−1(x+x−1<=r)
然后判断
x
x
x 和
l
l
l 哪个大 直接输出
r
r
r %
m
a
x
(
x
,
l
)
max(x, l)
max(x,l)
%
l
l
l确实是最大的 qwq
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
int t;
cin>>t;
while(t--) //x+x+1
int l, r;
cin>>l>>r;
int x=r/2+1;
x=max(l, x);
cout<<r%x<<endl;
return 0;
B - Scenes From a Memory
添加链接描述
题意:给你个
n
n
n 求删掉最多多少个数使这个数变成非质数或
1
1
1
好怂啊
找里面一些数字凑成非质数或者有
1
1
1 就行
其实只要猜两位数就好了然后整了个素数筛ahhh
#include<bits/stdc++.h>
#define int long long
using namespace std;
bool vis[1000005];
int pri[1000005], cnt, n;
void get_prime(int n)
vis[1] = 1;
for (int i = 2; i <= n; i++)
if (!vis[i])
pri[cnt++] = i;
for (int j = 2 * i; j <= n; j += i)
vis[j] = 1;
string f(int m)
string w;
while(m)
w=char('0'+m%10)+w;
m/=10;
return w;
int ct=0;
string ww[100005];
signed main()
get_prime(10005);
for(int i=1; i<=10005; i++)
if(vis[i])
ww[++ct]=f(i);
int t;cin>>t;
while(t--)
int m;cin>>m;
string s;
cin>>s;
int q=0;
for(int i=1; i<=ct; i++)
int sum=0;
//cout<<ww[i]<<endl;
for(int j=0; j<m; j++)
if(s[j]==ww[i][sum]) sum++;
int len=ww[i].size();
if(sum==len)
cout<<len<<endl;
cout<<ww[i]<<endl;
q=1;
break;
if(q)break;
return 0;
C - Rings
添加链接描述
题意:给你一个二进制 截取两个比一半还长的二进制转换为十进制,截取区间不能一样,这两要是倍数关系
乌鱼子被吓唬了hhh
看了好久
先能发现
<
<
1
<<1
<<1 是
∗
2
*2
∗2 的意思是二进制左移一位,所以两个长一样的二进制一个后面加个
0
0
0 就是倍数关系
然后想到
k
=
=
1
k==1
k==1 的情况就
0111
0111
0111 和
111
111
111
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
int t;
cin>>t;
while(t--)
int n;
cin>>n;
string s;
cin>>s;
int sum=0;
int q=0;
for(int i=0; i<n; i++) if(s[i]=='1') sum++;
if(!sum) //全0
cout<<1<<" "<<n-1<<" "<<2<<" "<<n<<endl;
continue;
for(int i=0; i<n; i++) //找满足长度的0位置
if(s[i]=='0')
if(i>=n/2)
cout<<1<<" "<<i+1<<" "<<1<<" "<<i<<endl;
q++;
break;
else
cout<<i+1<<" "<<n<<" "<<i+2<<" "<<n<<endl;
q++;
break;
if(!q)//全1
cout<<1<<" "<<n-1<<" "<<2<<" "<<n<<endl;
return 0;
D1 - Two Hundred Twenty One (easy version)
添加链接描述
题意:给你个+ - 串 使
a
1
−
a
2
+
a
3
−
a
4
+
.
.
.
=
0
a1 - a2 + a3 - a4+...=0
a1−a2+a3−a4+...=0
q
q
q次问 最少移去多少个杆子使给你区间==0
就是摸你+前缀和
int sum[N];
signed main()
int t; cin>>t;
while(t--)
int n, q; cin>>n>>q;
string s; cin>>s;
s='.'+s;
int x=0, k=0;
for(int i=1; i<=n; i++)
if(i%2==0)
if(s[i]=='+') sum[i]=sum[i-1]-1;
else sum[i]=sum[i-1]+1;
else
if(s[i]=='+') sum[i]=sum[i-1]+1;
else sum[i]=sum[i-1]-1;
for(int p=1; p<=q; p++)
int l, r; cin>>l>>r;
if((r-l+1)%2==0)
if((sum[r]-sum[l-1])==0) cout<<0<<endl;
else cout<<2<<endl;
else
cout<<1<<endl;
return 0;
D2 - Two Hundred Twenty One (hard version)
每次A完一题就谢了qwq就没了
总结
以上是关于Codeforces Round #741 (Div. 2) ABCD1D2题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #741 Div. 2 A B C D1 D2
Codeforces Round #741 Div. 2 A B C D1 D2
Codeforces Round #741 div.2 A-F题解
Codeforces Round #741 Div. 2 A B C D1 D2