首页 > 其他分享 >CSP2023 游记

CSP2023 游记

时间:2023-10-20 09:26:25浏览次数:24  
标签:min int CSP2023 割点 ++ dfn low 游记

CSP2023 游记

本来是写游记,现在发现好像成了复习博客。

Day -3

上午打了一场模拟赛,又垫底了。

好像是信心赛,但是只会前两道(恼了!)。

发现 accoders 在 CSP 前两天还有模拟赛,悲。

复习 Tarjan

注意:Tarjan 题目常见图不连通情况。

  • low[u] 表示以 \(u\) 为根的子树中结点以及这些结点通过一条非树边能到达的结点的最小 dfn

有向图:

  1. 强连通分量:low[x] == dfn[x]

有向图中两个顶点可以互相到达,称为他们强连通;强连通分量是有向图的极大强连通子图。

一张图中所有强连通分量缩点后得到一个 DAG;设出度为 \(0\) 的点数为 \(x\),入度为 \(0\) 的点数为 \(y\),那么将一张 DAG 修改为一个强连通分量至少要加 \(\max \left\{x,y \right\}\) 条边。

void dfs(int x) {
	tot ++;
	dfn[x] = low[x] = tot;

	st.push(x);
	vis[x] = 1;

	for(int i = h[x];i;i = e[i].next) {
		int to = e[i].to;

		if(!dfn[to]) {
			dfs(to);
			low[x] = min(low[x],low[to]);
		}
		else if(vis[to])
			low[x] = min(low[x],dfn[to]);
	}

	if(low[x] == dfn[x]) {
		int res = 0;

		while(true) {
			res ++;
			int t = st.top();
			vis[t] = 0;
			st.pop();

			if(t == x)
				break;
		}

		if(res != 1)
			ans = min(ans,res);
	}
}

强连通分量一般用于缩点,例如受欢迎的牛。

无向图:

  1. 割点:dfn[x] <= low[to]

由于 low[u] 可以理解为 \(u\) 子树中的点通过一条非树边能回溯到的最小 dfs 序,那么如果某个结点 to 不能回溯到 x 或其之前结点,点 \(x\) 为割点。

void dfs(int x,int fa) {
    // fa 表示父节点,用于判断根节点的 
    tot ++;
    dfn[x] = low[x] = tot;
    
    int child = 0;
    // 存该节点的子树个数,用来判断根节点是否为割点

    for(int i = h[x];i;i = e[i].next) {
        int to = e[i].to;
        if(!dfn[to]) {
            dfs(to,fa);
         
            low[x] = min(low[x],low[to]);
            
            if(low[to] >= dfn[x] && x != fa)
                cut[x] = 1;// 标记为割点
                // 这里特判了不是根节点 
            
            if(x == fa)
                child++;// 记录子树
        }

        low[x] = min(low[x],dfn[to]);
    }

    if(x == fa && child >= 2)
        cut[x] = 1;
        // 是根节点并且有两个或以上的子树
        // 一定是割点 
}
  1. 割边:dfn[x] < low[to]

注意区分割边与割点的判断条件,当 dfn[x] == low[to] 时,\(x\) 是割点,但 \((x,to)\) 不是割边。

求割边不需要考虑根的情况。

Day -2

上午打了一场模拟赛,又垫底了。

横叉边有个性质:存在横叉边 \((u,v)\) 当且仅当 \(v\) 可到达 \(\operatorname{lca}(u,v)\)。

圆方树

广义原方树把点双看作方点,点看作圆点。

实际上是将点双内的边缩成一个方点,再从该方点向点双内其他点连边。

这样得到一棵树。

圆方树可以描述两点之间路径必经结点,原图任意两点之间所有割点等。

每个点双实际上缩成了以方点为中心点的菊花图,各个点双之间以割点相连。

一些性质:

  • 圆点 \(x\) 的度数等于包含它的点双个数。
  • 原图上直接相连的 \(u,v\) 包含于同一点双。
  • 圆点 \(x\) 是叶子当且仅当它在原图不是割点。
  • \(x,y\) 简单路径上的所有圆点恰好是原图 \(x,y\) 之间的所有必经点。

这些性质实质上表达的就是,圆方树完整地保留了原图的必经性。

晚上刷了一堆板子,打算明天模拟赛继续刷板子。

Day -1

上午打了一场模拟赛,又垫底了。

第一题签到题,签了个道就走人了。

考虑写点双、边双模板。

  1. 点双联通分量:不存在割点的极大子图

孤立的一个点也是点双。

当 \(x\) 为割点时弹栈,栈顶到 \(to\) 都属于这个点双,割点也属于这个点双。

割点可能在多个点双内,不能弹栈;\(to\) 的子树内所有点双都处理了就可以弹。

void dfs(int x,int root) {
    tot ++;
    dfn[x] = low[x] = tot;
    st[++top] = x;

    if(x == root && h[x] == 0) {
        num ++;
        ans[num].push_back(x);

        return ;
    }
    
    for(int i = h[x];i;i = e[i].next) {
        int to = e[i].to;

        if(!dfn[to]) {
            dfs(to,root);

            low[x] = min(low[x],low[to]);

            if(low[to] >= dfn[x]) {
                num ++;
                int k;

                do {
                    k = st[top];
                    top --;
                    ans[num].push_back(k);
                }while(k != to);

                ans[num].push_back(x);
            }

        }
        else
            low[x] = min(low[x],dfn[to]);
    }
}
  1. 边双联通分量:不存在割边的极大子图

