CSP-S 模拟测试 51 题解

2023-05-16

考试过程:

惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打。

看T2 字符串题,完了我字符串最弱了,肯定只能打暴力了,带着前两题都不会的心情,看了T3发现是期望,完了爆0了,在一看,发现是sb原题,还简单一点,赶紧把T3码了一遍过大样例,觉得很稳就交了,然后用一点时间把T1树的分给码了,然后开始磨T2,发现啥都不会开始dfs,一开始觉得只能拿30pts,后来发现没有回溯是$O(n^2)$的,打完就没剩多少时间了,然后考虑T3要不要开long long,觉得没必要就没开石乐智。然后想T1无果。

出分发现T3WA 80,然后把开了long long的代码交上去A了,我怕不是个傻子,不卡时间为什么不开long long啊QAQ。T2A了,T140,后来听说用树的方法跑所有测试点能拿60,艹。少两句话少拿40.jpg。

扯多了2333

题解:

T1 attack:

据说是什么支配树裸题,蒟蒻不会,只能照着题解打。

必经关系是一棵树,这好像就是支配树?那么1到k的必经点就是k在这棵树上的祖先,所以我们在有向图中跑个拓扑排序,就可以建出这棵树,但实际上我们并不需要真正建出这棵树,只需要维护求lca所用的fa数组和dep数组即可。另外,因为题目中说所有点都从1开始,所以一开始只要把1入队就吼了。

再说一下我的sb手残错误

求lca:

我是大设备


 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+10;
 4 const int INF=1e9+7;
 5 int first[N],nex[N<<1],to[N<<1],tot;
 6 void add(int a,int b){
 7     to[++tot]=b,nex[tot]=first[a],first[a]=tot;
 8 }
 9 vector<int> in[N];
10 int d[N],du[N],fa[N][18],v[N],w[N];
11 int Lca(int x,int y){
12     if(d[x]>d[y]) swap(x,y);
13     for(int i=16;i>=0;--i) if(d[fa[y][i]]>=d[x]) y=fa[y][i];
14     if(x==y) return x;
15     for(int i=16;i>=0;--i) if(fa[y][i]!=fa[x][i]) y=fa[y][i],x=fa[x][i];
16     return fa[x][0];
17 }
18 
19 int main(){
20     int n,m,que;
21     scanf("%d%d%d",&n,&m,&que);
22     for(int i=1;i<=m;++i){
23         int x,y;
24         scanf("%d%d",&x,&y);
25         add(x,y);
26         add(y,x);
27         in[y].push_back(x);
28         du[y]++;
29     }
30     queue<int> q;
31     q.push(1);
32 //    d[1]=0;
33     /*for(int i=1;i<=n;++i){
34         if(!du[i]){
35             int lca=in[i][0];
36             for(int j=1;j<in[i].size();++j) lca=Lca(lca,in[i][j]);
37             fa[i][0]=lca;
38             d[i]=d[lca]+1;
39             for(int j=1;j<=16;++j) fa[i][j]=fa[fa[i][j-1]][j-1];
40             q.push(i);
41             v[i]=1;
42         }
43     }*/
44     // for(int i=1;i<=n;++i) if(!du[i]) q.push(i)/*,du[i]=INF*/;
45     while(q.size()){
46         int x=q.front();q.pop();//cout<<x<<endl;
47         for(int i=first[x];i;i=nex[i]){
48             int y=to[i];
49             du[y]--;
50             if(!du[y]){
51                 int lca=in[y][0];
52                 for(int j=1;j<in[y].size();++j) lca=Lca(lca,in[y][j]);
53                 fa[y][0]=lca;
54                 d[y]=d[lca]+1;
55                 q.push(y);
56 //                du[i]=INF;
57                 for(int j=1;j<=16;++j) fa[y][j]=fa[fa[y][j-1]][j-1];
58             }
59         }
60     }
61 //    for(int i=1;i<=n;++i,cout<<endl) for(int j=1;j=16;++j) cout<<fa[i][j]<<" ";
62     for(int i=1;i<=que;++i){
63         int k;
64         scanf("%d",&k);
65         for(int j=1;j<=k;++j) scanf("%d",&w[j]);
66         int lca=w[1];
67         for(int j=1;j<=k;++j) lca=Lca(lca,w[j]);
68         printf("%d\n",d[lca]+1);
69     }
70 }
71 /*
72 4 3 2
73 1 2
74 2 3
75 2 4
76 2 3 4
77 2 2 4
78 */  
attack

T2 reverse:

