【清华集训2017模拟】ces

【LOJ2322】「清华集训 2017」Hello world! 【题目链接】 点击打开链接 【思路要点】 一个 101310^{13}1013 以内的数开根 666 次后一定会变成 111 ,因此有效的修改次数不会超过 6N6N6N 。 设定一个阈值 α\alphaα ,若 k≥αk≥\alphak≥α ,则暴力进行询问或修改,借助长链剖分求 kkk 级祖先,单次操作时间复杂度为 O(Nα)O(\frac{N}{\alpha})O(αN​) 。 考... 阅读详情

Description:

这里写图片描述
1<=n<=1e5,1<=q<=m<=2e5

题解:

首先把用tajan把桥边全部找出来,桥边会把图分成若干个双联通分量。
把每个双联通分量并成一个点,桥边作为边,这会构成一棵树。

显然,对于每个询问加k条边最多能去掉多少条桥边,就是用k条简单路径去覆盖这棵树,最多能覆盖多少条边。

有一个很优的贪心,把k按1-q做,每次找到树的直径,答案加上直径的长度,把直径压成一个点,继续做k+1的。

但是这个贪心显然有反例:
这里写图片描述
如上图:
按贪心,第一次我们会选择C->D,第二次选择A->B,第三次选择E->F。
但是,明显第一次选择A->E->F->D,第二次选择B->E->F->C,会使得k=2时答案最优。

于是集训队大爷出题人的“标程”是伪的。

大爷大概给了个dfs序的伪做法,建棵线段树,区间[l..r]表示dfs序为[l..r]的点所构成的子树的直径,根据直径的一个性质,两颗子树合并后的新的树直径的两个端点一定是原来两颗子树的四个直径端点的两个,所以用O(log n)求lca,这是O(n log n log n)的.

对于每次把直径压成一个点,其实不用这么想,想象把u->fa[u]这条边删掉.就相当于把u的子树的深度减1,显然它的子树的直径不会变,打个lazy_tag就好了。

讲了这么多,都是伪的。

来讲讲镇中大佬的做法:
假设我第一次选了直径C->D,第二次选了A->B,实际上这是可以合并的,就可以交叉合并成A->E->F->D,B->E->F->C。
所以我可以在第一次搞出直径的基础上,再选两条从直径出发的最长的互不相交的长链,每次都是如此。
所以以直径的端点为根,进行长链剖分,再将链按长度排序,依次选长的就好了。
长链剖分,和树链剖分类似,树链剖分重儿子的关键字是子树大小,改为子树的最深度即可。

代码较繁琐。

Code:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
#define fo(i, x, y) for(int i = x; i <= y; i ++)
using namespace std;

const int N = 100005;

int n, m, q, x, y, sumq, ans;
int final[N], tot;
struct edge {
    int st, to, next;
}e[N * 4], c[N * 4];
int dfn[N], low[N], bz[N * 4], bd[N * 4], tt;
int f[N];
int fi[N], tp;

void link(int x, int y) {
    e[++ tot].next = final[x]; e[tot].st = x; e[tot].to = y, final[x] = tot;
    e[++ tot].next = final[y]; e[tot].st = y; e[tot].to = x, final[y] = tot;
}

void Init() {
    scanf("%d %d %d", &n, &m, &q);
    tot = 1;
    fo(i, 1, m) {
        scanf("%d %d", &x, &y);
        link(x, y);
    }
}

void dg(int x, int last) {
    bd[x] = 1; dfn[x] = ++ tt; low[x] = 1e9;
    for(int i = final[x]; i; i = e[i].next) {
        int y = e[i].to; if(i == (last ^ 1)) continue;
        if(bd[y]) {
            low[x] = min(low[x], dfn[y]);
        } else {
            dg(y, i);
            low[x] = min(low[x], low[y]);
            if(low[y] > dfn[x])
                bz[i] = bz[i ^ 1] = 1, sumq ++;
        }

    }
}

int find(int x) {
    return f[x] == x ? x : (f[x] = find(f[x]));
}

void bin(int x, int y) {
    if(find(x) != find(y)) f[f[x]] = f[y];
}

