标签:items 代码 online dfs unset printf bool 官方 img
由于本人水平不够,这场多校只写了第1题和第10题
第1题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6763
题意:给定一个无向图,每个点给定权值,每次选择一个连通块,将连通块里面所有点权值同时减1,直到所有点权值都变成 0,问最少需要几次
解题思路(官方题解):
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+5; 4 struct node 5 { 6 int id,bi; 7 }ss[N]; 8 int f[N],fa[N],b[N]; 9 bool vis[N]; 10 vector<int > vec[N]; 11 int n,m; 12 int find(int x) 13 { 14 if(f[x]==x)return x; 15 return f[x]=find(f[x]); 16 } 17 void init() 18 { 19 memset(vis,0,sizeof(vis)); 20 memset(fa,0,sizeof(fa)); 21 for(int i=0;i<N;i++) 22 f[i]=i,vec[i].clear(); 23 } 24 bool cmp(struct node x,struct node y) 25 { 26 return x.bi>y.bi; 27 } 28 29 int main() 30 { 31 int t; 32 scanf("%d",&t); 33 while(t--) 34 { 35 init(); 36 scanf("%d%d",&n,&m); 37 for(int i=1;i<=n;i++) 38 { 39 scanf("%d",&b[i]); 40 ss[i].bi=b[i]; 41 ss[i].id=i; 42 } 43 sort(ss+1,ss+1+n,cmp); 44 int u,v,father; 45 for(int i=0;i<m;i++) 46 { 47 scanf("%d%d",&u,&v); 48 vec[u].push_back(v); 49 vec[v].push_back(u); 50 } 51 for(int i=1;i<=n;i++) 52 { 53 u=ss[i].id; 54 vis[u]=1; 55 int len=vec[u].size(); 56 for(int j=0;j<len;j++) 57 { 58 v=vec[u][j]; 59 if(vis[v]==0)continue; 60 father=find(v); 61 if(father==u)continue; 62 fa[father]=f[father]=u; 63 } 64 } 65 long long ans=0; 66 for(int i=1;i<=n;i++) 67 ans+=b[i]-b[fa[i]]; 68 printf("%lld\n",ans); 69 } 70 return 0; 71 }
第10题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6763
1 #include<cstdio> 2 typedef long long ll; 3 const int N=55; 4 int Case,n,m,i,j,x,cnt[N],nxt[N],e[N][N][4];ll ans; 5 void dfs(int x,int a,int b,int c,int d){ 6 if(x>m){ 7 ll tmp=1LL*a*b*c*d; 8 if(tmp>ans)ans=tmp; 9 return; 10 } 11 int num=cnt[x]; 12 if(!num){ 13 dfs(nxt[x],a,b,c,d); 14 return; 15 } 16 for(int i=1;i<=num;i++)dfs(x+1,a+e[x][i][0],b+e[x][i][1],c+e[x][i][2],d+e[x][i][3]); 17 } 18 int main(){ 19 scanf("%d",&Case); 20 while(Case--){ 21 scanf("%d%d",&n,&m); 22 for(i=1;i<=m;i++)cnt[i]=0; 23 while(n--){ 24 scanf("%d",&x); 25 cnt[x]++; 26 for(j=0;j<4;j++)scanf("%d",&e[x][cnt[x]][j]); 27 } 28 x=m+1; 29 for(i=m;i;i--){ 30 nxt[i]=x; 31 if(cnt[i])x=i; 32 } 33 ans=0; 34 dfs(1,100,100,100,100); 35 printf("%lld\n",ans); 36 } 37 }
标签:items 代码 online dfs unset printf bool 官方 img
原文地址:https://www.cnblogs.com/zenghuan0620/p/13374176.html