AtCoder Beginner Contest 367
A - Shout Everyday
思路
分类区间讨论
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
int a,b,c;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>a>>b>>c;
if(b>=c){
if(a>=c&&a<=b)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else{
if(a<=b||a>=c)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
B - Cut .0
思路
字符串模拟处理
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
string s;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>s;
int n=s.size();
s=" "+s;
int num=n;
if(s[n]=='0'){
num--;
if(s[n-1]=='0'){
num--;
if(s[n-2]=='0'){
num-=2;
}
}
}
for(int i=1;i<=num;i++)cout<<s[i];
cout<<endl;
//cout<<n<<endl;
return 0;
}
C - Enumerate Sequences
思路
数据较小,直接BFS
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 15, MAX = 1e9, INF = -1e9;
int n,k;
int r[N];
int ans[N];
void dfs(int x){
if(x>n){
int tot=0;
for(int i=1;i<=n;i++)tot+=ans[i];
if(tot%k==0){
for(int i=1;i<n;i++)cout<<ans[i]<<" ";
cout<<ans[n]<<endl;
return ;
}
}
for(int j=1;j<=r[x];j++){
ans[x]=j;
dfs(x+1);
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>r[i];
dfs(1);
return 0;
}
D - Pedometer
思路
数据较大,需要\(O(n^2)\)以下的时间复杂度,由于需要求出两点之间的距离,故考虑使用前缀和简化,考虑环,我们将原数组copy一边延长到后面,(最后一个距离不要),答案变成\((s[i]-s[j])\),对\(m\)整除,即要求\(s[i]\)和\(s[j]\)对\(m\)取余之后余数相同,但是由于距离不能超过一圈,所以不能直接用组合数学计算,考虑分段计算即可
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 4e5+30, MAX = 1e9, INF = -1e9;
int n,m;
int a[N];
int s[N];
map<int,int> mp;
int ans=0;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int j=n+1;j<=2*n-1;j++)a[j]=a[j-n];
s[0]=0;a[0]=0;
for(int i=1;i<=2*n-1;i++)s[i]=s[i-1]+a[i];
for(int i=1;i<=n;i++){
int x=s[i]%m;
if(mp.count(x)){
ans+=mp[x];
}
mp[x]++;
}
for(int i=1,j=1+n;i<=n;i++,j++){
int x=s[i]%m;
mp[x]--;
int xx=s[j]%m;
ans+=mp[xx];
}
cout<<ans<<endl;
return 0;
}