void tlink(int x, int y) {
    c[++ tp].next = fi[x], c[tp].st = x, c[tp].to = y, fi[x] = tp;
    c[++ tp].next = fi[y], c[tp].st = y, c[tp].to = x, fi[y] = tp;
}

void Build() {
    fo(i, 1, n) f[i] = i;
    fo(i, 1, n) for(int j = final[i]; j; j = e[j].next) if(!bz[j]) {
        bin(i, e[j].to);
    }
    tp = 1;
    fo(i, 2, tot) if((i & 1) && bz[i]){
        tlink(find(e[i].st), find(e[i].to));
    }
}

int d[N], dis[N], last[N], bx[N], tbx;

int Bfs(int x) {
    ++ tbx;
    d[1] = x; dis[x] = 0; d[0] = 1; bx[x] = tbx;
    for(int st = 1; st <= d[0]; st ++) {
        int x = d[st];
        for(int i = fi[x]; i; i = c[i].next)
            if(bx[c[i].to] != tbx) {
                bx[c[i].to] = tbx;
                dis[c[i].to] = dis[x] + 1;
                d[++ d[0]] = c[i].to;
                last[d[0]] = st;
            }
    }
    return d[d[0]];
}

int by[N], dep[N], sd[N], son[N], top[N];

void dg1(int x) {
//  printf("%d %d\n", x, dep[x]);
    by[x] = 1; sd[x] = dep[x];
    for(int i = fi[x]; i; i = c[i].next) {
        int y = c[i].to; if(by[y]) continue;
        dep[y] = dep[x] + 1;
        dg1(y);
        if(sd[y] > sd[son[x]]) son[x] = y;
        sd[x] = max(sd[x], sd[y]);
    }
    by[x] = 0;
}

void dg2(int x) {
    by[x] = 1;
    if(son[x] != 0) top[son[x]] = top[x], dg2(son[x]);
    for(int i = fi[x]; i; i = c[i].next) {
        int y = c[i].to; if(by[y] || y == son[x]) continue;
        top[y] = y; dg2(y);
    }
}

bool rank(int x, int y) {
    return x > y;
}

int main() {
    freopen("ces.in", "r", stdin);
    freopen("ces.out", "w", stdout);
    Init();
    dg(1, 0);
    Build();
    int xx = Bfs(find(1));
    dep[xx] = 1; dg1(xx);
    top[xx] = xx; dg2(xx);
    d[0] = 0;
    fo(i, 1, n) if(i == find(i) && son[i] == 0)
        d[++ d[0]] = dep[i] - dep[top[i]];
    sort(d + 1, d + d[0] + 1, rank);
    int ans = d[1]; printf("%d\n", ans);
    fo(i, 2, q) {
        if((i - 1) * 2 <= d[0]) ans += d[(i - 1) * 2] + 1;
        if(i * 2 - 1 <= d[0]) ans += d[i * 2 - 1] + 1;
        printf("%d\n", ans);
    }
}
【NAS for PVE _04】安装TrueNAS 前篇说到如何调试 Proxmox VE 8.2 为安装虚拟机做准备,本篇主要讲述如何在 Proxmox VE 上安装 TrueNAS 系统,并开启NFS供其他系统挂载使用官网下载好TrueNAS系统镜像。 阅读详情

相关推荐

COMSOL电磁仿真案例——感应线圈

COMSOL电磁建模仿真案例——感应线圈

冲击10w 6万+

uoj#276. 【清华集训2016】汽水(分数规划+点分治)

传送门 没想到点分治那一层…… 首先不难发现这是个分数规划,先把所有的边长减去\(k\),二分答案,设为\(mid\),就是要求路径平均值\(ans\in[-mid,mid]\) 先来考虑\(ans\in[0,mid]\)的的情况。我们考虑点分治,记下所有从根节点延伸下去的链,长度记为\(len\),边数为\(dep\),属于那一颗子树为\(bl\),先添加一条链\((0,0,0)\),那么两条链...

weixin_34077371的博客 203

Linux安装部署PostgreSQL详细步骤

Linux安装部署PostgreSQL详细步骤

2301_77356579的博客 9322

P4224 [清华集训2017]简单数据结构 题解