只需要考虑最后一位是什么就好了,然后谁长就缩谁,直到他们两个一样长,就一起缩,博主打的是dfs,细节很多,很难调,所以代码就不提供了,所以就以soul神的代码为参考吧。

鸣谢soul


 1 #include<bits/stdc++.h>
 2 #define re register
 3 using namespace std;
 4 int T,a[2010],b[2010]; char s[2010]; int len;
 5 inline bool cmp(){
 6     if(a[0]!=b[0]) return 0;
 7     for(re int i=1;i<=a[0];++i) 
 8         if(a[i]!=b[i]) return 0;
 9     return 1;
10 }
11 signed main(){
12     scanf("%d",&T);
13     while(T--){
14         scanf("%s",s+1);len=strlen(s+1); a[0]=0;
15         for(re int i=1;i<=len;++i) a[++a[0]]=(s[i]-65);
16         scanf("%s",s+1);len=strlen(s+1); b[0]=0;
17         for(re int i=1;i<=len;++i) b[++b[0]]=(s[i]-65);
18         while(a[0]&&b[0]&&!cmp()){
19             if(a[0]>b[0])
20                 while(a[0]>b[0]){
21                     if(a[a[0]--])
22                     for(re int i=1,lim=(a[0]>>1);i<=lim;++i) swap(a[i],a[a[0]-i+1]);
23                 }
24             else if(a[0]<b[0])
25                 while(b[0]>a[0]){
26                     if(b[b[0]--])
27                     for(re int i=1,lim=(b[0]>>1);i<=lim;++i) swap(b[i],b[b[0]-i+1]);
28                 }
29             else if(a[0]==b[0]){
30                 if(a[a[0]--])
31                 for(re int i=1,lim=(a[0]>>1);i<=lim;++i) swap(a[i],a[a[0]-i+1]);
32                 if(b[b[0]--])
33                 for(re int i=1,lim=(b[0]>>1);i<=lim;++i) swap(b[i],b[b[0]-i+1]);
34             }
35         }
36         if(a[0]){for(re int i=1;i<=a[0];++i) putchar(a[i]+65); puts("");}
37         else puts("-1");
38     }
39     return 0;
40 }  
reverse

T3 tree:

原题,不,比原题简单,然后赛时第一个提交,成功long long见祖宗,喜提WA80。

题解是什么方法我也不知道,所以就用自己的方法说了还不是颓的以前的题解

我们设$f[x]$表示从$x$到$fa[x]$的期望步数,$g[x]$表示从$fa[x]$到$x$的期望步数。

考虑转移$f[x]=\frac{1}{du[x]}+\sum{\frac{f[son]+1+f[x]}{du[x]}}$

挺显然的,就是他可以直接上去,也可能先下去在上去。

化简得$f[x]=du[x]+\sum{f[son]}$,一遍dfs可以求出

在来考虑g的转移$g[x]=\frac{1}{du[fa]}+\frac{1+g[x]+g[fa]}{du[fa]}+\frac{\sum{g[x]+1+f[brothers]}}{du[fa]}$

其实和f的转移也差不多就是分类讨论,可以直接下去,可以到x的兄弟节点也可以到x的父节点的父节点。

化简得$g[x]=du[fa]+g[fa]+\sum{f[bother]}$

然后树上前缀和就可以求出从根到x的期望步数了。

吐槽:

