题面

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

在 @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. 20155209 林虹宇 Exp 8 Web基础

    Exp 8 Web基础 Web前端HTML 正常安装.启停Apache kali本机自带apache,上个实验已经使用过,直接使用 查看80端口. 127.0.0.1 编写一个含有表单的html 在浏 ...

  2. 20155213免考项目——简易的HIDAttack

    20155213免考项目--简易的HIDAttack 听5214说他做不出来自己的免考项目,于是就转向bof进阶,并且成功做出了64位的ROP攻击...... 既然如此,那我就再做一个吧,但都已经期末 ...

  3. 20155306 白皎 0day漏洞——漏洞的复现

    一.Ubuntu16.04 (CVE-2017-16995) 1.漏洞概述 Ubuntu最新版本16.04存在本地提权漏洞,该漏洞存在于Linux内核带有的eBPF bpf(2)系统调用中,当用户提供 ...

  4. 汇编 inc 和 dec 指令

    知识点: inc 加1指令 dec 减1指令 一.加一指令inc inc a 相当于 add a, //i++ 优点 速度比sub指令快,占用空间小 这条指令执行结果影响AF.OF.PF.SF.Z ...

  5. 2_C语言中的数据类型 (九)数组

    1          数组 1.1       一维数组定义与使用 int array[10];//定义一个一维数组,名字叫array,一共有10个元素,每个元素都是int类型的 array[0] = ...

  6. chrome播放m3u8視頻失败

    由于项目后台需要播放m3u8视频,但此视频格式在移动端和Safari支持比较友善但是PC浏览器中都不太尽如人意,所以想在Chrome中播放只能借助第三方插件来播放. 有一款Video.js插件极大的简 ...

  7. python 连接 hive 的 HiveServer2 的配置坑

    环境: hadoop 2.7.6 hive 2.3.4 Hive 的 thirft 启动: hadoop 单机或者集群需要: 启动 webhdfs 修改 hadoop 的代理用户 <proper ...

  8. openstack horizon 开发第三天

    工作流:工作流是带有选项的复杂表单,每个工作流必须包含扩展Workflow, Step和的类Action1. url.py 路由处理 RESOURCE_CLASS = r'^(?P<resour ...

  9. 审评(HelloWorld团队)

    炸弹人:我觉得炸弹人的构想很不错,很像以前玩的qq堂,不过上课时讲的不够深入,我没有找到项目的思路,项目的介绍也很粗糙,后面说的目标很大,希望你可以实现,我觉得越多的功能,就意味着越多的工作量,总的来 ...

  10. 实现文字左右滚动 javascript

    参考链接:http://www.86y.org/art_detail.aspx?id=587 代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...