(本文是基于队爷 @s_r_f 所写题解的完善和补充) 可以发现,如果我们暴力地枚举一个数的因数或倍数,时间复杂度是可接受的。 对于前者,单次复杂度为 O(n)O(\sqrt n)O(n​);对于后者,由于题目保证了 C≤10C \leq 10C≤10,所以单次的均摊复杂度应为调和级数 O(ln⁡n)O(\ln n)O(lnn)。 所以,我们可以考虑直接模拟题意中的操作。 首先,我们设 fif_ifi​ 为以 iii 开头的最长上升倍数子序列的长度。同时,为了方便统计答案的第二项,我们再设一个 fcnti

Recalling_Clouds的博客 320

【Autosar】学习总结-MCAL

一、简介 MCAL:微控制器抽象层;位于BSW层中的最下层; MCAL细分,可将驱动分为:微控制器驱动、存储器驱动、通信驱动、IO驱动: 二、MCAL的配置(EB-Tresos) 1.PORT 我理解的PORT:MCAL层中的IO驱动组中的pin脚总体配置: Port就是芯片上的每个pin脚,可以配置成DIO ADC PWM ICU等单引脚的功能,也能配置成CAN的TX或者RX、SPI的MOSI等等其他功能的单个pin脚功能; 总之,PORT就是芯片上的具体的某个引脚。 配置

zDavid_2018的博客 3万+

zabbix 监控EMC存储

经过搜索,找到了脚本地址,该项目应该是模板原作者创建的,该项目也有zabbix模板,和上面的应该是相同的,我用的是上面的模板。./unity_get_state.py --api_ip='X.X.X.X' --api_port='443' --api_user='zabbix' --api_password='PASSWORD' --storage_name="zabbix web前端配置的主机名" --discovery。修改权限,给zabbix用户执行权限,模板调用时以zabbix用户执行。

wangyfde的专栏 3758

【LOJ2326】「清华集训 2017」简单数据结构

【题目链接】 点击打开链接 【思路要点】 注意到答案是 O(LogM)O(LogM)O(LogM) 级别的。 对于每一个点 iii 我们暴力维护其 dpdpdp 值 dpidp_idpi​ 以及能够转移到 iii 的各个位置的中 dpdpdp 值为 jjj 的位置数 cnti,jcnt_{i,j}cnti,j​ 。 令 f(x)f(x)f(x) 表示 xxx 的因子个数。 对于操作 0...

cz_xuyixuan的博客 774

SkyWalking跨线程Trace传递实战:手把手教你用RunnableWrapper解决异步链路中断问题

本文深入解析了SkyWalking在异步编程场景下链路追踪中断的根源,并提供了使用RunnableWrapper等官方包装类的实战解决方案。通过详细的原理解析和代码示例,手把手指导开发者如何实现跨线程的Trace传递,确保分布式系统监控链路的完整性,有效解决异步任务导致的链路中断问题。

sand8的博客 495

清华集训2017题解

ioi赛制好评QAQ 好像啥都记不得了就不写游记了 Day 1 1.1 生成树计数(tree.cpp) 1.1.1. 题意 ​ 有 n≤30000n≤30000 n \le 30000 个点,第 ii i 个点有点权 aiai a_i ,设第 ii i 个点的点度为 didi d_i ,那么求求所有生成树的权值和。一个生成树的权值 w(T)w(T) w(T)...

whzzt的博客 2469

c#.net使用正则表达式验证文本中是否包含手机号码或电话号码?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Collections; namespace RegularPhoneApp { class Program

码农 3585

大疆RoboMaster嵌入式面试,电机FOC调不出来当场走人

摘要:大疆RoboMaster嵌入式工程师面试以实战能力著称,重点考察FreeRTOS任务调度、FOC电机控制和CAN总线三大核心技能。FreeRTOS部分涉及优先级调度、栈溢出排查及信号量与互斥锁的区别;FOC控制要求现场编写电流环代码,并解释Clarke/Park变换原理;CAN总线则关注仲裁机制、CANopen协议应用及错误帧排查方法。面试强调工程实践,需具备STM32开发经验,建议搭建实际环境进行练习。该岗位被誉为"硬件版修罗场",充分体现大疆对实际开发能力的严格要求。

