正睿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\). 如果\( ...
随机推荐
- XMind使用教程入门
什么是思维导图 借用百度百科的介绍,思维导图又称脑图.心智导图.是一种将思维形象化的方法,它利用图文并重的方法,将各级主题之间的关系用相互隶属与相关的层级图表现出来,将主题关键词与图像.颜色等建立记忆 ...
- CodeForces-768B-Code For 1+DFS类似线段树思想
Code For 1 题意:对于一个n,可以将它分解为n/2,n%2,n/2三个数字,重复上述操作知道虽有值为1或0为止: 求L---R区间数列的和: 思路:首先画着画着可以发现这是一个类似线段数的结 ...
- UVA 494 Kindergarten Counting Game map
Everybody sit down in a circle. Ok. Listen to me carefully.“Woooooo, you scwewy wabbit!”Now, could s ...
- git合并出现冲突
git合并出现冲突:Your local changes to the following files would be overwritten by merge:Please, commit you ...
- jstat虚拟机统计信息监视工具
jstsat(JVM Statistics Monitoring Tool) jstat用于监视虚拟机各种运行状态信息的命令工具.可以显示本地或者远程虚拟机进程中的类装载.内存.垃圾收集.JIT编译等 ...
- python根据搜索词下载百度图片
# coding=utf-8 """根据搜索词下载百度图片""" import re import urllib import os def ...
- request的请求转发
1.请求转发和重定向的区别 重定向: 请求转发: 可以看出,请求转发只需要发起一次请求,与重定向不同,请求转发发生在服务器内部.请求转发后浏览器的地址不会改变. 2.request请求转发 需要建立两 ...
- Java 开发中常用的网站地址
博客地址:http://www.moonxy.com 一.前言 在日常的开发中,通常需要访问或者设置不同的网站来获取需要的数据,不如我们都知道 Linux 系统版本比较多(例如:Ubuntu.Cent ...
- 控制执行流程之switch语句
switch语句,同时也是一种选择性语句,其根据整数表达式的值(整数选择因子)选择一段代码去执行.整数选择因子为int类型或者char类型.
- 网站启动,报编译错误:类型“ASP.global_asax”同时存在两个文件夹的问题
CS0433: The type 'ASP.global_asax' exists in both 'c:\Windows\Microsoft.NET\Framework64\v4.0.30319\T ...