考虑寻找割边,删去割边后剩下的若干个连通块实质上就是所有边双。

注意考虑重边的问题,两个点之间有重边也算边双。所以就不能像之前一样判点了,要判断边是否走过。

// cnt 初始赋为 1,fa 传 0
void dfs1(int x,int fa) {
    tot ++;
    dfn[x] = low[x] = tot;
    st[++top] = x;
    
    for(int i = h[x];i;i = e[i].next) {
        int to = e[i].to;

        if(!dfn[to]) {
            dfs1(to,i);

            low[x] = min(low[x],low[to]);

            if(low[to] > dfn[x]) 
                cut[make_pair(x,to)] = cut[make_pair(to,x)] = 1;
        }
        else if(i != (fa ^ 1))
            low[x] = min(low[x],dfn[to]);
    }
}

void dfs2(int x) {
    vis[x] = 1;
    ans[num].push_back(x);
 
    for(int i = h[x];i;i = e[i].next) {
        int to = e[i].to;

        if(vis[to] || cut[make_pair(x,to)])
            continue;
        
        dfs2(to);
    }
}

打了一遍树剖,写成 tag 为 \(0\) 才 Pushdown 了,恼。

下午接着打点分治。

Day 0

不跑操 + 提前发手机,直接双喜临门。

看大纲发现平衡树是提高组内容,临时复习 FHQ-Treap。

标签:min,int,CSP2023,割点,++,dfn,low,游记
From: https://www.cnblogs.com/baijian0212/p/csp2023.html

相关文章

  • CSP-S 2023 游记
    Day-12第一次打Div.1!!!然后:(乐)Day-2背板!有好多没背的。/ll平衡树应该可以被别的代替吧。/dxhttps://www.luogu.com.cn/contest/140258Day-1开坑,补之前发生的东西。......
  • CSP 2023 游记
    Day-2上午模拟赛没好好打,本来T2想到拉插了没写,于是一上午荒废了。中午睡觉时候把《平凡的世界》第一部看完了。中午起床以后就开始想吐,可能是午饭宫保鸡丁里花生米搞的鬼。当时5k就发了烧了,他过了一会就去休息了,只好把HE-CSP2023贺图的事接过来,于是一下午荒废了。晚上......
  • 「比赛游记」CSP 2023 游记
    「比赛游记」CSP2023游记初赛简记.补一下成绩:J:92,S:81.5.10.17(day-3)模拟赛.全真模拟CCF数据上大分!!!不过我那个错解常数巨小,比较抽象.三道哈希还特别卡正确率,是想让我们场切星战吗?宣传:河北CSP贺图制作活动!!!好困哦.要练练DS了.就剩两场模拟赛了诶,会有板子日......
  • CSP 2023游记
    决定还是自己写自己的。报名没啥好说的,照片因为尺寸问题被豪哥D了一次,重传了。然后豪哥发了几套模拟题,写得一般般吧。越来越菜了。lsydp大师。开学每天都在开一些很迷惑的会。然后中考投档分数全班倒一。为什么每个人下课都还在教室里不知道写什么东西啊。然后周围......
  • CSP 2022 游记
    updon23/10/18一年了。CSP还剩3days感慨。初赛啥也没干。就随便刷刷洛谷有题。考完普及感觉很稳。考完提高感觉蒙蒙的。听说有很多人过tg不过pj?所以就感觉tg能过(updon2023.9:。。。然后tg只有48。pj81.5。光速打脸。去不了S了。/ng复赛开T1:不就是快速幂吗,水水就......
  • CSP-J/S 2023 游记
    2023-10-16TBXCRound7-J打了场模拟赛,以为自己AK了,结果赛中发现自己是消愁,调完代码后又以为自己AK了,赛后再次发现自己是消愁。半年没写bfs,只会SPFA了/cf总结:数组空间不要开小!......
  • CSP 2023 游记
    笔者今年(2023年)高一,坐标SC。2023.9.16初赛,然而运势是大凶。真的就我是大凶两点过到了教科院附中门口,没看到教练,同校OIer也都已经进去了。进校之后遇到了这正找考场的sh。14:30开始考试,考生(包括本人)有且仅有4个人。。。发现有一道选择题就是P2765,甚至是样例,所以直接......
  • csp2023 第一轮游记
    csp2023第一轮游记Day-20AFO.Day0考试是周六,所以还是正常在学校上课,除了有点担心,还是有点担心(主要是没复习)。考前打了一个代码:#include<bits/stdc++.h>usingnamespacestd;intrp;intmain(){ for(inti=1;;i++) { rp++; printf("%d\n",rp); } re......
  • CSP2023 游记
    \(\mathrm{Day\-?}\)模拟赛场场降智破防垫底,但是都是大于*1900的史诗级难题,到时候考试的时候肯定不会这么难的呀!\(\mathrm{Day\1}\)拿到题,解压密码是yuanshenqidong。发现T1是给你两个整数,问他们的乘积。我想了想说这个题不难啊,相当于就是说\(n\timesm\)的网格里......
  • CSP2023 赛前集训总结
    2023.09.18T1刘谋题面描述现在,反抗军首领大司马交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及骚猪帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通块的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一......