郑伟强dev的专栏 151

【清华集训2017模拟】Sequence

Description : 1<=n<=3e4,1<=m<=1e5题解:做的第一道整体二分题。整体二分的套路: 二分一个答案,对于每个询问求出答案,再把询问分成两部分,第一个部分是答案< mid的,第二个部分是答案大于mid的,至于=mid的,这个询问不一定是mid,先把答案记一下,根据实际情况而决定分到哪个部分。这题首先得把[x, y]的限制具体化,用一棵主席树预处理[x..y]限制对应的a值

Cold_Chair的博客 767

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

985小水博的摸鱼日常 3091

清华集训2017滚粗记

Day 0很早就到了,然后就被众人教育,晚上连营AK杀被wzd、yql教育,去找wyy换衣服又被wyy和dwj教育。虚心接受教育之后就回去了。Day 1考得最崩的一天。开场看完题发现T1是个原题加强,T2只会状压的部分分,T3是个裸分块但是要写挺久的,于是决定先开T1。开了T1半个小时之后发现毫无思路,式子并不能像原题做法那么化简,就扔掉去写T3。写完T3已经过了挺久了,改了一堆bug之后终于过了第

wxh010910 3152

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

清华集训2017给修记

day -1开启懵逼之旅。 高铁上和__debug,h10,dy0607打扑克牌,每一局规则都不一样。1h后各自颓。samjia又打通了一次以撒。 来到西郊后跟着h10和__debug颓,虽然最后莫名奇妙的变成了看电影。h10掘地求升居然过灯了。 今天没给到修修。day 0早上睡得舒服,吃的舒服,报道完颓的舒服。 中午富榄请去thu吃饭,舒服。 下午回来给到修修,舒服。 晚上连赢AK杀,

不来也不去的一只失忆蝴蝶 1945

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[uoj276][清华集训2016]汽水——分数规划+点分治

题目大意: 给定一颗带边权的树,求一条路径使得这条路径上的边权的平均值最接近一个给定的值。 思路: 既然是求平均值,那么自然而然就想到了分数规划了, 即最小化∣∑i=1lenwilen−k∣|\frac{\sum_{i=1}^{{len}}w_i}{len}-k|∣len∑i=1len​wi​​−k∣。 然后二分答案xxx,考虑是否存在比xxx更优的答案:∣∑i=1lenwilen−k∣≤x|\f...

ylsoi的博客 435

UOJ276 清华集训2016 汽水

Problem UOJ Solution 把所有边权都减去 kkk ,那么就要求平均边权的绝对值最小。 由于结果要向下取整,因此我们判定的符号应该是严格小于,即 −mid&amp;amp;lt;ans&amp;amp;lt;mid-mid &amp;amp;lt; ans &amp;amp;lt; mid−mid&amp;lt;ans&amp;lt;mid 考虑点分治,把一条路径表示为 (Ai,Bi)(A_i,B_i)(Ai​,Bi​),其中 ...

Rayment的博客 536

loj #2322. 「清华集训 2017」Hello world!

题面 题意 给出一棵树,要求支持两种操作: 1.给出u,v,从u开始每次向v条k条边(如果到v的距离小于k则直接到达v),对所有经过的点的权值开根。 2.给出u,v,从u开始每次向v条k条边(如果到v的距离小于k则直接到达v),求所有经过的点的权值和。 做法 根据每次跳的长度k进行分块,令块大小为S。 然后对于1~S中的每一个数i建一个森林,每个点的父亲是这个点在原树上与它深...

yzyyylx的博客 759

UOJ343 清华集训2017 避难所 构造、打表

传送门 玄学题 考虑构造三个数\(p_1p_2,p_1p_2,p_1p_2\)满足贪心分解会分解为\(p_1^3,p_2,p_2,p_2\),那么需要满足条件 1、\(p_1 , p_2 \in Prime\) 2、\(p_1^3 < b\) 3、\(p_2^2 \geq b\) 4、\(p_1p_2 \leq p_1^3\) 此时满足\(p_2^2 \geq b\)的最小的\(p_2\)...

