bzoj 5020(洛谷4546) [THUWC 2017]在美妙的数学王国中畅游——LCT+泰勒展开
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5020
https://www.luogu.org/problemnew/show/P4546
如果保证 x=1 ,则可以用 LCT 维护每个点的函数值。不然的话就用 LCT 拿出那条链,dfs 一下 splay 现算。可以得 60 分。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=1e5+;
int n,m,fa[N],c[N][],sta[N],top; db sm[N],vl[N]; bool fx,rev[N];
struct Node{
int f;db a,b;
db cal(db x)
{
if(f==)return sin(a*x+b);
if(f==)return exp(a*x+b);
if(f==)return a*x+b;
}
}a[N];
bool isroot(int cr){return c[fa[cr]][]!=cr&&c[fa[cr]][]!=cr;}
void pshp(int cr){sm[cr]=sm[c[cr][]]+sm[c[cr][]]+vl[cr];}
void Rev(int cr){if(rev[cr]){rev[cr]=;rev[c[cr][]]^=;rev[c[cr][]]^=;swap(c[cr][],c[cr][]);}}
void rotate(int x)
{
int y=fa[x],z=fa[y],d=(x==c[y][]);
if(!isroot(y))c[z][y==c[z][]]=x;//!isroot(y) not !isroot(z) !!
fa[x]=z;
fa[y]=x; fa[c[x][!d]]=y;
c[y][d]=c[x][!d]; c[x][!d]=y;
if(fx)pshp(y),pshp(x);
}
void splay(int x)
{
sta[top=]=x;
for(int cr=x;!isroot(cr);cr=fa[cr])sta[++top]=fa[cr];
for(int i=top;i;i--)Rev(sta[i]);
int y,z;
while(!isroot(x))
{
y=fa[x];z=fa[y];
if(!isroot(y))
((x==c[y][])^(y==c[z][]))?rotate(x):rotate(y);
rotate(x);
}
}
void access(int cr)
{
for(int t=;cr;splay(cr),c[cr][]=t,pshp(cr),t=cr,cr=fa[cr]);//pshp()!!
}
void mkrt(int cr)
{
access(cr);splay(cr);rev[cr]^=;
}
void link(int x,int y)
{
mkrt(x);fa[x]=y;
}
void cut(int x,int y)
{
mkrt(x);access(y);splay(y);
fa[x]=c[y][]=;if(fx)sm[y]-=vl[x];
}
void mdfy(int cr,int f,db a1,db b1)
{
if(fx)splay(cr),sm[cr]-=vl[cr];
a[cr].f=f;a[cr].a=a1;a[cr].b=b1;
if(fx)vl[cr]=a[cr].cal(),sm[cr]+=vl[cr];
}
int fnd(int cr)//root of real tree
{
while(!isroot(cr))cr=fa[cr];return cr;
}
db dfs(int cr,db x)
{
db ret=a[cr].cal(x);
if(c[cr][])ret+=dfs(c[cr][],x);
if(c[cr][])ret+=dfs(c[cr][],x);
return ret;
}
void print(db x)
{
bool fx=;int t=;
if(x<){fx=;while(x<)x*=,t++;}
if(x>=){while(x>=)x/=,t++;}
printf("%.8fe%c%03d\n",x,fx?'-':'+',t);
}
int main()
{
n=rdn();m=rdn();char ch[];scanf("%s",ch);
if(ch[]=='')fx=;
for(int i=;i<=n;i++)
{
a[i].f=rdn();scanf("%lf%lf",&a[i].a,&a[i].b);
if(fx)vl[i]=sm[i]=a[i].cal();
}
int u,v;db a,b,x;
while(m--)
{
scanf("%s",ch);
if(ch[]=='a'){u=rdn()+;v=rdn()+;link(u,v);}
if(ch[]=='d'){u=rdn()+;v=rdn()+;cut(u,v);}
if(ch[]=='m'){u=rdn()+;v=rdn();scanf("%lf%lf",&a,&b);mdfy(u,v,a,b);}
if(ch[]=='t')
{
u=rdn()+;v=rdn()+;scanf("%lf",&x);
mkrt(u);access(v);splay(v);
if(fnd(u)!=v)puts("unreachable");
else print(fx?sm[v]:dfs(v,x));
}
}
return ;
}
关于本题的求导和泰勒展开可以看这个:https://www.cnblogs.com/zhoushuyu/p/8148732.html
似乎还可以麦克劳林展开:https://www.cnblogs.com/Troywar/p/8982707.html
似乎展开成 12 项的多项式就差不多了,然后可以用 LCT 维护 12 项的系数和,算的时候乘上 xk 再除以阶乘就行。
那个 x0 好像取 0 就行了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
#define ls c[cr][0]
#define rs c[cr][1]
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
using namespace std;
const int N=1e5+,M=;
int n,fa[N],c[N][],sta[N],top; bool rev[N]; db sm[N][M+],vl[N][M+],jc[N];
struct Node{
int f;db a,b;
Node(int f=,db a=,db b=):f(f),a(a),b(b) {}
void cz(int cr)
{
if(f==)
{
db p[],lja=;
p[]=sin(b);p[]=cos(b);p[]=-p[];p[]=-p[];
for(int i=;i<M;i+=)
for(int j=;j<;j++,lja*=a)sm[cr][i+j]=vl[cr][i+j]=p[j]*lja;
}
if(f==)
{
db ml=exp(b),lja=;
for(int i=;i<M;i++,lja*=a)sm[cr][i]=vl[cr][i]=ml*lja;
}
if(f==)
{
sm[cr][]=vl[cr][]=b; sm[cr][]=vl[cr][]=a;
for(int i=;i<M;i++)sm[cr][i]=vl[cr][i]=;
}
}
}w[N];
bool isrt(int cr){return c[fa[cr]][]!=cr&&c[fa[cr]][]!=cr;}
void pshp(int cr)
{
for(int i=;i<M;i++)sm[cr][i]=sm[ls][i]+sm[rs][i]+vl[cr][i];
}
void Rev(int cr){if(rev[cr]){rev[cr]=;rev[ls]^=;rev[rs]^=;swap(ls,rs);}}
void rotate(int x)
{
int y=fa[x],z=fa[y],d=(x==c[y][]);
if(!isrt(y))c[z][y==c[z][]]=x;
fa[x]=z;
fa[y]=x; fa[c[x][!d]]=y;
c[y][d]=c[x][!d]; c[x][!d]=y;
pshp(y);pshp(x);
}
void splay(int x)
{
sta[top=]=x;
for(int cr=x;!isrt(cr);cr=fa[cr])sta[++top]=fa[cr];
for(int i=top;i;i--)Rev(sta[i]);
int y,z;
while(!isrt(x))
{
y=fa[x];z=fa[y];
if(!isrt(y))
((x==c[y][])^(y==c[z][]))?rotate(x):rotate(y);
rotate(x);
}
}
void access(int cr)
{
for(int t=;cr;splay(cr),rs=t,pshp(cr),t=cr,cr=fa[cr]);//pshp()!!!
}
void mkrt(int cr)
{
access(cr);splay(cr);rev[cr]^=;
}
void link(int x,int y)
{
mkrt(x);fa[x]=y;
}
void cut(int x,int y)
{
mkrt(x);access(y);splay(y);
fa[x]=c[y][]=;pshp(y);
}
void mdfy(int cr,int f,db a,db b)
{
splay(cr);
w[cr]=Node(f,a,b);w[cr].cz(cr);
}
db cal(int cr,db x)
{
db ret=,ml=;
for(int i=;i<M;i++,ml*=x)
ret+=sm[cr][i]*ml/jc[i];
return ret;
}
int fnd(int cr)
{
while(!isrt(cr))cr=fa[cr];return cr;
}
void print(db x)
{
bool fx=;int t=;
if(x<){fx=;while(x<)x*=,t++;}
if(x>=){while(x>=)x/=,t++;}
printf("%.8fe%c%03d\n",x,fx?'-':'+',t);
}
int main()
{
jc[]=;for(int i=;i<M;i++)jc[i]=jc[i-]*i;
n=rdn();int m=rdn();char ch[];scanf("%s",ch);
for(int i=;i<=n;i++)
w[i].f=rdn(),scanf("%lf%lf",&w[i].a,&w[i].b),w[i].cz(i),pshp(i);//pshp for sm[]
int u,v;db a,b;
while(m--)
{
scanf("%s",ch);
if(ch[]=='a'){u=rdn()+;v=rdn()+;link(u,v);}
if(ch[]=='d'){u=rdn()+;v=rdn()+;cut(u,v);}
if(ch[]=='m'){u=rdn()+;v=rdn();scanf("%lf%lf",&a,&b);mdfy(u,v,a,b);}
if(ch[]=='t')
{
u=rdn()+;v=rdn()+;scanf("%lf",&a);
mkrt(u);access(v);splay(v);
if(fnd(u)!=v)puts("unreachable");
else print(cal(v,a));
}
}
return ;
}
bzoj 5020(洛谷4546) [THUWC 2017]在美妙的数学王国中畅游——LCT+泰勒展开的更多相关文章
- bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5020 https://loj.ac/problem/2289 题解 这个 appear 和 d ...
- BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)
Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数学的语言展现出来. 这印证了一句古老的名言: ...
- bzoj 5020: [THUWC 2017]在美妙的数学王国中畅游【泰勒展开+LCT】
参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html --其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊 泰勒展开是到正无穷的,但是因 ...
- BZOJ5020 [THUWC 2017]在美妙的数学王国中畅游LCT
题意很明显是要用LCT来维护森林 难点在于如何处理函数之间的关系 我们可以根据题目给的提示关于泰勒展开的式子 将三种函数变成泰勒展开的形式 因为$x∈[0,1]$ 所以我们可以将三个函数在$x_0=0 ...
- loj2289 [THUWC 2017]在美妙的数学王国中畅游(LCT+Taylor展开)
link 题目大意: 你需要维护一个树 每个点都有个sin(ax+b)或exp(ax+b)或ax+b 你需要维护一些操作:连边.删边.修改某个点的初等函数.询问某条树链上所有函数带入某个值后权值和或不 ...
- 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT
[BZOJ5020][THUWC 2017]在美妙的数学王国中畅游 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数 ...
- 洛谷 P4546 & bzoj 5020 在美妙的数学王国中畅游 —— LCT+泰勒展开
题目:https://www.luogu.org/problemnew/show/P4546 先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分: 注意各处 pushup,而且 spla ...
- 5020: [THUWC 2017]在美妙的数学王国中畅游
传送门 当年听llj讲的时候觉得这简直是个不可做的神题. 现在看来并不是很神,可能是我已经被剧透了的缘故... 一开始以为是函数套函数,懵蔽了好久,结果只是求和 被剧透了泰勒展开就比较水了..只要你不 ...
- [THUWC 2017]在美妙的数学王国中畅游
bzoj5020 \[答案误差只要小于 10^{-7}\] 题解 Taylor展开式: \[若f(x)的n阶导数在[a, b]内连续,则f(x)在x_{0}\in[a, b]可表示为\] \[f(x) ...
随机推荐
- 前端学习笔记之css清除浮动float的七种常用方法总结和兼容性处理
在清除浮动前我们要了解两个重要的定义: 浮动的定义:使元素脱离文档流,按照指定方向发生移动,遇到父级边界或者相邻的浮动元素停了下来. 高度塌陷:浮动元素父元素高度自适应(父元素不写高度时,子元素写了浮 ...
- Duilib嵌入CEF禁止浏览器响应拖拽事件
转载:http://blog.csdn.net/liuyan20092009/article/details/53819473 转载:https://blog.csdn.net/u012778714( ...
- bzoj 4443: [Scoi2015]小凸玩矩阵
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 149 Solved: 81[Submit][Status][Discuss] Description ...
- 5700刀打造3卡1080Ti深度学习机器【转】
本文转载自:https://www.jianshu.com/p/ca2e003bf77e 5700美刀,打造3x1080Ti实验室GPU深度学习机器 最近为公司搭建了一台实验用的深度学习主机,在网 ...
- Git命令速查表【转】
本文转载自:http://www.cnblogs.com/kenshinobiy/p/4543976.html 一. Git 常用命令速查 git branch 查看本地所有分支git status ...
- YouCompleteMe自动补全的安装配置与使用
1 下载 git clone --recursive git://github.com/Valloric/YouCompleteMe 如果执行该命令没报错, 就ok了. 但是中途有可能会断掉, 可以 ...
- git如何自动打补丁
答:git am --reject jello.patch (如果打补丁失败,会自动生成rej文件)
- AngularJs 表单提交按钮状态
表单属性: $invalid:未经过验证的表单,就是表单里面信息通过验证就为false,没有通过为true $valid:经过验证的表单,表单里信息验证通过为true,反之为false $dirty: ...
- Cannot perform runtime binding on a null reference
一个方法的参数是dynamic obj 方法内调用了obj.Header 但是外部传递进来的obj是null,然后就会报这个错.
- Gym - 100712D Alternating Strings
http://codeforces.com/gym/100712/attachments 题意: 给出一个01串,现在要切割这个01串,使得每个子串长度都不大于k,并且每个子串不能01交替出现,单个字 ...