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 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...
随机推荐
- 传参问题-HttpMessageNotReableException
很久没写后台代码,用postMan测试后台接口的时候出现了一个问题: 问题如下: 显而易见是参数问题,我的参数如下图: 我调整参数样式为: 但还是存在问题. 最后调整成用双引号,结果对了.之前没有注意 ...
- HDU5961 传递
传递 因为文化课复习实在捉急qwq,题解就一切从简了qwq 简单说一说 上来一看这道题没看出来突破点在哪... 去HDU上看原题,发现原题是带样例的图解的,然鹅还是没找到思路(太菜了吧) 没办法看了一 ...
- IBM & Howdoo – 区块链上的智能社交
原文链接:https://www.themsphub.com/ibm-howdoo-smart-social-on-the-blockchain 我们很高兴地宣布,我们成为了一个令人兴奋的新社交网络的 ...
- 一文梳理Web存储,从cookie,WebStorage到IndexedDB
前言 HTTP是无状态的协议,网络早期最大的问题之一是如何管理状态.服务器无法知道两个请求是否来自同一个浏览器.cookie应运而生,开始出现在各大网站,然而随着前端应用复杂度的提高,Cookie 也 ...
- 数据可视化之分析篇(二)Power BI 数据分析:客户购买频次分布
https://zhuanlan.zhihu.com/p/100070260 商业数据分析通常都可以简化为对数据进行筛选.分组.汇总的过程,本文通过一个实例来看看PowerBI是如何快速完成整个过程的 ...
- Python函数06/装饰器
Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...
- 使用pycharm、跳板机连接内网服务器
使用pycharm.跳板机连接内网服务器 接手实验室服务器后,大部分同学在GPU集群上跑程序都是直接在ssh界面上跑,这里想着通过pycharm通过跳板机来连接服务器. 总体就是实验室服务器仅限内网访 ...
- 静态代理,动态代理和CGLIB代理模式
代理模式 一.概述 代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象.如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目 ...
- 关于Java8的精心总结
前言 最近公司里比较新的项目里面,看到了很多关于java8新特性的用法,由于之前自己对java8的新特性不是很了解也没有去做深入研究,所以最近就系统的去学习了一下,然后总结了一篇文章第一时间和大家 ...
- NVIDIA GPU Turing架构简述
NVIDIA GPU Turing架构简述 本文摘抄自Turing官方白皮书:https://www.nvidia.com/content/dam/en-zz/Solutions/design-vis ...