//1118 并查集
#include<bits/stdc++.h>
using namespace std;
int fa[10009];
int find(int x){
int a=x;
while(x!=fa[x]){
x=fa[x];
}
while(a!=fa[a]){
int z=a;
a=fa[a];
fa[z]=x;
}
return x;
}
void unionn(int a,int b){
int f1=find(a);
int f2=find(b);
if(f1!=f2){
fa[f1]=f2;
}
}
int book[10009];//一定要放外面放外面一开始才都是0
int main(){
for(int i=0;i<10009;i++){
fa[i]=i;
}
int n,_1,_2,_3;
scanf("%d",&n);
set<int> sum;
for(int i=0;i<n;i++){
scanf("%d%d",&_1,&_2);
sum.insert(_2);
for(int j=0;j<_1-1;j++){
scanf("%d",&_3);
sum.insert(_3);
unionn(_2,_3);
}
}
int cnt=0;
for(int i=1;i<=sum.size();i++){
book[find(i)]++;
}
for(int i=1;i<=sum.size();i++){
if(book[i]>0){
cnt++;
}
}
printf("%d %d\n",cnt,sum.size());
int k,_5,_6;
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d%d",&_5,&_6);
if(find(_5)==find(_6)){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}
//1114 并查集
#include<bits/stdc++.h> //耗时比较长
using namespace std;
struct pri{
double num,ara;
};
struct node{
int minid,num;
double sumnum,sumar;
};
bool cmp(node&a,node&b){
if(a.sumar!=b.sumar){
return a.sumar>b.sumar;
}else{
return a.minid<b.minid;
}
}
int fa[10000];
int find(int x){
int a=x;
while(x!=fa[x]){
x=fa[x];
}
while(a!=fa[a]){
int z=a;
a=fa[a];
fa[z]=x;
}
return x;
}
void unionn(int a,int b){
int f1=find(a);
int f2=find(b);
if(f1!=f2){
fa[f1]=f2;
}
}
int book[10000],book1[10000];
int main(){
for(int i=0;i<10000;i++){
fa[i]=i;
}
set<int> a;
map<int,pri> geti;
map<int,int> anst;
int n,_1,_11,_22,_3,_4;
double _5,_6;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d%d%d",&_1,&_11,&_22,&_3);
a.insert(_1);
if(_22!=-1){
unionn(_1,_22);
a.insert(_22);
}
if(_11!=-1){
unionn(_1,_11);
a.insert(_11);
}
for(int j=0;j<_3;j++){
scanf("%d",&_4);
unionn(_1,_4);
a.insert(_4);
}
scanf("%lf%lf",&_5,&_6);
pri temp=pri{_5,_6};
geti[_1]=temp;
}
vector<node> ans;
int nt=0,cnt=0;
for(auto it=a.begin();it!=a.end();it++){
if(book1[find(*it)]==0){
anst[find(*it)]=nt;
nt++;
ans.push_back({*it});//有只赋值一次的变量直到根不同再申请其他空间
book1[find(*it)]=1;
cnt++;
}
ans[anst[find(*it)]].num++;
ans[anst[find(*it)]].sumnum+=geti[*it].num;
ans[anst[find(*it)]].sumar+=geti[*it].ara;
}
for(int i=0;i<ans.size();i++){
ans[i].sumnum=ans[i].sumnum/ans[i].num;
ans[i].sumar=ans[i].sumar/ans[i].num;
}
sort(ans.begin(),ans.end(),cmp);
printf("%d\n",cnt);
for(int i=0;i<ans.size();i++){
printf("%04d %d %.3lf %.3lf\n",ans[i].minid,ans[i].num,ans[i].sumnum,ans[i].sumar);
}
return 0;
}
//1107 并查集
#include<bits/stdc++.h>
using namespace std;
int fa[1010];
int book[1010];
int find(int x){
int a=x;
while(x!=fa[x]){
x=fa[x];
}
while(a!=fa[a]){
int z=a;
a=fa[a];
fa[z]=x;
}
return x;
}
void unionn(int a,int b){
int f1=find(a);
int f2=find(b);
if(f1!=f2){
fa[f1]=f2;
}
}
bool cmp(int&a,int &b){
return a>b;
}
vector<int> a[1010];
int main(){
for(int i=0;i<1010;i++){//并查集先初始化
fa[i]=i;
}
int n,_1,_2;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d:",&_1);
for(int j=0;j<_1;j++){//for循环内外计数参数重名
scanf("%d",&_2);
a[_2].push_back(i);
}
}
for(int i=1;i<1010;i++){
if(a[i].size()!=0){
for(int j=1;j<a[i].size();j++){
unionn(a[i][0],a[i][j]);
}
}
}
for(int i=1;i<=n;i++){//对应下表很重要不要有多余
book[find(i)]++;
}
int cnt=0;
vector<int> ans;
for(int i=1;i<=n;i++){
if(book[i]>0){
cnt++;
ans.push_back(book[i]);
}
}
sort(ans.begin(),ans.end(),cmp);
printf("%d\n",cnt);
for(int i=0;i<ans.size();i++){
if(i!=0) printf(" ");
printf("%d",ans[i]);
}
return 0;
}
//1002
#include<bits/stdc++.h>
using namespace std;
double book[1009];
int main(){
int k,_1;
double _2;
for(int i=0;i<2;i++){
scanf("%d",&k);
for(int j=0;j<k;j++){
scanf("%d%lf",&_1,&_2);
book[_1]+=_2;
}
}
int cnt=0;
for(int i=0;i<1009;i++){
if(book[i]!=0){
cnt++;
}
}
printf("%d",cnt);
for(int i=1008;i>=0;i--){
if(book[i]!=0){
printf(" %d",i);
printf(" %.1lf",book[i]);
}
}
return 0;
}
//1006
#include<bits/stdc++.h>
using namespace std;
int swit(string a){
int h=stoi(a.substr(0,2));
int m=stoi(a.substr(3,2));
int s=stoi(a.substr(6,2));
return h*3600+m*60+s;
}
struct node{
string id;
int in,out;
};
int flag=0;
bool cmp(node&a,node&b){
if(flag==0){
return a.in<b.in;
} else{
return a.out>b.out;
}
}
vector<node> aa;
int main(){
int n;
scanf("%d",&n);
string _1,_2,_3;
for(int i=0;i<n;i++){
cin>>_1>>_2>>_3;
aa.push_back({_1,swit(_2),swit(_3)});
}
sort(aa.begin(),aa.end(),cmp);
string an1=aa[0].id;
flag=1;
sort(aa.begin(),aa.end(),cmp);
string an2=aa[0].id;
printf("%s %s",an1.c_str(),an2.c_str());
return 0;
}
//1012 名词不要过度省略 尽量形象一些 find 判map结构体键值对空
#include<bits/stdc++.h>
using namespace std;
struct node{
long long int id;
int gr[4];
int ra[4];
int ber;
int be;
};
int flag=0;
bool cmp(node&a,node&b){
return a.gr[flag]>b.gr[flag];
}
int main(){
int n,m,nt=0;
long long int _1;
int _2,_3,_4;
double _5;
map<int,node> xu;//处理完后统一建键值对
scanf("%d%d",&n,&m);
vector<node> ans(n);
for(int i=0;i<n;i++){
scanf("%lld%d%d%d",&_1,&_2,&_3,&_4);
_5= (_2+_3+_4)/3*1.0+0.5;//
ans[nt].gr[0]=_5;
ans[nt].gr[1]=_2;
ans[nt].gr[2]=_3;
ans[nt].gr[3]=_4;
ans[nt].id=_1;
nt++;
}
for(int i=0;i<4;i++){
flag=i;
sort(ans.begin(),ans.end(),cmp);
ans[0].ra[i]=1;
for(int j=1;j<ans.size();j++){
// ans[j].ra[i]=ans[j-1].gr[i] ==ans[j].gr[i]?ans[j-1].gr[i]:j+1;
ans[j].ra[i]=ans[j-1].gr[i] ==ans[j].gr[i]?ans[j-1].ra[i]:j+1;//等于前一个排名而不是gra
}//名词不要过度省略 尽量形象一些
}
/* for( flag=0;flag<=3;flag++){//flag是全局变量不能另外声明一个(注意)
sort(ans.begin(),ans.end(),cmp);
ans[0].ra[flag]=1;
for(int i=1;i<n;i++){
ans[i].ra[flag]=i+1;
if(ans[i].gr[flag]==ans[i-1].gr[flag]){
ans[i].ra[flag]=ans[i-1].ra[flag];
}
}
}*/
for(int i=0;i<ans.size();i++){
ans[i].ber=ans[i].ra[0];
ans[i].be=0;
for(int j=1;j<4;j++){
if(ans[i].ra[j]<ans[i].ber){
ans[i].ber=ans[i].ra[j];
ans[i].be=j;
}
}
xu[ans[i].id]=ans[i];
}
int _7;
char we[4]={'A','C','M','E'};
for(int i=0;i<m;i++){
scanf("%d",&_7);
if(xu.find(_7)!=xu.end())//map与结构体建立键值对判空方式使用find函数
printf("%d %c\n",xu[_7].ber,we[xu[_7].be] );
else {
printf("N/A\n");
}
}
return 0;
}
6道
总结
并查集部分 初始化 查 并
排序查找stl部分注意小细节