G:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1020501];
int cnt[1020501];
signed main()
{
int n,k;
cin>>n>>k;
int ans=0x3f3f3f3f;
int l=1;
int r=-1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cnt[a[i]]++;
if(cnt[1]>=1&&cnt[2]>=1&&cnt[3]>=1&&cnt[4]>=k)
{
r=i;
ans=min(ans,r-l+1);
cnt[l++]--;
}
}
cout<<ans<<endl;
}
D:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1020501];
int cnt[1020501];
int b[1020501];
int z;
void get(int c)
{
for(int i=1;i*i<=c;i++)
{
if(c%i==0)
b[++z]=i;
if(i!=c/i)
b[++z]=c/i;
}
}
signed main()
{
int q;
cin>>q;
while(q--)
{
int k,c,n;
cin>>k>>c>>n;
z=0;
get(c);
int ans=0;
for(int i=1;i<=z;i++)
{
if(c==b[i]) continue;
if((c-b[i])%k==0)
{
int a=(c-b[i])/k;
if(__gcd(a,b[i])>=n)
ans++;
}
}
cout<<ans<<endl;
}
}
C:利用的是兰道定理:【算法笔记】竞赛图(有向完全图)(相关题型总结)_繁凡さん的博客-CSDN博客
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1020501];
int cnt[1020501];
int edge[1020501];
signed main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int t;
cin>>t;
edge[i]+=t;
}
}
sort(edge,edge+n);
int s=0;
for(int i=1,j=0;i<=n;i++)
{
s+=edge[i-1];
if(s==(i-1)*i/2)
{
if(i-j<3)
{
cout<<n-1<<endl;
return 0;
}
j=i;
}
}
cout<<n<<endl;
}