考试时知道答案一定是整数就没开double,然后,关于int,他死了最后都想到开long long了为什么不交啊,我的首杀。

 


 1 //yuanti
 2 //xingkuizuoguo
 3 #include<bits/stdc++.h>
 4 using namespace std;
 5 const int N=1e5+10;
 6 #define int long long
 7 int first[N],nex[N<<1],to[N<<1],tot;
 8 void add(int a,int b){
 9     to[++tot]=b,nex[tot]=first[a],first[a]=tot;
10 }
11 int f[N],g[N];//f[x] x->fa[x] g[x] fa[x]->x
12 int sumg[N],sumf[N];
13 int du[N];
14 void dfs(int x,int fa){
15     f[x]=du[x];
16     for(int i=first[x];i;i=nex[i]){
17         int y=to[i];
18         if(y==fa) continue;
19         dfs(y,x);
20         f[x]+=f[y];
21     }
22     sumf[x]=f[x];
23 }
24 void dfs1(int x,int fa){
25     for(int i=first[x];i;i=nex[i]){
26         int y=to[i];
27         if(y==fa) continue;
28         g[y]=sumf[x]-f[y]+g[x];
29         dfs1(y,x);
30     }
31 }
32 void dfs2(int x,int fa){//cout<<fa<<" "<<g[fa]<<" "<<sumg[fa]<<endl;
33     sumg[x]=sumg[fa]+g[x];
34     for(int i=first[x];i;i=nex[i]){
35         int y=to[i];
36         if(y==fa) continue;
37         dfs2(y,x);
38     }
39 }
40 
41 signed main(){
42     int n;
43     scanf("%lld",&n);
44     for(int i=1;i<n;++i){
45         int x,y;
46         scanf("%lld%lld",&x,&y);
47         add(x,y);
48         add(y,x);
49         du[x]++;du[y]++;
50     }
51     dfs(1,0);
52     f[1]=0;
53     dfs1(1,0);
54     sumg[1]=g[1];
55     dfs2(1,0);
56 //    for(int i=1;i<=n;++i) cout<<"f["<<i<<"]=="<<f[i]<<" ";
57 //    cout<<endl;
58 //    for(int i=1;i<=n;++i) cout<<"g["<<i<<"]=="<<g[i]<<" ";
59 //    cout<<endl;
60     for(int i=1;i<=n;++i){
61         printf("%lld.000\n",sumg[i]+1);
62     }
63 }
64 /*
65  3
66  1 2
67  2 3
68 */  
tree

 

