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

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. 传参问题-HttpMessageNotReableException

    很久没写后台代码,用postMan测试后台接口的时候出现了一个问题: 问题如下: 显而易见是参数问题,我的参数如下图: 我调整参数样式为: 但还是存在问题. 最后调整成用双引号,结果对了.之前没有注意 ...

  2. HDU5961 传递

    传递 因为文化课复习实在捉急qwq,题解就一切从简了qwq 简单说一说 上来一看这道题没看出来突破点在哪... 去HDU上看原题,发现原题是带样例的图解的,然鹅还是没找到思路(太菜了吧) 没办法看了一 ...

  3. IBM & Howdoo – 区块链上的智能社交

    原文链接:https://www.themsphub.com/ibm-howdoo-smart-social-on-the-blockchain 我们很高兴地宣布,我们成为了一个令人兴奋的新社交网络的 ...

  4. 一文梳理Web存储,从cookie,WebStorage到IndexedDB

    前言 HTTP是无状态的协议,网络早期最大的问题之一是如何管理状态.服务器无法知道两个请求是否来自同一个浏览器.cookie应运而生,开始出现在各大网站,然而随着前端应用复杂度的提高,Cookie 也 ...

  5. 数据可视化之分析篇(二)Power BI 数据分析:客户购买频次分布

    https://zhuanlan.zhihu.com/p/100070260 商业数据分析通常都可以简化为对数据进行筛选.分组.汇总的过程,本文通过一个实例来看看PowerBI是如何快速完成整个过程的 ...

  6. Python函数06/装饰器

    Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...

  7. 使用pycharm、跳板机连接内网服务器

    使用pycharm.跳板机连接内网服务器 接手实验室服务器后,大部分同学在GPU集群上跑程序都是直接在ssh界面上跑,这里想着通过pycharm通过跳板机来连接服务器. 总体就是实验室服务器仅限内网访 ...

  8. 静态代理,动态代理和CGLIB代理模式

    代理模式 一.概述 代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象.如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目 ...

  9. 关于Java8的精心总结

    前言 ​ 最近公司里比较新的项目里面,看到了很多关于java8新特性的用法,由于之前自己对java8的新特性不是很了解也没有去做深入研究,所以最近就系统的去学习了一下,然后总结了一篇文章第一时间和大家 ...

  10. NVIDIA GPU Turing架构简述

    NVIDIA GPU Turing架构简述 本文摘抄自Turing官方白皮书:https://www.nvidia.com/content/dam/en-zz/Solutions/design-vis ...