解题:THUWC 2017 在美妙的数学王国中畅游
_“数字和数学规律主宰着这个世界。”_
在 @i207M 帮助下折腾了半天终于搞懂了导数和泰勒展开,引用某学长在考场上的感受:感觉整个人都泰勒展开了
显然是个奇奇怪怪的东西套上LCT,发现直接维护的话并不能快速链上求和。所以用友好的提示里的泰勒展开,对每个点的函数进行泰勒展开后就变成了维护多项式的和,大概展开十几项精度就够了(我展开了16项)。题目告诉我们了这三个函数在[0,1]都能展开,那就在零点展开呗,这不是最方便的吗=。=
当然因为可能~~并没~~有人和制杖的我一样对导数一无所知~~(初中没学,高中停课了的那种)~~,我还是写的详细一点比较好。
(注意题目中最终带进每个函数的实际是$ax+b$)
先以$\sin$为例,下面我们用$d^k(x)$表示关于$x$的函数的$k$阶导数,用$g(x)$表示$ax+b$,用$h(x)$表示题目实际要我们求的东西,我们把$h(x)$在零点展开之后发现是这样的一个东西
$h(x)=h(0)+\frac{d^1(0)(x-0)}{1!}+\frac{d^2(0)(x-0)^2}{2!}+......$
所以说选零点展开多方便=。=
$h(x)=h(0)+(d^1(0)/1!)x+(d^2(0)/2!)x^2+......$
好,现在把$h$换回去,那$h(0)$实际是$f(g(0))=sin(a*0+b)=sin(b)$,那导数$d(0)$呢?我们经过各种途径可以知道$\sin x$求导是$\cos x$,$\cos x$求导是$-\sin x$,当然还有$ax+b$求导是$a$,现在问题是$h$是两个函数套起来,所以你还需要知道
链式法则:设函数$h(x)=f(g(x))$,那么函数$h$在$x$处的导数$h'(x)=f'(g(x))g'(x)$,即$f$在$g(x)$处求导的结果乘上$g$在$x$处求导的结果
应用一下:$h'(0)=f'(g(0))g'(0)=\cos(g(0))a=a\cos(b)$
更高阶的导数仍然应用链式法则求,注意符号和$\sin/\cos$,然后就是高一阶多乘一个$a$
于是我们可以得出另外两种函数套着$g(x)=ax+b$时的导数
$f(x)=e^x$求导还是$e^x$,所以$f(x)=e^x->h'(x)=f'(g(0))g'(0)=e^{g(0)}a=a*e^b$,然后再每高一阶就多乘一个$a$
$f(x)=x$求导是$1$,所以$f(x)=x->h'(x)=f'(g(0))g'(0)=a$,更高阶的导数都是零
然后是注意精度,每次修改先预处理一下$\sin,\cos$和$e$,不然精度会爆炸
最重要的是,LCT先不要写错=。=
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const double inf=1e9;
const int N=,K=;
double exa[N][K],ply[N][K],fac[N];
int siz[N],fth[N],son[N][],rev[N],stk[N];
double t2,t3; int n,m,t1,t4,top; char rd[];
void Prework()
{
fac[]=;
for(int i=;i<=;i++)
fac[i]=fac[i-]*i;
}
double Calc(int nde,double var)
{
double ret=,npw=;
for(int i=;i<=;i++)
ret+=ply[nde][i]*npw,npw*=var;//,printf("%lf ",ply[nde][i]);puts("");
return ret;
}
void Pushup(int nde)
{
int lson=son[nde][],rson=son[nde][];
for(int i=;i<=;i++)
ply[nde][i]=exa[nde][i]+ply[lson][i]+ply[rson][i];
}
void Release(int nde)
{
if(rev[nde])
{
int &lson=son[nde][],&rson=son[nde][];
rev[nde]^=,rev[lson]^=,rev[rson]^=;
swap(lson,rson);
}
}
bool Nottop(int nde)
{
int fa=fth[nde];
return nde==son[fa][]||nde==son[fa][];
}
void Rotate(int nde)
{
int fa=fth[nde],gr=fth[fa],isl=nde==son[fa][];
if(Nottop(fa)) son[gr][fa==son[gr][]]=nde;
fth[nde]=gr,fth[fa]=nde,fth[son[nde][isl]]=fa;
son[fa][isl^]=son[nde][isl],son[nde][isl]=fa;
Pushup(fa),Pushup(nde);
}
void Splay(int nde)
{
stk[top=]=nde;
for(int i=nde;Nottop(i);i=fth[i])
stk[++top]=fth[i];
while(top) Release(stk[top--]);
while(Nottop(nde))
{
int fa=fth[nde],gr=fth[fa];
if(Nottop(fa))
Rotate(((son[fa][]==nde)==(son[gr][]==fa))?fa:nde);
Rotate(nde);
}
Pushup(nde);
}
void Access(int nde)
{
int mem=nde,lst=;
while(nde)
{
Splay(nde),son[nde][]=lst;
Pushup(nde),lst=nde,nde=fth[nde];
}
Splay(mem);
}
void Turnroot(int nde)
{
Access(nde),rev[nde]^=;
}
void Split(int x,int y)
{
Turnroot(x),Access(y);
}
int Getroot(int nde)
{
Access(nde);
while(son[nde][])
nde=son[nde][];
Splay(nde);
return nde;
}
void Link(int x,int y)
{
Turnroot(x),fth[x]=y;
}
void Cut(int x,int y)
{
Split(x,y),fth[x]=son[y][]=,Pushup(y);
}
void Setfunc(int x,int t,double a,double b)//h(x)=f(g(x)),g(x)=ax+b
{
memset(exa[x],,sizeof exa[x]);
if(t==)
{
double o=,Sin=sin(b),Cos=cos(b);//f(x)=sin(x)
for(int i=;i<=;i++)//h'(x)=f'(g(x))g'(x)=cos(x),h''(x)=-sin(x)
exa[x][i]=((i%==)?Cos:Sin)*((i%<=)?:-)*o/fac[i],o*=a;
}
if(t==)
{
double o=,Exp=exp(b);//f(x)=e^x
for(int i=;i<=;i++)//h'(x)=f'(g(x))g'(x)=e^b*a
exa[x][i]=Exp*o/fac[i],o*=a;
}
if(t==)//f(x)=x
exa[x][]=b,exa[x][]=a;//h'(x)=f'(g(x))g'(x)=1*a=a
}
void Change(int x,int t,double a,double b)
{
Splay(x),Setfunc(x,t,a,b),Pushup(x);
}
double Query(int x,int y,double a)
{
Turnroot(x);
if(Getroot(y)==x)
{
Splay(y);
return Calc(y,a);
}
else return -inf;
}
int main()
{
Prework();
scanf("%d%d%s",&n,&m,rd);
for(int i=;i<=n;i++)
scanf("%d%lf%lf",&t1,&t2,&t3),Setfunc(i,t1,t2,t3);
while(m--)
{
scanf("%s",rd);
if(rd[]=='a') scanf("%d%d",&t1,&t4),Link(t1+,t4+);
else if(rd[]=='d') scanf("%d%d",&t1,&t4),Cut(t1+,t4+);
else if(rd[]=='m') scanf("%d%d%lf%lf",&t1,&t4,&t2,&t3),Change(t1+,t4,t2,t3);
else if(rd[]=='t')
{
scanf("%d%d%lf",&t1,&t4,&t2);
double qry=Query(t1+,t4+,t2);
if(qry<=-inf) puts("unreachable");
else printf("%.7f\n",qry);
}
// for(int i=1;i<=3;i++,puts(""))
// for(int j=0;j<=10;j++) printf("%lf ",ply[i][j]);
}
return ;
}
解题:THUWC 2017 在美妙的数学王国中畅游的更多相关文章
- 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT
[BZOJ5020][THUWC 2017]在美妙的数学王国中畅游 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数 ...
- BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)
Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数学的语言展现出来. 这印证了一句古老的名言: ...
- bzoj5020: [THUWC 2017]在美妙的数学王国中畅游
Description 数学王国中,每个人的智商可以用一个属于 [0,1]的实数表示.数学王国中有 n 个城市,编号从 0 到 n−1 ,这些城市由若干座魔法桥连接.每个城市的中心都有一个魔法球,每个 ...
- [THUWC 2017]在美妙的数学王国中畅游
bzoj5020 \[答案误差只要小于 10^{-7}\] 题解 Taylor展开式: \[若f(x)的n阶导数在[a, b]内连续,则f(x)在x_{0}\in[a, b]可表示为\] \[f(x) ...
- BZOJ5020 [THUWC 2017]在美妙的数学王国中畅游LCT
题意很明显是要用LCT来维护森林 难点在于如何处理函数之间的关系 我们可以根据题目给的提示关于泰勒展开的式子 将三种函数变成泰勒展开的形式 因为$x∈[0,1]$ 所以我们可以将三个函数在$x_0=0 ...
- bzoj 5020(洛谷4546) [THUWC 2017]在美妙的数学王国中畅游——LCT+泰勒展开
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5020 https://www.luogu.org/problemnew/show/P4546 ...
- loj2289 [THUWC 2017]在美妙的数学王国中畅游(LCT+Taylor展开)
link 题目大意: 你需要维护一个树 每个点都有个sin(ax+b)或exp(ax+b)或ax+b 你需要维护一些操作:连边.删边.修改某个点的初等函数.询问某条树链上所有函数带入某个值后权值和或不 ...
- bzoj 5020: [THUWC 2017]在美妙的数学王国中畅游【泰勒展开+LCT】
参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html --其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊 泰勒展开是到正无穷的,但是因 ...
- bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5020 https://loj.ac/problem/2289 题解 这个 appear 和 d ...
随机推荐
- Luogu P1196 [NOI2002]银河英雄传说
一年没写博客了(滑稽). 这道题很玄学,导致自己都有一个坑人的问题求解.如果有大佬有能力求帮助:https://www.luogu.org/discuss/show?postid=30231 再来讲一 ...
- MFC CTreeCtrl控件
知识点: 认识CTreeCtrl CTreeCtrl控件属性 CTreeCtrl添加根项 CTreeCtrl添加子项 一.CTreeCtrl控件属性 先设置CTreeCtrl的属性: Has Line ...
- STEAM 自动安装时提示C++ 安装不了等问题
[情况] 今天安装游戏, 安装时自动安装 Visual C++ 2015 x64 Minimum Runtime ....不成功, 提示网络源不可使用, 或者使用以下安装源 C:\ProgramDat ...
- 通过实例来理解paxos算法
背景 Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的”La”,此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有 ...
- 手撸orm框架
一 前言 1 我在实例化一个user对象的时候,可以user=User(name='lqz',password='123') 2 也可以 user=User() user['name']='lqz' ...
- Android Studio开发实用网站收集
重点 1.Android Studio 调试技巧-断点调试 http://blog.csdn.net/qq_32452623/article/details/53769708 2.android st ...
- jquery自动获取项目url路径
//很多时候我们需要使用当前项目路径,但是如果把项目路径写死,会带来很多不便,此时就需要自动获取项目路径.//我们可以根据jquery来进行自动获取项目路径,获取方法如下function getRoo ...
- UE4中Timeline的使用
UE4中经常需要一些和时间相联系的功能,例如在一段时间内完成一个动作,播放一段动画,或者只是单纯的延迟函数的执行时间,即调整事件的执行顺序.在UE4的蓝图自带函数中有一个很好用的函数可以完美地解决这些 ...
- 【LeetCode】数组--合并区间(56)
写在前面 老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组( ...
- idou老师教你学Istio :如何用istio实现监控和日志采集
大家都知道istio可以帮助我们实现灰度发布.流量监控.流量治理等功能.每一个功能都帮助我们在不同场景中实现不同的业务.那Istio是如何帮助我们实现监控和日志采集的呢? 这里我们依然以Bookinf ...