学校に戻って初めてAtCoderをプレイして、夜は寮にいないような気がしました~~
A-遅れないでください
数学の問題のサインイン
#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-サブストリング
直接暴力
#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-ペアの積の合計
プレプロセスのプレフィックスと
#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-友達
そして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-カバーしてください
数論の問題を解決して久しぶりで、ふるい法を忘れてしまいました。戻ってkuangbinを復習します。
方法1
2つの数値の最大公約数が1ではない場合、素因数を分解した後、2つの数値は同じでなければなりません品質係数。- O(NAI)O(N \ SQRT {a_iを})O (na私) 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;
}
方法2、
方法1、逆を行い、元の数値を素因数に分解します。方法2はそれを行うことです。2つの数値の最大公約数はdであると考え、2つの数値はdの倍数でなければならず、元の配列の数値を直接激しくふるい分けます倍数の数。数が1より大きい場合、そうではないpairwise coprime
- O(NログN)O(NlogN)O (N l o g N ) 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-最短経路の問題が嫌い
それを補うためにラインツリーに穴を残す?
さあ〜