2019浙江赛省赛(一些感想)

早上7点出头就醒了,辗转反侧。顾及我赛后的情绪。这里省略热身赛,省略午饭。

因睡眠时间充足,比赛状态还行。前面5道水题不说了。马拉车那题因为模板不够熟悉,初始化问题错了。数学那题因为队友直接推出来了,但是蒙圈了很久才反应过来自己已经推出来了。

我一直在敲c题,因为是队友的想法,我不是很熟悉。花了2个小时敲出来各种bug,最后放弃。

反思: 在敲代码的时候,没有分析当前敲的题目所需要的时间以及复杂性。就算开始敲了,认为过于复杂应该及时停下来。如果这次比赛没有死磕C题,我觉得队友那题数学题我可以秒出。

不得不说的是图的那题。简单的想法,居然一直段错误。后面三个人盯着看了半个小时,还是找不到问题。对于自己代码很自信的我们直接去问了评委,要求重判。评委也是比较负责,搞了很久。最后出来说是并查集的递归问题,想了想,确实有可能1e6次递归。浙大的oj的栈空间直接炸了。以前1e6次递归也没见过这种问题啊。真的是无语,其它oj怎么就可以呢?女队友听到后就直接哭了,确实让人不服。

55名铜首,本来8题来着qaq。就当公费旅游吧。此刻心中凝重,仿佛低到尘埃里。

晚上理所应当地失眠了。

补:

连边的方向反一下就是两个点了,这次被数据制裁真的是服了。

回来后交换了一下连边顺序就过了。并且用原代码试了试其他oj。hdu、codeforces、计蒜客、牛客网等都不会因为爆栈的问题出错。真的希望可以给一个公道,虽然说省赛就是个小比赛,但是拿铜真的不爽。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000005;
int fa[maxn],mi[maxn],head[maxn];
int Ans[maxn],cnt,ans;
bool vis[maxn];
struct edge{
    int to,nex;
}e[maxn<<1];
void add(int u,int v){
    e[cnt].to=v,e[cnt].nex=head[u];
    head[u]=cnt++;
}
int fin(int x){
    return fa[x]==x?x:fa[x]=fin(fa[x]);
}
priority_queue<int,vector<int>,greater<int> > Q;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            head[i]=-1;
            fa[i]=i;
            mi[i]=i;
            vis[i]=0;
        }
        for(int i=1;i<=m;i++){
            int a,b; scanf("%d%d",&a,&b);
            add(a,b);
            add(b,a);
            int f1=fin(a),f2=fin(b);
            if(f1!=f2){
                swap(f1,f2);
                // 正向一条链,反向两个点,要哭了
                fa[f1]=f2;
                mi[f2]=min(mi[f1],mi[f2]);
            }
        }
        ans=0;
        for(int i=1;i<=n;i++){
            if(fin(i)==i){
                ans++;
                Q.push(mi[i]);
                vis[mi[i]]=1;
            }
        }

        int now=0;
        while(!Q.empty()){
            int p=Q.top();Q.pop();
            Ans[++now]=p;
            for(int i=head[p];i!=-1;i=e[i].nex){
                int to=e[i].to;
                if(vis[to]) continue;
                Q.push(to);
                vis[to]=1;
            }
        }
        printf("%d\n",ans);
        for(int i=1;i<=now;i++){
            printf("%d%c",Ans[i],(i==now?'\n':' '));
        }
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值