正睿OI国庆day1
正睿OI国庆day1
T1
\]
\]
\]
\]
\]
矩阵:(要竖过来)
\(1 1 1 1 1\)
\(0 1 1 1 1\)
\(0 1 0 0 0\)
\(0 0 0 1 1\)
\(0 0 0 1 0\)
矩阵乘法O(logn)求得
好像可以生成函数搞,晚上学一下
\(f'n=\frac{x}{1-x-x^2}\)
\(F'x=f'^2x\)
\(G'x=F'x\frac{1}{1-x}\)
其中\('\)是上尖号
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
ll read(){
ll x=0,pos=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') pos=0;
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return pos?x:-x;
}
ll n;
struct node{
ll g[5][5];
}ori,f1,f2;
const ll mod=998244353;
node mul(node a,node b){
node c;memset(c.g,0,sizeof(c.g));
for(int i=0;i<=4;i++){
for(int j=0;j<=4;j++){
for(int k=0;k<=4;k++){
c.g[i][j]=(c.g[i][j]+(a.g[i][k]*b.g[k][j])%mod);
if(c.g[i][j]>=mod) c.g[i][j]-=mod;
}
}
}
return c;
}
node ksm(node a,ll b){
node res=ori;
while(b){
if(b&1){
res=mul(res,a);
}
b>>=1;
a=mul(a,a);
}
return res;
}
int main(){
n=read();n++;
if(n==1){
printf("1");
return 0;
}
if(n==2){
printf("3");
return 0;
}
memset(ori.g,0,sizeof(ori.g));
ori.g[0][0]=1;
ori.g[1][1]=1;
ori.g[2][2]=1;
ori.g[3][3]=1;
ori.g[4][4]=1;
ori.g[5][5]=1;
memset(f1.g,0,sizeof(f1.g));
f1.g[0][0]=1;
f1.g[1][0]=1;
f1.g[1][1]=1;
f1.g[1][2]=1;
f1.g[2][0]=1;
f1.g[2][1]=1;
f1.g[3][0]=1;
f1.g[3][1]=1;
f1.g[3][3]=1;
f1.g[3][4]=1;
f1.g[4][0]=1;
f1.g[4][1]=1;
f1.g[4][3]=1;
node s=ksm(f1,n-2);
printf("%lld",(s.g[0][0]*3%mod+s.g[1][0]*2%mod+s.g[2][0]+s.g[3][0]+s.g[4][0])%mod);
return 0;
}
T2
考虑换根的时候一部分答案不变
处理最大值和次大值
dfs更新答案就行了
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
int read(){
int x=0,pos=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') pos=0;
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return pos?x:-x;
}
const int N = 200001;
int f[N][20];
struct node{
int v,nex,w;
}edge[N];
int head[N],top=1,n,m,dep[N],c[N],cnt[N],fa[N];
ll ans[N],g[N][2],tot;
inline void add(int u,int v){
edge[++top].v=v;
edge[top].nex=head[u];
head[u]=top;
}
void dfs1(int now,int pre){
f[now][0]=pre;
dep[now]=dep[pre]+1;
for(int i=1;i<=18;i++){
f[now][i]=f[f[now][i-1]][i-1];
}
for(int i=head[now];i;i=edge[i].nex){
int v=edge[i].v;
if(v!=f[now][0]) dfs1(v,now);
}
}
int get_lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int i=18;i>=0;i--){
if(dep[f[u][i]]>=dep[v]) u=f[u][i];
}
if(u==v) return u;
for(int i=18;i>=0;i--){
if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
}
return f[u][0];
}
void dfs2(int now){
for(int i=head[now];i;i=edge[i].nex){
int v=edge[i].v;
if(v!=f[now][0]){
dfs2(v);
cnt[now]+=cnt[v];
if(cnt[v]>=g[now][0]){
g[now][1]=g[now][0];
g[now][0]=cnt[v];
}else if(cnt[v]>g[now][1]){
g[now][1]=cnt[v];
}
ans[1]+=cnt[v];
}
}
cnt[now]+=c[now];
ans[1]-=g[now][0];
}
long long re=0;
void dfs3(int now){
for(int i=head[now];i;i=edge[i].nex){
int v=edge[i].v;
if(v==f[now][0]) continue;
ans[v]=ans[now];
if(cnt[v]==g[now][0]){
ans[v]+=(g[now][0]-g[now][1]);
}
if(cnt[v]>g[v][0]){
ans[v]-=(cnt[v]-g[v][0]);g[v][1]=g[v][0];g[v][0]=cnt[v];
}else if(cnt[v]>g[v][1]) g[v][1]=cnt[v];
dfs3(v);
}
re=min(re,ans[now]);
}
int main(){
re=19280817000000ll;
n=read(),m=read();
for(int i=1,u,v;i<n;i++){
u=read(),v=read();
add(u,v);
add(v,u);
}
dfs1(1,0);
for(int u,v,i=1;i<=m;i++){
u=read(),v=read();
int lca=get_lca(u,v);
c[u]++;c[v]++;c[lca]-=2;
}
dfs2(1);
dfs3(1);
printf("%lld",re);
return 0;
}
T3
\(f(i,S,M) ---- f(i+1,S+1,max(M,g(a_i,b_i)))\)
转移过程是获胜事件的发生概率
正睿OI国庆day1的更多相关文章
- 正睿OI国庆DAY2:图论专题
正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力 ...
- 『正睿OI 2019SC Day1』
概率与期望 总结 老师上午几乎是在讲数学课,没有讲什么和\(OI\)有关的题目,所以我就做了一点笔记. 到了下午,老师讲完了有关知识点和经典模型,就开始讲例题了.前两道例题是以前就做过的,所以没有什么 ...
- 正睿OI DAY3 杂题选讲
正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...
- 正睿OI提高组十连测 day1 总结
可能是最简单的一场比赛了吧,结果却打得这么差... T1是个找规律题,结果一开始愚蠢地找错了规律,然后又对拍,到1h多一点才过掉 然后看t2和t3,以为t2是个水题,t3也只要处理一下就好了,先写t2 ...
- 正睿OI集训游记
什么嘛....就是去被虐的... 反正就是难受就是了.各种神仙知识点,神仙题目,各式各样的仙人掌..... 但是还是学会了不少东西...... 应该是OI生涯最后一次集训了吧.... 这次的感言还是好 ...
- 【正睿oi省选十连测】第一场
四小时写了两个暴力??自闭 [原来这就是神仙们的分量Orz rank 56/75 可以说是无比垃圾了 下周目标:进步十名?[大雾 T1 题意:有n个点的图 点有点权Ai 也有点权Bi = A_1 + ...
- 『正睿OI 2019SC Day8-Day17』
于是就迎来\(10\)天的自闭考试了,每天写点小总结吧. Day8 第一天就很自闭啊,考题分别是数学题+建模题+图论. 前两道题都没有什么算法,但是难度还是有的,于是就做不太出来,特别是第一题.第二题 ...
- 『正睿OI 2019SC Day7』
简单数论 质因子分解 素性测试 素性测试指的是对一个正整数是否为质数的判定,一般来说,素性测试有两种算法: \(1.\) 试除法,直接尝试枚举因子,时间复杂度\(O(\sqrt n)\). \(2.\ ...
- 『正睿OI 2019SC Day5』
网络流 网络流的定义 一个流网络\(G=(V,E)\)为一张满足以下条件的有向图: 每一条边有一个非负容量,即对于任意\(E\)中的\((u,v)\) , 有\(c(u,v)\geq0\). 如果\( ...
随机推荐
- Oracle - View
Oracle View的创建 Create Or Replace View ViewName As Select * From Tables/View Where 条件;
- 通过PHP与Python代码对比浅析语法差异
一.背景 人工智能这几年一直都比较火,笔者一直想去学习一番:因为一直是从事PHP开发工作,对于Python接触并不算多,总是在关键时候面临着基础不牢,地动山摇的尴尬,比如在遇到稍微深入些的问题时候就容 ...
- ASP.NET Core on K8S深入学习(9)Secret & Configmap
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.Secret 1.1 关于Secret 在应用启动过程中需要一些敏感信息, ...
- 洛谷P1372 又是毕业季I+数学
P1372 又是毕业季I 题意:在1-n中找到k个数,使得这k个数的最大公因数最大: 思路,题解: 因为两个数成倍数关系时,它们的最大公因数是两数中的较小数,也就是相对来说最大公因数较大 返回题目,这 ...
- hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)
题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x ...
- C#开发BIMFACE系列22 服务端API之获取模型数据7:获取多个模型的楼层信息
系列目录 [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模型的楼层信息>中介绍获取单个模型的所有楼层信息.某些场景下 ...
- 009 Python基本图形绘制
目录 一.概论 二.方法论 三.实践能力 一.概论 深入理解Python语言 实例2: Python蟒蛇绘制 模块1: turtle库的使用 turtle程序语法元素分析 二.方法论 Python语言 ...
- 洛谷 P1219八皇后
把全部,在这251秒,赌上! ——<游戏人生zero> 题目:https://www.luogu.org/problem/P1219 八皇后是一道非常非常非常经典的深搜+回溯的题目. 这道 ...
- ListView 字母导航排序
一.概述 ListView字母导航排序,网上已经有很多代码和博客了, 这篇博文也是照搬网上的. 之所以写到这里,不是为了说明什么,只是为了以后自己查阅方便.本来公司要求实现expandablelis ...
- helm生产环境离线安装
1.安装helm 生产环境离线的情况下,使用tiller前端运行还是后端运行可以根据自己需求,如果希望tiller可以稳定的运行,可以尝试docker跑以下,作者没有尝试不知是否会成功.但是不通过he ...