Codeforces Round 1003 (Div. 4)
ABCDE略
F
如果这个序列有两个一样的数挨着或者中间只隔一个其他的数,那么这个数就是多数。可以用反证法,构造一个多值序列无法不包含以上两种结构。只需要在树上找这两种结构就可以了
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10;
int T,n,a[N],fat[N],b[N],ans[N];
int ver[N*2],head[N],Next[N*2],tot;
void init()
{
for(int i=1;i<=n;i++)
ans[i]=head[i]=fat[i]=0;
for(int i=1;i<=2*n;i++)
ver[i]=Next[i]=0;
tot=0;
}
void add(int x,int y)
{
ver[++tot]=y;
Next[tot]=head[x],head[x]=tot;
}
void dfs(int x,int fa)
{
for(int i=head[x];i;i=Next[i])
{
int y=ver[i];
if(y==fa) continue;
fat[y]=x;
dfs(y,x);
}
}
void bfs()
{
queue<int> q;
q.push(1);
while(q.size())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=Next[i])
{
int y=ver[i];
if(y==fat[x]) continue;
b[a[y]]++;
if(b[a[y]]==2) ans[a[y]]=1;
q.push(y);
}
for(int i=head[x];i;i=Next[i])
{
int y=ver[i];
if(y==fat[x]) continue;
b[a[y]]=0;
}
}
}
void solve()
{
cin>>n;
init();
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
add(x,y),add(y,x);
}
dfs(1,-1);
for(int i=1;i<=n;i++)
if(a[i]==a[fat[i]]||a[i]==a[fat[fat[i]]]) ans[a[i]]=1;
bfs();
for(int i=1;i<=n;i++)
cout<<ans[i];
cout<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--) solve();
}
G
先分解质因数,可以构成半质数的有:两个不一样的质数,两个一样且有两个质因数的数,一个质数一个有两个质因数其中的一个和前面的数一样的
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int T,n,a[N],b[N],c[N][2],tot,d[N],zhi,ans,anss;
void init()
{
tot=zhi=ans=anss=0;
for(int i=1;i<=n;i++) b[a[i]]=d[a[i]]=0;
}
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
init();
for(int i=1;i<=n;i++)
{
if(a[i]<=3) {b[a[i]]++;zhi++;continue;}
int m=0,p[N],k=a[i];
for(int i=2;i<=sqrt(k);i++)
{
while(k%i==0) p[++m]=i,k/=i;
}
if(k>1) p[++m]=k;
if(m==1) b[a[i]]++,zhi++;
if(m==2)
{
c[++tot][0]=p[1],c[tot][1]=p[2];
ans++;
if(d[a[i]]) ans+=d[a[i]];
d[a[i]]++;
}
}
for(int i=1;i<=tot;i++)
{
if(b[c[i][0]]) ans+=b[c[i][0]];
if(c[i][1]!=c[i][0]&&b[c[i][1]]) ans+=b[c[i][1]];
}
for(int i=1;i<=n;i++)
{
if(b[a[i]]) anss+=b[a[i]]*(zhi-b[a[i]]),b[a[i]]=0;
}
cout<<ans+anss/2<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--) solve();
}