首页 > 其他分享 >20240808题解

20240808题解

时间:2024-08-08 16:09:35浏览次数:8  
标签:int 题解 top times double 20240808 节点

话说T2写了个动态树结果考场调不出来,这下大炮打蚊子了。

森林 (forest)

题面:
符合条件的森林中深度相同的点度数相同,\(1\le i\le n\),求点数为\(i\)的符合条件的森林的种类数。
题解:
将森林中每一个根节点连到同一个节点上变成一棵树。令\(f(i)\)表示符合条件的树的种类数,那么\(f(i+1)\)为\(i\)的答案。
因为一个\(i\)个节点的树去掉根节点后一定能分成多个相同的子树,若子树大小为\(j\),那么\(j\mid(i-1)\)。

\[f(i)=\sum_{j\mid(i-1)}f(j) \]

这种题绝对可以去OEIS上找吧
时间复杂度\(\text O(n\log n)\)
代码:

#include<cstdio>
#define int long long
const int N=1000005,mod=998244353;
int f[N],n,c[20];
void write(int x){
    int top=0;
    for(;x;x/=10)c[++top]=x%10;
    for(;top;top--)putchar(c[top]+'0');
    putchar(' ');
}
inline void Add(int&x,int y){(x+=y)>=mod&&(x-=mod);}
signed main(){
    freopen("forest.in","r",stdin),freopen("forest.out","w",stdout),scanf("%lld",&n),f[1]=1;
    for(int i=1;i<=n;i++)for(int j=i+1;j<=n+1;j+=i)Add(f[j],f[i]);
    for(int i=2;i<=n+1;i++)write(f[i]);
    return fflush(stdout),fclose(stdin),fclose(stdout),0;
}

树上路径 (path)

题面:有一个\(n\)个点的外向树,依次加入\(n-1\)条边,图的中间形态为一个外向树形成的森林,每次查询一个点\(c\),保证\(c\)是一个外向树的梗,求\(c\)的最深的子节点的深度。
题解:带权并查集直接维护即可。
不知道自己怎么会想到写LCT。
时间复杂度\(\text O(n\log n)\)
代码:

#include<cstdio>
const int N=1000005;
int T,n,fa[N],dep[N],res[N];
struct Edge{
    int to,next;
}edge[N];
inline void Max(int&x,int y){x<y&&(x=y);}
inline int find(int x){
    if(x==fa[x])return x;
    int t=find(fa[x]);
    dep[x]+=dep[fa[x]];
    return fa[x]=t;
}
void merge(int x,int y){
    fa[y]=x,dep[y]=1,find(y),Max(res[find(x)],res[y]+dep[y]);
}
int main(){
    for(freopen("path.in","r",stdin),freopen("path.out","w",stdout),scanf("%d",&T);T--;puts("")){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)fa[i]=i,dep[i]=res[i]=0;
        for(int i=1,u,v,c;i<n;i++)scanf("%d%d%d",&u,&v,&c),merge(u,v),printf("%d ",res[c]);
    }
    return fflush(stdout),fclose(stdin),fclose(stdout),0;
}

打字机 (type)

题面:有\(n\)个长度为\(m\)的01串,将这\(n\)个串以任意顺序组合出的长度为\(nm\)的串为好的串。现在可以从头到尾在每一位填\(0\)或\(1\),成功率为\(p\),失败会打出另一种字符。求最优策略下打出好的01串的概率(可以根据前面已经打的字符决定策略)。
提接:将\(n\)个串建立trie树,好的字符串就是每次到叶子节点就回到根节点,而且经历了\(n\)个不同的叶子节点的方案数。
令\(f(i,j)\)表示在某一节点走0的子树有\(i\)个叶子节点,走1的子树有\(j\)个叶子节点的最优方案的概率。

\[f(i,j)=max\{p\times f(i-1,j)+(1-p)\times f(i,j-1),p\times f(i,j-1)+(1-p)\times f(i-1,j)\} \]

最后答案为每个节点对应的\(f(i,j)\)的积。
代码:

