正睿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\). 如果\( ...
随机推荐
- netcore 之动态代理(微服务专题)
动态代理配合rpc技术调用远程服务,不用关注细节的实现,让程序就像在本地调用以用. 因此动态代理在微服务系统中是不可或缺的一个技术.网上看到大部分案例都是通过反射自己实现,且相当复杂.编写和调试相当不 ...
- [企业微信通知系列]Jenkins发布后自动通知
一.前言 最近使用Jenkins进行自动化部署,但是部署后,并没有相应的通知,虽然有邮件发送通知,但是发现邮件会受限于接收方的接收设置,导致不能及时看到相关的发布内容.而由于公司使用的是企业微信,因此 ...
- c#搭建jenkins自动构建环境
这边我使用的是参数化构建过程,文笔比较差劲,就直接上干货了 1.定义构造参数 2.设置jenkins工作空间目录,在此定义了版本号和工作目录构建参数 3.配置svn 4.构建触发器,用于轮询查看svn ...
- @override 重写 与重载
方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多 ...
- 除了FastJson,你还有选择: Gson简易指南
前言 这个周末被几个技术博主的同一篇公众号文章 fastjson又被发现漏洞,这次危害可导致服务瘫痪! 刷屏,离之前漏洞事件没多久,fastjson 又出现严重 Bug.目前项目中不少使用了 fast ...
- 【Nginx】基础学习概览【汇总】
一.Nginx 简介安装启动 二.Nginx的应用场景 三.Nginx中的配置命令 四.实现动态负载均衡 五.四层负载均衡 六.主从热备 七.动静分离 一.Nginx 简介安装启动 [Nginx]简介 ...
- 【Redis】缓存穿透与缓存雪崩
一.缓存雪崩 1.1 缓存雪崩产生的原因 1.2 解决方案 1.3 锁的方式 1.4 消息中间件 1.5 一级和二级缓存 1.6 均摊分配redis key 失效时间 二.缓存穿透 一.缓存雪崩 1. ...
- 小米下拉框jQuery实现
<div class="daohanglan"> <div class="dh">小米手机 <--多个自己定义--> < ...
- Vue组件间通信方式
一.Props传递数据 在父组件中使用子组件,本质通过v-bind绑定属性传入子组件,子组件通过props接收父组件传入的属性 <template> <div> 父组件:{{m ...
- Linux_Day001-002章常用命令
Linux操作系统的组成 以下符号的意义. 输出重定向和输入重定向的知识点 echo 把后面的文字显示出来 xargs 分组, -n 分为n组 xargs -n 1.txt (完整命令:xargs ...