暴毙了,比较自闭的心理,有点崩溃..

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的更多相关文章

  1. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  2. day1

    day1.py ][][: ][: ): : ]['lock'] = 0 json.dump(userlist_message, open(userlist, 'w')) break #输错次数到3次 ...

  3. day1作业--登录入口

    作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...

  4. luogu1003铺地毯[noip2011 提高组 Day1 T1]

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  5. Python学习路程day1

    变量起名: 变量名如果太长,推荐使用下划线来分开,让人看得清晰明白.例:nums_of_alex_girl=19 .或者是驼峰写法,即首字母大写.例:NumOfAlexGf=18 注意:不合法的变量起 ...

  6. 团队项目——站立会议 DAY1

    团队项目--站立会议 DAY1        团队成员介绍(5人):张靖颜.何玥.钟灵毓秀.赵莹.王梓萱        今日(2016/5/6)为站立会议的第一天,一起对团队项目进行讨论,并对每个人的 ...

  7. Day1 login

    使用流程: 1.程序启动后,显示欢迎信息,提示用户输入用户名: 2.判断用户是否存在,不存在则提示重新输入,或者关闭程序:客户存在则提示客户输入密码: 3.判断密码是否正确,如果不正确则提示用户重新输 ...

  8. contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve

    http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve Solve CH Round #64 - MFO ...

  9. noip2011提高组day1+day2解题报告

    Day1 T1铺地毯https://www.luogu.org/problem/show?pid=1003 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...

随机推荐

  1. 「HAOI2015树上染色」「树形DP」

    其实我还不大会树形DP 此题就当练手叭,缕一下思路就好 题目链接 BZOJ4033 题目大意就是给一棵树,对一部分点染成黑色,剩下的为白色,问所有同色点距离之和....... 简明扼要的题意,然额我不 ...

  2. python 检索文件内容工具

    公司内部需求一个工具检索目录下的文件在另外的目录中使用次数, 用来优化包体的大小. 此代码效率并不高效, 另添加对应的 后缀检索. 用python 实现比较快速, 另还有缺点是只支持 utf-8 格式 ...

  3. day11 文件操作(上)

    目录 一.什么是文件 二.为何要用文件 三.如何使用文件 3.1文件操作的基本流程 3.2资源回收with上下文管理 3.3指定操作文本的字符编码 四.文件的操作模式 4.1控制文件读写操作的模式(t ...

  4. redis源码学习之工作流程初探

    目录 背景 环境准备 下载redis源码 下载Visual Studio Visual Studio打开redis源码 启动过程分析 调用关系图 事件循环分析 工作模型 代码分析 动画演示 网络模块 ...

  5. linux专题(一):小白的开始以及相关的学习链接

    转载自:https://www.cnblogs.com/ggjucheng/archive/2011/12/16/2290158.html 学习Linux也有一阵子了,这过程中磕磕撞撞的,遇到了问题, ...

  6. 数据可视化之powerBI技巧(二十三)Power BI可视化技巧,使用DAX自定义时间轴

    ​按照自然日历来展现疫情数据时,是这样的效果, 由于各个国家的疫情爆发时间不一致,按自然日期坐标轴很难比较各个国家的蔓延速度. 如果各个国家都从蔓延日开始统计,展示之后每日的确诊人数,就是同样的时间轴 ...

  7. 万字长文,62道Java核心面试题,一次性打包送给积极向上的你

    先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章. ...

  8. React js ReactDOM.render 语句后面不能加分号

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  9. 转自fineui论坛:解决fineui框架开发中的Designer.aspx.cs丢失问题

    在开发的时候碰到个问题,本来好好的Edit.aspx  Edit.aspx.cs  Edit.Designer.aspx.cs编辑Edit.aspx然后保存,编译的时候 发现Edit.aspx.cs里 ...

  10. GPO - General GPO Settings(1)

    Prohibit access to Control Panel and PC settings Disable GPO for Administrators and /or User Groups  ...