#include<cstdio>
const int N=1005;
int n,m,trie[N*N][2],ptrie,cnt[N*N][2];
double f[N][N],p,ans=1;
char x[N];
double max(double x,double y){return x>y?x:y;}
double min(double x,double y){return x<y?x:y;}
inline void ins(char*s){
    int u=0;
    for(int i=1;i<=m;i++){
        int p=s[i]^'0';
        if(!trie[u][p])trie[u][p]=++ptrie;
        cnt[u][p]++,u=trie[u][p];
    }
}
int main(){
    freopen("type.in","r",stdin),freopen("type.out","w",stdout),scanf("%d%d%lf",&n,&m,&p);
    for(int i=1;i<=n;i++)scanf("%s",x+1),ins(x);
    f[0][0]=1;
    for(int i=1;i<=n;i++)f[i][0]=f[i-1][0]*p,f[0][i]=f[0][i-1]*p;
    for(int i=1;i<=n;i++)for(int j=1;i+j<=n;j++)f[i][j]=p*max(f[i-1][j],f[i][j-1])+(1-p)*min(f[i-1][j],f[i][j-1]);
    for(int i=0;i<=n;puts(""),i++)for(int j=0;i+j<=n;j++)printf("%.9lf ",f[i][j]);
    for(int i=0;i<=ptrie;i++)ans*=f[cnt[i][0]][cnt[i][1]];
    printf("%.12f",ans);
    return fflush(stdout),fclose(stdin),fclose(stdout),0;
}

标签:int,题解,top,times,double,20240808,节点
From: https://www.cnblogs.com/junjunccc/p/18349111

相关文章

  • SSY20240805提高组T2题解
    题干描述题目描述给定一个长度为......
  • Crash 的旅行计划 / 蓝色彼岸花 题解
    前言题目链接:Hydro&bzoj。题意简述一棵\(n\)个结点的树上,每个点有点权,有\(m\)次操作:修改\(u\)的点权;查询以\(u\)为一端的简单路径的点权和最大值。对于\(20\%\)的数据:\(n,m\leq10^3\);对于另\(30\%\)的数据:第\(i\)条边连接\(i\)和\(i+1\);对于......
  • 洛谷 P1019 [NOIP2000 提高组] 单词接龙 题解
    暴搜!!暴搜!!暴搜!!重要的事情说三遍#include<bits/stdc++.h>usingnamespacestd;constintN=25;intn,ans,use[N];strings,word[N];voiddfs(strings){intls=s.size();//s的lengthans=max(ans,ls);//求出最长的单词接龙for(inti=0;i<n......
  • 洛谷P2404 自然数的拆分问题——题解
    洛谷P2404题解传送锚点摸鱼环节自然数的拆分问题题目描述任何一个大于\(1\)的自然数\(n\),总可以拆分成若干个小于\(n\)的自然数之和。现在给你一个自然数\(n\),要求你求出\(n\)的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列......
  • 【题解】Solution Set - NOIP2024集训Day2 线段树
    【题解】SolutionSet-NOIP2024集训Day2线段树https://www.becoder.com.cn/contest/5431「CF1149C」TreeGenerator™结论:对于括号序列的一个子段,删去所有的匹配括号之后,剩下的不匹配的括号,按顺序构成树上的一条路径。Why?从括号序列的构造出发。每次(相当于开始遍历......
  • ABC365F Takahashi on Grid 题解
    ##题目大意有一个网格图,对于$i=1,2,\dotsn$,第$i$列的$[L_i,U_i]$上的单元格是可到达的,形如下面这张图。![](https://img.atcoder.jp/abc365/4d07a40c98eda33ee86b773e564681c7.png)图中对于$i=1,2,\dots7$,$[L_i,U_i]$分别为:```15331311142435```......
  • excel总结遗留问题解决
    excel遗留问题解决powerquery这是powerbi中的一部分,excel2016以后集成了powerquery,用于做数据清洗。一般过程是数据导入powerquery,经过powerquery清洗,然后上载到excel的表,数据透视表等以共使用。插入之定义列,然后使用公式生成新的列数据?函数配合条件选择使用......
  • loj6669 Nauuo and Binary Tree 题解
    https://loj.ac/p/6669赛时做法先\(n-1\)次问出深度逐层考虑。slv(vector<int>a,vector<int>b)表示在点集\(a\)中寻找\(b\)中点的父亲,询问\(a[0]\)和\(b\)中所有点的距离分治下去复杂度不会算,印象中过了树剖oiwiki二叉树:最多只有一个轻儿子类似「即时战略」......
  • 洛谷P1064 金明的预算方案——题解
    洛谷P1064题解传送锚点摸鱼环节[NOIP2006提高组]金明的预算方案题目描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过\(n\)元钱就行”。今天......
  • 历年CSP-J初赛真题解析 | 2013年CSP-J初赛阅读程序(23-26)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<iostream>usingnamespacestd;intmain(){inta,b;cin>>a>>b;cout<<a<<"+"<<b<<......