weixin_30257433的博客 176

【LOJ2323】「清华集训 2017」小 Y 和地铁

【题目链接】 点击打开链接 【思路要点】 很不错的脑洞题。 附上官方题解。 时间复杂度 O(T∗2N2)O(T*2^{\frac{N}{2}})O(T∗22N​) 。 【代码】 #include&lt;bits/stdc++.h&gt; using namespace std; const int MAXN = 105; const int INF = 1e9; typede...

cz_xuyixuan的博客 612

并不对劲的uoj276. [清华集训2016]汽水

想要很对劲的讲解,请点击这里 题目大意 有一棵\(n\)(\(n\leq 50000\))个节点的树,有边权 求一条路径使该路径的边权平均值最接近给出的一个数\(k\) 输出边权平均值下取整的整数部分 题解 有关路径的边权平均值可以二分来做 假设已二分出边权平均值与\(k\)的差不超过\(m\),则应存在一条简单路径,路径上的\(p\)条边满足: \[-m\leq\frac{\sum_{i=1}^...

weixin_30814223的博客 145

Tarjan的各种操作

最近比赛时做一道仙人掌的题就因为tarjan打错而WA0了,非常伤心,突然发现自己脑海中的tarjan真是一坨shit(我无意冒犯tarjan大神),所以去找了图论专题的PPT复习了一波。 dfn,low的含义在这里就不解释了。 有向图的tarjan: 有向图的tarjan只有一种用途,就是缩强联通分量。 2-SAT问题中也可以判合法性。 在有向图tarjan中,会遇到三种边: 1...

Cold_Chair的博客 1393

loj#2326. 「清华集训 2017」简单数据结构【动态规划+set】

传送门 解题思路: 感觉复杂度是证不来的……不过跑得挺快…… 注意序列长度不超过20,所以也比较暴力,就是记录每个值的位置,以每个点开头的最长长度和每个长度对应的最小结尾位置,用set维护以每个点为结尾的最长序列开头位置,用桶维护答案……向左加就枚举倍数更新,向右加就枚举约数更新…… #include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; in...

cdsszjj的博客 971

【清华集训2017】【LOJ2326】【洛谷P4224】简单数据结构(线筛处理因数表)(DP)(set维护)

LOJ传送门 洛谷传送门 解析: 其实题目中说了这么多,有一句话 同一个数字最多只会被插入C次。C=10 也就是说,我们可以将这个序列近似看作随机。 那么直接考虑乱搞。我们发现还有一个条件: 保证在任意时刻序列A非空,其中的元素互不相等 直接告诉我们可以为每个数记录出现位置,并且答案大小直接降低到了logloglog级别。 记dp[i]dp[i]dp[i]表示以iii开头的数列最长长度,...

zxyoi_dreamer的博客(不定期诈尸) 354

[2017集训队作业自选题#154]简单数据结构题

题目大意一颗点权树,初始点权均为0。 每次操作将所有距离x为1的点点权+1,然后希望你求出距离x为1的点点权异或和。一个转化把修改分成儿子修改和单点修改,把询问分成儿子询问和单点询问。 每次相当于x的儿子修改+x的父亲单点修改,询问类似。根号算法发现一个点儿子的点权种类数最多根号种。 不妨用链表(动态桶)维护每种点权出现次数。正解注意到x^(x+1)=2*lowbit(~x)-1。 我们不妨

不来也不去的一只失忆蝴蝶 1269

【gdsoi2018 day3】谁是冠军

题目大意:不说。题解:如果x能胜y,则x往y连一条边。如果一个点能够遍历所有的点,显然它就是可以的。用tarjan缩一下强联通分量,入度为0的那个分量就是答案。这样就有60分。用主席树优化一下连边。大概是线段树区间会下放到log个完整区间,直接往那些区间连边。那些区间往包含的点连边。注意插入有时效性,所以要用主席树的那种思想,新开点。#include<cstdio> #include<algorit

Cold_Chair的博客 516
上一篇: 二维最小乘积生成树
下一篇: 【清华集训2017模拟】Sequence
Cold_Chair
博客等级 码龄11年 158粉丝 410原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值