夜深人静写题解--杭电第四场
Posted plys
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了夜深人静写题解--杭电第四场相关的知识,希望对你有一定的参考价值。
1001.AND Minimum Spanning Tree
题意:已知一个完全图,共有N个点,按1-N编号,点与点之间的边权为两点的编号相与,求权值和最小生成树,相同权值和输出最小的字典序方案
思路:为了保证可以得到权值和最小,对于每个点可以贪心的去找与其与值最小的点,为保证字典序最小,应找到第一个与其相与可以得到最小的点
方案:枚举每个点二进制位上最低0的位置,得到相遇的点,比如X的二进制位1110011110111,则与其相与的最小的点为1000,若用此方法找到的值比N值大,则将其与1相与
代码:
#include<bits/stdc++.h> using namespace std; const int maxn = 1e6+7; int b[maxn]; int main() int n; int t; cin>>t; while(t--) cin>>n; long long int ans=0; for(int i=2; i<=n; i++) if(i%2==0) b[i]=1; ans+=((i&1)*1ll); else int t=i; for(int j=0;j<=30;j++) if((t&(1<<j))!=0) continue; else if((1<<j)>n) b[i]=1; else b[i]=1<<j; ans+=((b[i]&i)*1ll); break; printf("%lld\n",ans); for(int i=2; i<=n; i++) printf("%d%c",b[i],i==n?‘\n‘:‘ ‘);
1007.Just an Old Puzzle
题意:类似于奇数码问题,问是否可以将一个图转化成另一个图
思路:裸题直接搞
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 5 int mp[25],ans=0; 6 int t; 7 cin>>t; 8 while(t--) 9 10 ans=0; 11 memset(mp,0,sizeof(mp)); 12 for(int i=0; i<16; i++) 13 14 scanf("%d",&mp[i]); 15 if(!mp[i]) 16 ans+=6-i%4-i/4; 17 for(int j=0; j<i; j++) 18 if(mp[j]>mp[i]) 19 ans++; 20 21 if(ans&1) 22 puts("Yes"); 23 else 24 puts("No"); 25 26 27
1008. K-th Closest Distance
题意:给定一个数组,每次查询l-r区间之内与K距离第k近的元素,题目要求强制在线,每次输出答案为上一个的答案异或当前答案
思路:对于每个区间查询与K距离最近的元素,可以通过二分答案,查询当前区间处于[p-ans,p+ans]的数是否大于k个,同个check上述条件完成题目
1010.Minimal Power of Prime
题意:通过对于一个数,求解素因子权值的最小值
思路:待补
以上是关于夜深人静写题解--杭电第四场的主要内容,如果未能解决你的问题,请参考以下文章
杭电多校第四场 1003 Contest of Rope Pulling(随机化+动态规划)