转载于:https://www.cnblogs.com/leom10/p/11585961.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSP-S 模拟测试 51 题解 的相关文章

  • P7914 [CSP-S 2021] 括号序列 题解

    其实T2想清楚就不是很难 xff0c 虽然想清楚也不简单 我这里分享一种很自然的想法 xff0c 当然是区间dp啦 区间dp分6种状态 的种类数 xff0c 这种情况相当与题目中的 S S S xff0c 2到5中都一样 的种类数 xff0
  • week16——实验(csp_m4)

    目录 TT数鸭子 xff1a 问题描述题目简述输入 输出格式样例 问题分析解题思路参考代码 心得体会 ZJM要抵御宇宙射线 xff1a 问题描述题目简述输入 输出格式样例 问题分析解题思路参考代码 心得体会 宇宙狗的危机 xff1a 问题描
  • 【CCF-CSP】201409-4 最优配餐 C++

    文章目录 一 题目二 解题1 题目2 代码3 提交结果 总结1 代码思路 一 题目 原题目链接 二 解题 1 题目 一个BFS xff08 宽度优先搜索 xff09 的实现 xff0c 用于处理迷宫中的节点 下面是代码的详细解释 xff1a
  • CCF-CSP考试介绍以及复习技巧指导

    CCF CSP考试时间及费用 时间一般是每年3 9 12月的中旬 xff0c 报名时间一般也是提前一个月 xff0c 不固定 非计算机协会会员300元 次 xff0c 会员180元 次 xff08 学生会员需缴纳50元 年的会费 xff09
  • 【ZJM要抵御宇宙射线】CSP模测T2

    题目 题目大意 本题给出平面二维坐标上的若干个点 xff0c 要求选取一个点做圆心 xff0c 此时可以以最短半径包含所有点 xff0c 求出圆心坐标和最短半径平方 xff0c 结果保留两位小数 解题思路 本题乍看只下可能觉得会很复杂 xf
  • 【Week 16】CSP-M4

    TT数鸭子 题目描述 输入输出描述 样例 思路 对每个数字按数位进行遍历 xff0c 求取不重复数字个数即可 代码 span class token macro property span class token directive key
  • CCF CSP 2019-12-1 “报数” 解题思路及满分代码(C++11)

    文章目录 题目描述解题思路满分代码 题目描述 解题思路 题目比较简单 xff0c 需要搞清楚两个点 xff1a 跳过的数是7的倍数或含7的数 xff0c 即取余为0或各个位上有7的数n代表的是总共的报数个数 xff0c 跳过的数是不算的 下
  • 针对CSP-T1,T2的练习

    文章目录 题目1问题描述样例输入样例输出 解题思路代码 题目2问题描述样例输入样例输出 解题思路代码 题目1 问题描述 给出n个数 xff0c zjm想找出出现至少 n 43 1 2次的数 xff0c 现在需要你帮忙找出这个数是多少 xff
  • CCF CSP 201512-3 画图

    字符串基础题 问题描述 用 ASCII 字符来画图是一件有趣的事情 xff0c 并形成了一门被称为 ASCII Art 的艺术 例如 xff0c 下图是用 ASCII 字符画出来的 CSPRO 字样 lt 本题要求编程实现一个用 ASCII
  • TT数鸭子-暴力(csp-t1模拟)

    题目 输入输出样例 xff1a 题解 xff1a 我们整个题就是使用暴力的方法进行运算 将每一只鸭子看作是十进制的数 xff0c 不断对每一位读取 xff08 采用对十整除和取余数的方法 xff09 我们对每一个鸭子都进行判断 如果满足这个
  • CSP-S 模拟53

    中下游水准 xff0c 暴力分没拿全 xff0c T1水了 T1 u 两个差分数组水掉 xff08 竖着一个 xff0c 斜着一个 xff09 T2 v 状压 43 记忆化搜索 xff0c 对于sta 61 1 lt lt 30 用hash
  • CSP-S 模拟52

    rank10 T1 平均数 二分答案 xff0c 让所有的数减去这个答案 xff0c 求前缀和 xff0c 然后验证子序列平均数比这个答案小的的个数是否等于K 只需要找前缀和的逆序对个数即可 xff08 归并排序 xff09 T2 涂色游戏
  • CSP-S 模拟53 题解

    题解 xff1a T1 u xff1a 一看到修改这么多 xff0c 但询问其实只有一个不难想到差分 xff0c 但是他这个形状可以说很不规则 xff0c 于是我们想到分别维护竖着的和斜着的差分 xff0c 然后最后合并即可 考场上瞎调了一
  • CSP认证历年真题题解 (Python)

    文章目录 此篇文章是小菜本菜使用Python做CCF CSP的一些记录 希望能够以此帮助到正在为题目苦苦思考 但还没有找到解决思路的朋友们 诚然 这里的代码还有很多值得改进之处 希望各位码友不吝赐教 目前已完成历年的第一题 第二题 第三题正
  • CSP 202305-1 重复局面

    题目背景 国际象棋在对局时 同一局面连续或间断出现3次或3次以上 可由任意一方提出和棋 问题描述 国际象棋每一个局面可以用大小为 8 8 的字符数组来表示 其中每一位对应棋盘上的一个格子 六种棋子王 后 车 象 马 兵分别用字母 k q r
  • 数据结构--二叉树

    前言 关于二叉树知识的考察主要分两部分 第一部分在初赛中体现 一般考察二叉树的节点个数 树高和遍历问题 1 二叉树定义 在计算机科学中 二叉树是每个结点最多有两个子树的树结构 通常子树被称作 左子树 left subtree 和 右子树 r
  • CCF-CSP真题《202303-1 田地丈量》思路+python,c++,java满分题解

    想查看其他题的真题及题解的同学可以前往查看 CCF CSP真题附题解大全 试题编号 202303 1 试题名称 田地丈量 时间限制 1 0s 内存限制 512 0MB 问题描述 问题描述 西西艾弗岛上散落着 n 块田地 每块田地可视为平面直
  • C++语言基础--递归函数

    对于很多编程初学者来说 递归算法是学习语言的最大障碍之一 可能也有一大部分人知道递归 也能看的懂递归 但在实际做题过程中 却不知道怎么使用 递归的定义 1 很官方的说法 递归 在数学与计算机科学中 是指在函数的定义中使用函数自身的方法 也就
  • 出现次数最多的数CSP201312-1(简单c语言解法)

    问题描述 给定n个正整数 找出它们中出现次数最多的数 如果这样的数有多个 请输出其中最小的一个 输入格式 输入的第一行只有一个正整数n 1 n 1000 表示数字的个数 输入的第二行有n个整数s1 s2 sn 1 si 10000 1 i
  • CCF/CSP 201604-2 俄罗斯方块(满分题解Java版)

    此题 猛滴一看确实非常容易让人懵懵的 主要是题目描述的非常不清晰 很难让人能够透彻的理解 如果连题目都看不懂 那就不谈写出代码了 题目描述 官方题目描述 题目地址 题目解读 关键的是要理解题目 Java题解 import java util

