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 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...
随机推荐
- vue页面原样导出excel表格
github地址:https://github.com/wuzhiaite/vue-samples 1.excel导出 做过业务系统的知道,进行涉及到excel的导出,列表数据动则几十万,但是也有一部 ...
- Emergency Evacuation 题解
The Japanese government plans to increase the number of inbound tourists to forty million in the yea ...
- Django---进阶14
目录 登陆功能 首页搭建 admin后台管理 用户头像展示 图片防盗链 个人站点 侧边栏筛选功能 登陆功能 def login(request): if request.method == 'POST ...
- 零拷贝(Zero-copy) 浅析及其应用
相信大家都有过面经历,如果跟面试官聊到了操作系统,聊到了文件操作,可能会问你普通的文件读写流程,它有什么缺点,你知道有什么改进的措施.我们经常听说 零拷贝,每次可能只是背诵一些面试要点就过去了,今天我 ...
- HTTP前世今生
HTTP 是浏览器中最重要且使用最多的协议,是浏览器和服务器之间的通信语言.随着浏览器的发展,HTTP 为了能适应新的形式也在持续进化.已经历经0.9,1.0,1.1,2.0等几个阶段, 以及未来的3 ...
- 04 Vue组件
组件 每一个组件都是一个vue实例 每个组件均具有自身的模板template,根组件的模板就是挂载点 每个组件模板只能拥有一个根标签 子组件的数据具有作用域,以达到组件的复用 1.根组件 <di ...
- JavaScript 对象的创建和操作
<script> // 对象是属性的无序集合,每个属性都是一个名/值对. 属性名称是一个字符串. // 对象种类 // 内置对象(nativ ...
- bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁*&&bzoj1630[Usaco2007 Demo]Ant Counting*
bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁&&bzoj1630[Usaco2007 Demo]Ant Counting 题意: t个族群,每个族群有 ...
- Python Ethical Hacking - Basic Concetion
What is Hacking? Gaining unauthorized access. Hackers? 1.Black-hat Hackers 2.White-hat Hackers 3.Gre ...
- FileNotFoundError: [WinError 2] 系统找不到指定的文件。 解决方案
用Idle运行Python脚本的时候发现如下错误: Traceback (most recent call last): File "C:\Users\DangKai\Desktop\pyt ...