题目链接:D. Zero Quantity Maximization
#include <bits/stdc++.h> using namespace std; #define maxn 200005 #define LL long long #define pii pair<LL,LL> map<pair<LL,LL>,LL>mp,mpp; LL a[maxn],b[maxn]; LL gcd(LL a,LL b){ return b?gcd(b,a%b):a; } int main(){ LL n; scanf("%lld",&n); for(LL j=0;j<n;j++){ scanf("%lld",&a[j]); } for(LL k=0;k<n;k++){ scanf("%lld",&b[k]); } LL mx = 0,ans = 0; for(LL j=0;j<n;j++){ LL z = gcd(abs(a[j]),abs(b[j])); if(b[j]<0){ a[j] = -a[j]; b[j] = -b[j]; } if(a[j]==0){ if(b[j]==0) ans++; continue; } if(b[j]==0){ mp[make_pair(1LL*0,1LL*0)]++; mx = max(mx, mp[make_pair(1LL*0,1LL*0)]); continue; } mp[make_pair(a[j]/z,b[j]/z)]++; mx = max(mx, mp[make_pair(a[j]/z,b[j]/z)]); } printf("%lld\n",mx+ans); }
F1: Spanning Tree with Maximum Degree
判断一下 bfs 就ok
#include<bits/stdc++.h> using namespace std; #define maxn 200005 #define LL long long vector<int>q[maxn]; int fa[maxn]; bool flag[maxn]; void bfs(int u){ queue<int>Q; Q.push(u); while(!Q.empty()){ u = Q.front(); Q.pop(); for(int j=0;j<q[u].size();j++){ int v = q[u][j]; if(!flag[v]){ flag[v] = 1; Q.push(v); printf("%d %d\n",u,v); } } } } int main(){ memset(fa,0,sizeof(fa)); memset(flag,0,sizeof(flag)); int n,m,mx=0,in=-1; scanf("%d%d",&n,&m); for(int j=0;j<m;j++){ int u,v; scanf("%d%d",&u,&v); q[u].push_back(v); q[v].push_back(u); fa[u]++; fa[v]++; if(mx<fa[u]){ mx = fa[u]; in = u; } if(mx<fa[v]){ mx = fa[v]; in = v; } } // cout<<in<<endl; flag[in] = 1; bfs(in); }
F2 :F2. Spanning Tree with One Fixed Degree
先判断 节点的度够不够 不够直接 输出 NO
dfs 判断1有多少个连通块 如果连通块数量 大于d 直接输出NO
最后 添加 在 1 节点添加 d-连通块个数个 点 bfs
#include <bits/stdc++.h> using namespace std; #define maxn 200005 #define LL long long #define pii pair<int,int> vector<int>q[maxn],z; vector<pii>lis; bool fa[maxn]; int n,m,d; void dfs(int u){ for(int j=0;j<q[u].size();j++){ int v = q[u][j]; if(!fa[v]){ fa[v] = 1; dfs(v); } } } bool bfs(int u){ queue<int>Q; int sum = 0; Q.push(u); while(!Q.empty()){ u = Q.front(); Q.pop(); for(int j=0;j<q[u].size();j++){ int v = q[u][j]; if(!fa[v]){ fa[v] = 1,sum++; Q.push(v); //cout<<u<<" "<<v<<endl; lis.push_back(make_pair(u,v)); if(u==1){ d--; if(d==0) break; } } } } //cout<<sum<<" "<<n-1<<endl; if(sum!=(n-1)) return 0; return 1; } int main(){ scanf("%d%d%d",&n,&m,&d); memset(fa,0,sizeof(fa)); int sum = 0; for(int j=0;j<m;j++){ int u,v; scanf("%d%d",&u,&v); q[u].push_back(v); q[v].push_back(u); if(u==1||v==1) sum++; } if(sum<d){ printf("NO\n"); return 0; } fa[1]=1; set<int>se; for(int j=0;j<q[1].size();j++){ int v = q[1][j]; if(!fa[v]){ fa[v]=1; se.insert(v); dfs(v); } } //cout<<se.size()<<endl; if(se.size()>d){ printf("NO\n"); return 0; } //cout<<*se.begin()<<endl; for(int j=0;j<q[1].size()&&se.size()<d;j++){ se.insert(q[1][j]); } q[1].clear(); for(auto &i:se){ //cout<<i<<endl; q[1].push_back((int)i); } memset(fa,0,sizeof(fa)); fa[1] = 1; bfs(1); printf("YES\n"); for(int j=0;j<lis.size();j++){ pii pa = lis[j]; printf("%d %d\n",pa.first,pa.second); } }