随机推荐

  • R语言-画柱形图

    barplot 函数 1 柱形图 gt sales lt read csv 34 citysales csv 34 header 61 TRUE 读取数据 gt barplot sales ProductA names arg 61 sal
  • 靶机大全

    本指南主要通过介绍一些常用渗透环境 给pentester们以自己修炼的机会 并配合一些常规的pentest tools达到学习目的 名称 WebGoat 项目地址 http www owasp org index php OWASP Web
  • Cannot create property 'default' on boolean 'true'"

    解决办法 xff1a 删除node modules包 xff0c 重新npm i 转载于 https www cnblogs com 92xcd p 10443538 html
  • 怎么增加照片的KB大小

    之前都是要想办法压缩图片的大小 今天有人发来一张1 8MB的图片让我帮忙调到30MB左右 一下子放大这么多着实有点茫然 之后想到了一个办法 首先把图片占用体积变大 xff0c 是不会增加清晰度的 xff0c 而减小占用体积却会降低清晰度 第
  • 参数 返回值

    1 函数 函数是对功能的封装 语法 def 函数名 形参列表 函数体 代码块 return 调用 函数名 实参列表 2 返回值 return 在函数执行的时候 如果遇到return 直接返回 1 如果函数什么都不写 不写return 没有返
  • 抽象类调用自己的抽象方法,实现来自实现类(很常用)

    直接上代码 public abstract class Parent public abstract void dosomething public void say dosomething System out println 34 ww
  • 学习笔记:51单片机(STC89C52)如何定时10ms

    1 定时器如何定时 首先大致描述一下定时器的定时原理 xff0c 其实本质就一句话 xff1a 每经过一个机器周期 xff0c 寄存器就加1 这里就又要解释什么是时钟周期 xff0c 什么是机械周期 我们的51单片机无论是开发板还是最小系统
  • cmake 的使用

    官网教程 xff1a https cmake org cmake tutorial 第一个简单的例子 源文件 xff1a tutorial cpp 1 A simple program that computes the square ro
  • python 读取一个文件夹下的所jpg文件保存到txt中

    最近需要使用统计一个目录下的所有文件 xff0c 使用python比较方便 xff0c 就整理了一下代码 1 import os 2 3 def gci filepath 4 files 61 os listdir filepath 5 f
  • cmake 单个目录多个文件的情况

    参考 xff1a https www hahack com codes cmake 源文件一共有三个 xff1a main cpp MathFunctions h MathFunctions cpp 文件内容分别如下 xff1a main
  • k8s config配置文件

    接着上面的博客继续写 pwd gt etc kubernetes cat config kubernetes system config The following values are used to configure various
  • html5手机web页面底部菜单

    一 效果图 二 HTML代码 lt header class 61 34 text center 34 gt TOP lt header gt lt div id 61 34 content 34 gt lt div gt lt div i
  • redis hset hmset过期时间

    hmset m k v 127 0 0 1 6379 gt hset m k v integer 1 127 0 0 1 6379 gt hget m k 34 v 34 127 0 0 1 6379 gt expire m 30 inte
  • Mac下 .bash_profile 和 .zshrc 两者之间的区别

    这是我碰到的需要 source 之后才能使用环境变量的问题 xff0c 我就不细究了 xff0c 说说我的看法 bash profile 中修改环境变量只对当前窗口有效 xff0c 而且需要 source bash profile才能使用
  • h5页面使用js实现保存当前图片到手机相册

    很可惜 xff0c 这个鬼东西微信内置浏览器不适用 页面 xff1a lt doctype html gt lt html gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta co
  • HTTP认证之基本认证——Basic(一)

    导航 HTTP认证之基本认证 Basic xff08 一 xff09 HTTP认证之基本认证 Basic xff08 二 xff09 HTTP认证之摘要认证 Digest xff08 一 xff09 HTTP认证之摘要认证 Digest x
  • android给方法设置进度,Android自定义View实现多节点进度条功能的方法

    Android自定义View实现多节点进度条功能的方法 发布时间 xff1a 2020 07 28 16 05 13 来源 xff1a 亿速云 阅读 xff1a 122 作者 xff1a 小猪 这篇文章主要讲解了Android自定义View
  • Linux 系统中如何查看日志 (常用命令)

    cat tail f 日志文件 日 志 文 件说 明 var log message系统启动后的信息和错误日志 xff0c 是Red Hat Linux中最常用的日志之一 var log secure与安全相关的日志信息 var log m
  • 智能指针(shared_ptr,unique_ptr)作为函数参数或者返回值时的一些注意事项

    智能指针 shared ptr unique ptr 作为函数参数或者返回值时的一些注意事项 当智能指针作为函数的参数或者返回值时 xff0c 一直在纠结到底是用智能指针对象本身还是用原始指针 Herb Sutter大师的文章很好的解决了这
  • CSP-S 模拟测试 51 题解

    考试过程 xff1a 惯例先看一遍三道题 xff0c T1 一开始反应要求割点 xff0c 但是这是有向图 xff0c 肯定不能求割点 xff0c 康了一下数据范围 xff0c 有40 是树的 xff0c 还不错 xff0c 决定待会在打