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();
}