回学校第一次打AtCoder,感觉晚上在寝室打不在状态~~
A - Don’t be late
数学题签到
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
ll a[N];
int n;
int main()
{IO;int d,t,s;cin>>d>>t>>s;int x=(d+s-1)/s;if(t>=x) cout<<"Yes"<<endl;else cout<<"No"<<endl;return 0;
}
B - Substring
直接暴力即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mkp(a,b) make_pair(a,b)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int main()
{IO;string s,t;cin>>s>>t;int res=1e9;for(int i=0;i+t.size()<=s.size();i++){int cnt=0;for(int j=0;j<t.size();j++) if(s[j+i]!=t[j]) cnt++;res=min(cnt,res);}cout<<res<<endl;return 0;
}
C - Sum of product of pairs
预处理前缀和即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010,mod=1e9+7;
ll a[N],s[N];
int n;
int main()
{IO;cin>>n;for(int i=1;i<=n;i++) {cin>>a[i];s[i]=s[i-1]+a[i];}ll res=0;for(int i=1;i<=n;i++)res=(res+(s[n]-s[i])%mod*a[i]%mod)%mod;cout<<res<<endl;return 0;
}
D - Friends
并查集维护sz[]
找个最大的即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=200010,mod=1e9+7;
int p[N],sz[N];
int n,m;
int find(int x)
{if(x!=p[x]) p[x]=find(p[x]);return p[x];
}
int main()
{IO;cin>>n>>m;for(int i=1;i<=n;i++) p[i]=i,sz[i]=1;while(m--){int a,b;cin>>a>>b;int pa=find(a),pb=find(b);if(pa!=pb){p[pa]=pb;sz[pb]+=sz[pa];}}int res=0;for(int i=1;i<=n;i++) if(i==p[i]) res=max(res,sz[i]);cout<<res<<endl;return 0;
}
E - Coprime
太久没做过数论题目了,筛法啥的都忘完了,回头刷kuangbin复习复习吧
方法一
如果两个数最大公约数不为1,那么对两个数进行分解质因数后一定有相同的质因子。——O(nai)O(n\sqrt{a_i})O(nai) 1040ms
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000010;
int a[N],cnt[N];
int n;
int gcd(int a,int b)
{return b?gcd(b,a%b):a;
}
void divide(int x)
{for(int i=2;i<=x/i;i++){if(x%i==0) {cnt[i]++;while(x%i==0) x/=i;}}if(x>1) cnt[x]++;
}
int main()
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) divide(a[i]);int d=a[1];for(int i=2;i<=n;i++) d=gcd(d,a[i]);bool ok=1;for(int i=1;i<N;i++)if(cnt[i]>1) {ok=0;break;}if(ok) cout<<"pairwise coprime"<<endl;else if(d==1) cout<<"setwise coprime"<<endl;else cout<<"not coprime"<<endl;return 0;
}
方法二
方法一反着做,将原数分解质因数,方法二是正着做,考虑两个数最大公约数是d那么两个数一定是d的倍数,直接暴力筛原数组中一个数的倍数的个数。如果个数大于1就不是pairwise coprime
——O(NlogN)O(NlogN)O(NlogN) 248ms
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000010;
int a[N],mp[N];
int n;
int gcd(int a,int b)
{return b?gcd(b,a%b):a;
}
int main()
{cin>>n;for(int i=1;i<=n;i++) {cin>>a[i];mp[a[i]]++;}bool ok=1;for(int i=2;i<N;i++){int cnt=0;for(int j=i;j<N;j+=i) cnt+=mp[j];if(cnt>1){ok=0;break;}}int d=a[1];for(int i=2;i<=n;i++) d=gcd(d,a[i]);if(ok) cout<<"pairwise coprime"<<endl;else if(d==1) cout<<"setwise coprime"<<endl;else cout<<"not coprime"<<endl;return 0;
}
F - I hate Shortest Path Problem
线段树 留个坑回来补一下?
要加油哦~