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