10016 学生管理 模拟
细节:分配学号、删除学生、替换学生、不合法判断
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
class Stu{
public:
string name;
string gen;
int age;
int score;
int no;
int del;//
};
map<string,Stu>mp;
void err(){
cout<<"404 not found!"<<endl;
}
int nxt(){
vector<int>v;
for(auto i:mp){
Stu s=i.second;
if(s.del==0)v.push_back(s.no);
}
if(v.size()==0)return 10001;
sort(v.begin(),v.end());
int la=10000;
for(int i=0;i<v.size();i++){
if(v[i]-la>1)return la+1;
la=v[i];
}
return la+1;
}
int main(){
int q;cin>>q;
while(q--){
int op;cin>>op;
if(op==1){
Stu s;cin>>s.name>>s.gen>>s.age>>s.score;
if(mp.count(s.name)==0)s.no=nxt();
else s.no=mp[s.name].no;
s.del=0;
mp[s.name]=s;
}
if(op==2){
string name;cin>>name;
if(mp.count(name)==0){
err();
}else{
if(mp[name].del==1)err();
else mp[name].del=1;
}
}
if(op==3){
int no;cin>>no;int fl=0;
for(auto i:mp){
Stu s=i.second;
if(s.del!=0)continue;
if(i.second.no==no){
fl=1;
cout<<i.second.name<<endl;
}
}
if(!fl)err();
}
if(op==4){
int mx=-1;
for(auto i:mp){
Stu s=i.second;
if(s.del!=0)continue;
mx=max(mx,s.score);
}
if(mx==-1)err();
else cout<<mx<<endl;
}
if(op==5){
int m=0,g=0;
for(auto i:mp){
Stu s=i.second;
if(s.del!=0)continue;
if(s.gen=="M")m++;
if(s.gen=="G")g++;
}
if(m==0&&g==0)err();
else if(m>g)cout<<"Boy"<<endl;
else if(m<g)cout<<"Girl"<<endl;
else if(m==g)cout<<"Equal"<<endl;
}
if(op==6){
map<int,int>num;
for(auto i:mp){
Stu s=i.second;
if(s.del!=0)continue;
if(num.count(s.age)==0)num[s.age]=1;
else num[s.age]++;
}
if(num.size()==0)err();
else{
int mx=0;int ans=0;
for(auto i:num){
if(mx<i.second){
mx=i.second;
ans=i.first;
}
}
cout<<mx<<" "<<ans<<endl;
}
}
}
//system("pause");
}
10021 找数2 unordered_map/hash
细节:注意longlong
#include<bits/stdc++.h>
using namespace std;
#define ll long long
unordered_map<ll,int>mp;
int main(){
ll n,q;scanf("%lld",&n);ll t;
for(int i=1;i<=n;i++){
scanf("%lld",&t);
mp[t]=i;
}
scanf("%lld",&q);
while (q--)
{
scanf("%lld",&t);
printf("%d\n",mp[t]);
}
//system("pause");
}
10029 喝茶 并查集
题意:输出连通分支数目
#include<bits/stdc++.h>
using namespace std;
namespace BCJ{
int fa[100005];
int rnk[100005];
int sz=0;
int find(int x){
if(x==fa[x])return fa[x];
else return fa[x]=find(fa[x]);
}
void uni(int x,int y){//两点合并
int nx=find(x);int ny=find(y);
if(nx==ny)return ;
if(rnk[nx]<rnk[ny])fa[nx]=ny;
if(rnk[nx]>rnk[ny])fa[ny]=nx;
if(rnk[nx]==rnk[ny]) fa[ny]=nx,rnk[nx]++;
sz--;
return ;
}
void init(int n){
for(int i=0;i<=n;i++)fa[i]=i,rnk[i]=0;
sz=n;
}
}
int main()
{
using namespace BCJ;
int n,m;scanf("%d %d",&n,&m);
init(n);
while(m--){
int x,y;scanf("%d %d",&x,&y);
uni(x,y);
}
printf("%d\n",sz-1);
}