题面

_“数字和数学规律主宰着这个世界。”_

在 @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 在美妙的数学王国中畅游的更多相关文章

  1. 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT

    [BZOJ5020][THUWC 2017]在美妙的数学王国中畅游 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数 ...

  2. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)

    Description 数字和数学规律主宰着这个世界.   机器的运转,   生命的消长,   宇宙的进程,   这些神秘而又美妙的过程无不可以用数学的语言展现出来.   这印证了一句古老的名言:   ...

  3. bzoj5020: [THUWC 2017]在美妙的数学王国中畅游

    Description 数学王国中,每个人的智商可以用一个属于 [0,1]的实数表示.数学王国中有 n 个城市,编号从 0 到 n−1 ,这些城市由若干座魔法桥连接.每个城市的中心都有一个魔法球,每个 ...

  4. [THUWC 2017]在美妙的数学王国中畅游

    bzoj5020 \[答案误差只要小于 10^{-7}\] 题解 Taylor展开式: \[若f(x)的n阶导数在[a, b]内连续,则f(x)在x_{0}\in[a, b]可表示为\] \[f(x) ...

  5. BZOJ5020 [THUWC 2017]在美妙的数学王国中畅游LCT

    题意很明显是要用LCT来维护森林 难点在于如何处理函数之间的关系 我们可以根据题目给的提示关于泰勒展开的式子 将三种函数变成泰勒展开的形式 因为$x∈[0,1]$ 所以我们可以将三个函数在$x_0=0 ...

  6. bzoj 5020(洛谷4546) [THUWC 2017]在美妙的数学王国中畅游——LCT+泰勒展开

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5020 https://www.luogu.org/problemnew/show/P4546 ...

  7. loj2289 [THUWC 2017]在美妙的数学王国中畅游(LCT+Taylor展开)

    link 题目大意: 你需要维护一个树 每个点都有个sin(ax+b)或exp(ax+b)或ax+b 你需要维护一些操作:连边.删边.修改某个点的初等函数.询问某条树链上所有函数带入某个值后权值和或不 ...

  8. bzoj 5020: [THUWC 2017]在美妙的数学王国中畅游【泰勒展开+LCT】

    参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html --其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊 泰勒展开是到正无穷的,但是因 ...

  9. bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5020 https://loj.ac/problem/2289 题解 这个 appear 和 d ...

随机推荐

  1. 20155204 2016-2017-2 《Java程序设计》第1周学习总结

    20155204 2016-2017-2 <Java程序设计>第1周学习总结 一.学习考核方式,理解成绩构成 首先是100分的构成,主要分为周考的总计60,实验的15分,团队项目(博客报告 ...

  2. python变量名感悟

    我感悟的是python的变量名其实就可以理解为C/C++中的指针! 1.python的变量在使用之前必须赋值,就像指针在使用之前不能为空. 2.python的内存可以用del释放,C++可以用dele ...

  3. python 回溯法 记录

    一直不是太理解回溯法,这几天集中学习了一下,记录如下. 回溯法有"通用的解题法"之称. 1.定义:  也叫试探法,它是一种系统地搜索问题的解的方法. 2.基本思想:  从一条路往前 ...

  4. Qt程序修改Ubuntu系统时间

    QString str = QString("sudo date -s %1/%2/%3").arg(iMonth).arg(iDay).arg(iYear); system(st ...

  5. [APIO2015]巴厘岛的雕塑[按位贪心+dp]

    题意 给你长度为 \(n\) 的序列,要求分成 \(k\) 段连续非空的区间,求所有区间和的 \(or\) 最小值. 分析 定义 \(f_{i,j}\) 表示前 \(i\) 个点分成 \(j\) 段的 ...

  6. Asp.Net_优化

    ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库 ...

  7. FME Cloud 账号申请流程

    第一步,访问SAFE的FME Cloud注册页,官网明确表态,如果你是一个新的FME Cloud用户,你可以免费获得一个初级版.地址:https://console.fmecloud.safe.com ...

  8. Linux删除多余内核

    查看已安装内核 sudo dpkg --get-selections |grep linux-image 查看当前内核 uname -r 卸载内核 sudo apt-get remove 内核名称 配 ...

  9. (转载)利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较) 置顶

    原文链接:https://blog.csdn.net/qq_25352981/article/details/46914837#commentsedit 本文目标是通过使用SIFT和RANSAC算法, ...

  10. [2017BUAA软工助教]结对项目小结

    2017BUAA结对项目小结 一.作业链接 http://www.cnblogs.com/jiel/p/7604111.html 二.评分细则 1.注意事项 按时间完成并提交--正常评分 晚交一周以内 ...