Codeforces Round #506 (Div. 3)未完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #506 (Div. 3)未完结相关的知识,希望对你有一定的参考价值。
2022.3.8
题单地址:https://codeforces.com/contest/1029
目录
- A. Many Equal Substrings
- B. Creating the Contest【贪心】
- C. Maximal Intersection【multiset 的用法】
- D. Concatenated Multiples【离线预处理】
A. Many Equal Substrings
就是找最长的前缀和后缀
#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
string s;
int main(void)
cin>>n>>k>>s;
for(int i=1;i<s.size();i++)
string temp1=s.substr(i);
string temp2=s.substr(0,temp1.size());
if(temp1==temp2)
ans=temp1.size();
break;
string temp=s.substr(ans);
for(int i=0;i<k-1;i++) s+=temp;
cout<<s;
return 0;
B. Creating the Contest【贪心】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*4+10;
typedef long long int LL;
LL a[N],n,cnt,ans=1;
int main(void)
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
cnt=1;
for(int i=1;i<n;i++)
if(a[i]<=a[i-1]*2) cnt++;
else cnt=1;
ans=max(ans,cnt);
cout<<ans;
return 0;
C. Maximal Intersection【multiset 的用法】
你会发现如果是俄罗斯套娃这样的,你会发现公共部分就是最小的右端点-最大的左端点
如果不是上述情况,那么说明是有好几堆,此时的最小的右端点-最大的左端点
是一个负数,无解。
#include<bits/stdc++.h>
using namespace std;
multiset<int>l,r;
vector<pair<int,int>>ve;
int n;
int main(void)
cin>>n;
for(int i=0;i<n;i++)
int a,b; cin>>a>>b;
ve.push_back(a,b);
l.insert(a);
r.insert(b);
int ans=0;
for(int i=0;i<n;i++)
int x=ve[i].first,y=ve[i].second;
l.erase(l.find(x)),r.erase(r.find(y));
int r1=*r.begin(),l1=*l.rbegin();
int len=max(0,r1-l1);
ans=max(ans,len);
l.insert(x),r.insert(y);
cout<<ans;
return 0;
D. Concatenated Multiples【离线预处理】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
map<pair<int,int>,int>mp;
LL n,k,a[N];
LL f[15]=
0,10,100,1000,10000,100000,1000000,10000000,
100000000,1000000000,10000000000;
LL get(LL x)
int cnt=0;
while(x) x/=10,cnt++;
return cnt;
int main(void)
scanf("%llu%llu",&n,&k);
for(int i=0;i<n;i++)
scanf("%llu",&a[i]);
for(LL j=1;j<=10;j++)//预处理
LL temp=(a[i]%k)*(f[j]%k);
temp=temp%k;
mp[j,temp]++;
LL ans=0;
for(int i=0;i<n;i++)
LL temp=(k-(a[i]%k))%k;
LL len=get(a[i]);
if(mp.count(len,temp)) ans+=mp[len,temp];
temp=a[i]%k*f[len]+a[i];
if(temp%k==0) ans--;//减去自身
cout<<ans;
return 0;
以上是关于Codeforces Round #506 (Div. 3)未完结的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) C. Maximal Intersection
Codeforces Round #506 (Div. 3) C. Maximal Intersection (枚举)
Codeforces Round #506 (Div. 3) D. Concatenated Multiples