正睿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\). 如果\( ...
随机推荐
- 网页播放摄像头视频一种新的实现方式(非ocx方式)
前言 出于安全性考虑,浏览器对网页调用本地资源做了诸多限制.单纯的js是不能调用本地摄像头的,最常用的解决方案是通过ocx来实现.ocx是IE浏览器的扩展插件,并不是通用标准,很多浏览器并不支持ocx ...
- MARTIN FOWLER谈敏捷开发
转自:http://www.scrumcn.com/agile/scrum-knowledge-library/agile-development.html#tab-id-9 每个人都在谈论敏捷开发( ...
- 疯狂的bLue
疯狂的bLue Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 众所周知神秘的 ACM 实验 ...
- 基于 APIGateway 打造生产级别的 Knative 服务
作者 | 阿里云智能事业群高级开发工程师 元毅 导读:在实际应用中,通过 APIGateway(即 API 网关),可以为内部服务提供保护.提供统一的鉴权管理.限流.监控等能力,开发人员只需要关注内 ...
- C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模型的楼层信息
系列目录 [已更新最新开发文章,点击查看详细] 一个文件/模型中可能包含多个楼层信息,获取楼层信息对于前端页面的动态展示非常有帮助.本篇介绍获取一个文件/模型中可能包含多个楼层信息的详细方法. ...
- springboot的最简创建方式
springboot是目前比较流行的技术栈之一,我在这里写一个springboot工程最简方式 首先开发工具是IDEA,双击打开IDEA,点击Create new Project 进入到这个页面,选择 ...
- HTML图片死活不显示
图片不显示: 1.路径 2.名称 3.少写了" ... " 正确的例子:“../images/dd.png” 4.多写了一个“/” ,或者少写了一个“ . ” ,没错.不是三个点, ...
- 致初学者(二): HDU 2014~ 2032题解
下面继续给出HDU 2014~2032的AC程序,供大家参考.2014~2032这19道题就被归结为“C语言程序设计练习(三) ”~“C语言程序设计练习(五) ”. HDU 2014:青年歌手大奖赛_ ...
- PyTorch在笔记本上实现CUDA加速
最近刚开始学习深度学习,参考了一篇深度学习的入门文章,原文链接:https://medium.freecodecamp.org/everything-you-need-to-know-to-maste ...
- null==a和a==null的区别
在项目代码中在if判断中会经常看到一些老司机这样写:if(null == a),而我由于习惯会写成if(a == null),这两种有什么区别呢? 其实两种并没有什么区别,只是前者在细节处理上.我们在 ...