QDC DAY1
暴毙了,比较自闭的心理,有点崩溃..
LINK:幸福 一道曾经的我肯定能写出来的 但是我心态崩了 所以没有推出来。
当然 还是 我比较垃圾 但同时也不垃圾 。。。
求 $T_n =\displaystyle \sum_{i=0}^{n}F_n$ 其中 $Fn=\displaystyle \sum_{i=0}^{n}f_i \times f_{n-i}$
其中$f$是斐波那契数列 $f_0=1,f_1=1$... 求 $F_n$ 其中n<=1e18
一个比较显然的思路是把Tn 写出来不断化简 最后发现是一个前缀和的形式 然后发现可以O(n)计算了。
这样只有70分的垃圾成绩。
//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000010
#define ll long long
#define mp(x,y) make_pair(x,y)
#define un unsigned
#define db double
#define EPS 1e-5
#define mod 998244353
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline ll read()
{
ll x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const ll MAXN=;
ll n;
ll ans,sum;
ll f[MAXN];
signed main()
{
//freopen("1.in","r",stdin);
n=read();
f[]=;f[]=;
for(ll i=;i<=n;++i)f[i]=(f[i-]+f[i-])%mod;
if(n<=)
{
for(ll i=;i<=n;++i)
{
for(ll j=;j<=i;++j)
ans=(ans+f[j]*f[i-j])%mod;
}
printf("%lld\n",ans);
return ;
}
if(n<=)
{
for(int i=;i<=n;++i)sum=(sum+f[i])%mod;
for(int i=;i<=n;++i)
{
sum=((sum-f[n-i+])+mod)%mod;
ans=(ans+f[i]*sum%mod)%mod;
}
printf("%lld\n",ans);
return ;
}
//考虑 100分 容斥还没有想好 自闭
printf("%lld\n",ans);
return ;
}
继续思考如何优化 发现这个其实是倒三角求和 扩大两倍是不正确的 所以我当时 算2h然后弃疗了。思考方向不是太对。
观察一下$F_n$这个式子。 简单的 化简成 $F_n=\sum_{i=0}^{n-2f_i \times f_{n-i}+f_{n-1}f_1+f_n+f_0$
比较显然的是 这个东西显然可以 化简为 $F_n=F_{n-1}+F_{n-2}+f_n$;
//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000010
#define mod 998244353
typedef long long ll;
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline ll read()
{
ll x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const ll MAXN=;
ll n,m=;
struct wy
{
ll f[MAXN];
ll b[MAXN][MAXN];
wy(){memset(f,,sizeof(f));memset(b,,sizeof(b));}
friend wy operator *(wy A,wy B)
{
wy tmp;
for(ll i=;i<=m;++i)
for(ll j=;j<=m;++j)
for(ll k=;k<=m;++k)
tmp.b[i][j]=(tmp.b[i][j]+A.b[i][k]*B.b[k][j])%mod;
for(int i=;i<=m;++i)tmp.f[i]=A.f[i];
return tmp;
}
friend wy operator -(wy A,wy B)
{
wy tmp;
for(ll i=;i<=m;++i)
for(ll j=;j<=m;++j)
tmp.f[i]=(tmp.f[i]+A.f[j]*B.b[j][i])%mod;
for(int i=;i<=m;++i)
for(int j=;j<=m;++j)tmp.b[i][j]=A.b[i][j];
return tmp;
}
friend wy operator ^(wy A,ll p)
{
while(p)
{
if(p&)A=A-A;
A=A*A;
p=p>>;
}
return A;
}
}C;
signed main()
{
//freopen("1.in","r",stdin);
n=read();
C.b[][]=;C.b[][]=;C.b[][]=;C.b[][]=;
C.b[][]=;C.b[][]=;C.b[][]=;C.b[][]=;
C.b[][]=;C.b[][]=;C.b[][]=;
C.f[]=;C.f[]=;C.f[]=;C.f[]=;C.f[]=;
C=C^(n-);
printf("%lld\n",C.f[m]);
return ;
}
所以 就有了 矩阵乘法的优化 以后要敏感一点 或者从不同的方向推一下。
LINK:树链刨分简单的树形dp但需要一些小细节。 当时 可能有一点点慌 所以 题目没怎么看的懂。
想想当时还是比较蠢的。但是过后做法还是很容易就看出来的了。
首先是代价的问题 这个进行 简单的树上差分即可解决。考虑 求答案 不知道哪个点是根。
很好 那么 直接 就 直接一点 以 1 为根 那么答案 我们显然可以贪心的统计出来。
考虑换根。这里值得注意的是 我们是将边权转点权了 看起来很不形象的样子其实可以直接放到边权上 不过那也应该是点权的样子存在着。
直接换根吧 然后有一个细节 其实主要过程是 x 到 y的换根 这里维护一个最大值和次大值就是为了防止y是x的最大值什么的。
还有一点是 换过根之后的话 x就光荣的成为了y的儿子了 在y 继续向下换根的过程中 y的最大值和 次大值应该要被x所更新。(重点 不要像我这个sb一样没注意到)
当然这个swap是必要的qwq 。。因为 swap x y 是要把x变成y的儿子 再swap回来是为了保证原本的关系 因为x其他儿子还需要转移。
//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define max(x,y) ((x)>(y)?(x):(y))
#define INF 1000000010
#define ll long long
#define mp(x,y) make_pair(x,y)
#define un unsigned
#define db double
#define EPS 1e-5
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline ll read()
{
ll x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const ll MAXN=;
ll n,len,m,sum,cnt;
ll lin[MAXN],nex[MAXN<<],ver[MAXN<<];
ll sz[MAXN],vis[MAXN],f[MAXN],s[MAXN],son[MAXN],sx[MAXN];
struct wy
{
ll x,y,lca;
}t[MAXN];
vector<ll>g[MAXN],id[MAXN];
inline void add(ll x,ll y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
inline ll getfather(ll x){return x==f[x]?x:f[x]=getfather(f[x]);}
inline void dfs(ll x)
{
vis[x]=;f[x]=x;
for(ll i=lin[x];i;i=nex[i])
{
ll tn=ver[i];
if(vis[tn])continue;
dfs(tn);
f[tn]=x;
}
for(unsigned ll i=;i<g[x].size();++i)
{
ll tn=g[x][i];
ll ID=id[x][i];
if(vis[tn])t[ID].lca=getfather(tn);
}
}
inline void dfs(ll x,ll father)
{
f[x]=;
for(ll i=lin[x];i;i=nex[i])
{
ll tn=ver[i];
if(tn==father)continue;
dfs(tn,x);
sz[x]+=sz[tn];
if(sz[son[x]]<sz[tn])son[x]=tn;
f[x]+=f[tn];
}
for(ll i=lin[x];i;i=nex[i])
{
ll tn=ver[i];
if(tn==father)continue;
if(son[x]==tn)continue;
if(sz[sx[x]]<sz[tn])sx[x]=tn;
}
f[x]+=sz[son[x]];sum+=sz[x];
}
inline void dp(ll x,ll father)
{
for(ll i=lin[x];i;i=nex[i])
{
ll tn=ver[i];
if(tn==father)continue;
s[tn]=f[tn]-sz[son[tn]]+s[x]-f[tn];
if(son[x]==tn)s[tn]=s[tn]-sz[tn]+sz[sx[x]];
swap(sz[x],sz[tn]);
if(sz[x]>sz[son[tn]])
{
sx[tn]=son[tn];
son[tn]=x;
}
else if(sz[x]>sz[sx[tn]])sx[tn]=x;
s[tn]+=sz[son[tn]];
dp(tn,x);
swap(sz[x],sz[tn]);
}
}
signed main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
n=read();m=read();
for(ll i=;i<n;++i)
{
ll x,y;
x=read();y=read();
add(x,y);add(y,x);
}
for(ll i=;i<=m;++i)
{
ll x,y;
x=read();y=read();
t[i]=(wy){x,y};
if(x==y){t[i].lca=x;continue;}
g[x].push_back(y);
g[y].push_back(x);
id[x].push_back(i);
id[y].push_back(i);
}
dfs();
for(ll i=;i<=m;++i)
{
++sz[t[i].x];++sz[t[i].y];
--sz[t[i].lca];--sz[t[i].lca];
}
dfs(,);s[]=f[];
dp(,);
for(ll i=;i<=n;++i)cnt=max(cnt,s[i]);
printf("%lld\n",sum-cnt);
return ;
}
QDC DAY1的更多相关文章
- NOIp2016 Day1&Day2 解题报告
Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...
- day1
day1.py ][][: ][: ): : ]['lock'] = 0 json.dump(userlist_message, open(userlist, 'w')) break #输错次数到3次 ...
- day1作业--登录入口
作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...
- luogu1003铺地毯[noip2011 提高组 Day1 T1]
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...
- Python学习路程day1
变量起名: 变量名如果太长,推荐使用下划线来分开,让人看得清晰明白.例:nums_of_alex_girl=19 .或者是驼峰写法,即首字母大写.例:NumOfAlexGf=18 注意:不合法的变量起 ...
- 团队项目——站立会议 DAY1
团队项目--站立会议 DAY1 团队成员介绍(5人):张靖颜.何玥.钟灵毓秀.赵莹.王梓萱 今日(2016/5/6)为站立会议的第一天,一起对团队项目进行讨论,并对每个人的 ...
- Day1 login
使用流程: 1.程序启动后,显示欢迎信息,提示用户输入用户名: 2.判断用户是否存在,不存在则提示重新输入,或者关闭程序:客户存在则提示客户输入密码: 3.判断密码是否正确,如果不正确则提示用户重新输 ...
- contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve
http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve Solve CH Round #64 - MFO ...
- noip2011提高组day1+day2解题报告
Day1 T1铺地毯https://www.luogu.org/problem/show?pid=1003 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...
随机推荐
- PE文件格式详解(二)
0x00 前言 上一篇讲到了PE文件头的中IMAGE_FILE_HEADER结构的第二个结构,今天从IMAGE_FILE_HEADER中第三个结构sizeOfOptionalHeader讲起.这个字段 ...
- 三分钟了解 Python3 的异步 Web 框架 FastAPI
快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...
- day17 作业
目录 一.编写函数(函数执行的时间用time.sleep(n)模拟) 二.编写装饰器,为函数加上统计时间的功能 三.编写装饰器,为函数加上认证的功能 四.编写装饰器,为多个函数加上认证的功能(用户的账 ...
- SSTI(模板注入)
SSTI 一. 什么是SSTI 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. ...
- DirectX11 With Windows SDK--34 位移贴图
前言 在前面的章节中,我们学到了法线贴图和曲面细分.现在我们可以将这两者进行结合以改善效果,因为法线贴图仅仅只是改善了光照的细节,但它并没有从根本上改善几何体的细节.从某种意义上来说,法线贴图只是一个 ...
- oracle 12c数据库在Windows环境下的安装
因为菜鸟小白之前做着一些数据库审计产品的测试,接下来我会分享一些关于数据库安装和通过python的访问数据库的知识 安装 首先我们需要下载一个oracle 12c的安装程序,解压后右键点击“ ...
- Ethical Hacking - GAINING ACCESS(5)
Server Side Attack Install Metasploit cummunity/pro and active it. Create a new project for the targ ...
- echarts 踩坑 : id必须不同
我们可能用react前端框架开发项目. 也就是组件化开发. 一个页面里可能有很多组件. 而echarts是寻找特定ID的DOM去渲染的. 也就是说,如果整个页面.包括所有页面组件,有id相同的DOM, ...
- 【翻译】Scriban README 文本模板语言和.NET引擎
scriban Scriban是一种快速.强大.安全和轻量级的文本模板语言和.NET引擎,具有解析liquid模板的兼容模式 Github https://github.com/lunet-io/sc ...
- 网易邮箱如何使用二次验证码/谷歌身份验证器/两步验证/虚拟MFA?
登陆后点邮箱名——安全设置——开通两步验证,用二次验证码微信小程序绑定即可 具体步骤见链接 网易邮箱如何使用二次验证码/谷歌身份验证器/两步验证/虚拟MFA? 二次验证码小程序于谷歌身份验证器APP ...