明天或者后天写题解,先把代码post上去
CF1167C News Distribution
#include<stdio.h>
#include<iostream>
using namespace std;
int a[1010101],b[501010],t[501010];
int find(int x){
if(a[x]!=x) a[x]=find(a[x]);
return a[x];
}
int main(){
int n,qus;
cin>>n>>qus;
for(int i=1;i<=n;i++) a[i]=i;
for(int i=0;i<qus;i++){
int s;
cin>>s;
for(int j=0;j<s;j++){
scanf("%d",&b[j]);
a[find(b[j])]=find(b[0]);
}
}
for(int i=1;i<=n;i++){
t[find(i)]++;
}
for(int i=1;i<=n;i++){
printf("%d ",t[find(i)]);
}
return 0;
}
CF920C Swap Adjacent Elements
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
int place[202020],a[202020],re[202020];
int main(){
int n,t;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i);
char s;
getchar();
for(int i=1;i<n;i++){
scanf("%c",&s);
re[i]=s-'0';
re[i]+=re[i-1];
}
for(int i=1;i<=n;i++){
if(abs(a[i]-i)!=abs(re[a[i]-1]-re[i-1]))
{
printf("NO\n");
return 0;
}
}
printf("YES");
return 0;
}
CF12C Fruits
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<utility>
#include<vector>
using namespace std;
map<string,int>p;
string s;
int a[101010];
bool cmp(const pair<string,int>&a,const pair<string,int>&b){
return a.second<b.second;
}
int main(){
int n,r;
scanf("%d %d",&n,&r);
for(int i=0;i<n;i++)scanf("%d",a+i);
sort(a,a+n);
for(int i=0;i<r;i++){
cin>>s;
p[s]++;
}
vector<pair<string, int>> vec(p.begin(), p.end());
sort(vec.begin(), vec.end(), cmp);
int min=0,max=0,j=0;
for (int i = vec.size()-1; i >=0 ; i--)
{
// printf("%d %dokok\n",vec[i].second,a[j]);
min+=vec[i].second*a[j++];
}
j=n-1;
for (int i = vec.size()-1; i >=0; i--)
{
max+=vec[i].second*a[j--];
}
cout<<min<<" "<<max<<endl;
return 0;
}
CF1263D Secret Passwords
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int a[10101010];
int find(int x){
if(a[x]!=x) a[x]=find(a[x]);
return a[x];
}
int main(){
int n;
int p[101010];
cin>>n;
for(int i=1;i<=26;i++)a[i]=i;
char str[101010];
for(int i=1;i<=n;i++){
cin>>str+1;
int o=strlen(str+1);
int x=str[1]-'a'+1;
p[x]=1;
int y;
if(o>1){
for(int j=2;j<=o;j++){
y=str[j]-'a'+1;
p[y]=1;
a[find(y)]=find(x);
}
}
}
int ans=0;
for(int i=1;i<=26;i++){
if(find(i)==i&&p[i])ans++;
// printf("i=%d ans=%d\n",i,ans);
}
cout<<ans<<endl;
}
CF893C Rumor
#include<stdio.h>
#include<iostream>
typedef long long ll;
using namespace std;
ll pi[10101010];
int a[10101010];
int find(int x){
if(a[x]!=x) a[x]=find(a[x]);
return a[x];
}
int main(){
int n,p;
//ll x[101010],y[101010];
cin>>n>>p;
for(int i=1;i<=n;i++)cin>>pi[i];
for(int i=1;i<=n;i++)a[i]=i;
for(int i=1;i<=p;i++){
int x,y;
cin>>x>>y;
if(pi[find(x)]>pi[find(y)])pi[find(x)]=pi[find(y)];
a[find(y)]=find(x);
//else pi[y]=pi[x];
}
ll sum=0;
for(int i=1;i<=n;i++){
if(find(i)==i)
sum+=pi[find(i)];
}
cout<<sum<<endl;
}