2020 Multi-University Training Contest 2部分补题
1001 Total Eclipse
Total Eclipse
题意
n座城市,m条道路,每个城市有一盏亮度为bi的灯,每次可以选择一个连通块让联通块上的所有城市的灯的亮度减1,亮度为0的城市不能算入连通块中,求让全部城市的灯的亮度变成0的最小次数是多少
思路
并查集
将亮度从大到小排序,然后依次来加入点x与x相邻的点y,如果xy不连通,则将y与x合并,且将x作为y的父亲,对于x,需要删除他时,他已经减去了他父亲节点的亮度,所以只需要再减去d-dfather的答案,最后求和。
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include<stdio.h> #include<algorithm> #include<iostream> #include<math.h> #include<string.h> #include<vector> using namespace std; int d[100010],f[100010],fa[100010],vis[100010],num[100010];//d[]表示数据,f[] 表示father,fa[]方便计算,vis[]表示是否计算,num[]记录序号 vector<int> v[100010]; int cmp(int a,int b) { return d[a]>d[b]; } int find(int x) { if(f[x]==x) return f[x]; return f[x]=find(f[x]); } int main() { int t,i; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) v[i].clear();//清空栈 for(i=1;i<=n;i++) { scanf("%d",&d[i]); f[i]=i; vis[i]=fa[i]=0; num[i]=i; } sort(num+1,num+1+n,cmp); for(i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); v[a].push_back(b); v[b].push_back(a); } for(i=1;i<=n;i++) { int x=num[i]; vis[x]=1; for(auto it:v[x]) { if(!vis[it]) continue; int fx=find(it); if(fx==x) continue; fa[fx]=f[fx]=x; } } long long cnt=0; for(i=1;i<=n;i++) { cnt+=d[i]-d[fa[i]]; } printf("%lld\n",cnt); } return 0; }
|
1006 The Oculus
The Oculus
题意
令修改的那一位为 k,则要找到这个 k 满足 A×B = C +Fk,其中 k ≤ 2000001。
思路
使用unsigned long long 暴力
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include<stdio.h> #include<math.h> #include<algorithm> #include<iostream> using namespace std; #define ull unsigned long long const int N=2000100; ull f[N]; int a[N]; int main() { int t,i; scanf("%d",&t); f[1]=1; f[2]=2; for(i=3;i<N;i++) f[i]=f[i-1]+f[i-2]; while(t--) { ull cnt_1=0,cnt_2=0,cnt; int n,m,q; scanf("%d",&n); for(i=1;i<=n;i++) { int x; scanf("%d",&x); cnt_1+=f[i]*x; } scanf("%d",&m); for(i=1;i<=m;i++) { int x; scanf("%d",&x); cnt_2+=f[i]*x; } scanf("%d",&q); cnt=cnt_1*cnt_2; for(i=1;i<=q;i++) { int x; scanf("%d",&x); cnt-=f[i]*x; } for(i=1;i<=q;i++) { if(cnt==f[i]) { printf("%d\n",i); continue; } } } return 0; }
|