20211014NOIP模拟赛

我的天啦,本蒟蒻不但没有爆零,而且还上了一百分,水到了112分;

第一题k轮最大生成树,大样例第一次跑过去了,但时间吗~~31秒(^_^),一顿玄学优化后21秒,然而并没有用,72分;

第二题不知为何编辑器炸了,CE了;

第三题在搜索与循环当中选择了循环,事实证明我是个SB,30分拜拜了,70-30=40;

第四题:太菜了,不会;

啊啊啊,为什么每天连写博客的时间都没有!!!

好吧。

我又来了~~~

第一题:用k个并查集维护每一条边在那一轮中被删除,从大到小枚举,如果找到了一个并查集中两个端点没有被联通,就把他放入该并查集中

 

复制代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e3+5;
 4 const int M=3e5+5;
 5 const int K=1e4+5;
 6 struct edge{
 7     int u,v;
 8     int w;
 9     int o;
10 }e[M];
11 int n,m,k,fa[N][K];
12 inline int getf(int x,int tk){
13     if(fa[x][tk]==x)return x;
14     return fa[x][tk]=getf(fa[x][tk],tk);
15 }
16 inline bool cmp(edge a,edge b){
17     return a.w>b.w;
18 }
19 int vis[M];
20 int cur[N][N];
21 int main(){    
22 //freopen("a2.in","r",stdin);
23     cin>>n>>m>>k;
24     
25     for(int i=1;i<=m;i++){
26         cin>>e[i].u>>e[i].v>>e[i].w,e[i].o=i;
27     }
28         sort(e+1,e+1+m,cmp);
29     for(int i=1;i<=n;++i)
30         for(int j=1;j<=k;j++)
31             fa[i][j]=i;
32     for(int i=1;i<=m;++i){
33         int u=e[i].u,v=e[i].v;
34         int t=cur[u][v]+1,f1=getf(u,t),f2=getf(v,t);
35         while(f1==f2&&t<k)
36             t++,f1=getf(u,t),f2=getf(v,t);
37         if(f1==f2)continue;
38         vis[e[i].o]=t;
39         fa[f2][t]=f1;
40         cur[u][v]=cur[v][u]=t;
41     } 
42     for(int i=1;i<=m;i++)
43         printf("%d\n",vis[i]);
44     return 0;
45 }
复制代码

 

第二题:思维题,先用最少的步数将一行变黑,在加上没有全变黑的列数~~

所以记录每行的白色个数,如果没有就加一;

复制代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 char a[600][600];
 5 int lieyou[600];
 6 int liequan[600];
 7 int num[600];
 8 int wu=0;
 9 int main(){
10     cin>>n;
11     memset(lieyou,false,sizeof lieyou);
12     memset(liequan,true,sizeof liequan);
13     for(int i=1;i<=n;i++){
14         for(int j=1;j<=n;j++){
15             cin>>a[i][j];
16             if(a[i][j]=='#') lieyou[j]=1,wu=1;
17             else liequan[j]=0,num[i]++;
18         }
19     }
20     if(!wu){
21         printf("-1\n");
22         return 0;
23     }
24     int ans=0x3f3f3f3f;
25     int Num=0;
26     for(int i=1;i<=n;i++){
27         if(liequan[i]) Num++;
28         if(lieyou[i]) ans=min(ans,num[i]);
29         else ans=min(ans,num[i]+1);
30     }
31     
32     printf("%d\n",ans+n-Num);
33 }
复制代码

 

第三题:蒟蒻爆搜上可以70分,正解是dp

复制代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 char a[600][600];
 5 int lieyou[600];
 6 int liequan[600];
 7 int num[600];
 8 int wu=0;
 9 int main(){
10     cin>>n;
11     memset(lieyou,false,sizeof lieyou);
12     memset(liequan,true,sizeof liequan);
13     for(int i=1;i<=n;i++){
14         for(int j=1;j<=n;j++){
15             cin>>a[i][j];
16             if(a[i][j]=='#') lieyou[j]=1,wu=1;
17             else liequan[j]=0,num[i]++;
18         }
19     }
20     if(!wu){
21         printf("-1\n");
22         return 0;
23     }
24     int ans=0x3f3f3f3f;
25     int Num=0;
26     for(int i=1;i<=n;i++){
27         if(liequan[i]) Num++;
28         if(lieyou[i]) ans=min(ans,num[i]);
29         else ans=min(ans,num[i]+1);
30     }
31     
32     printf("%d\n",ans+n-Num);
33 }
复制代码

 

第四题:用主席树上,具体我也不知道

posted @   SSZX_loser_lcy  阅读(42)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示