题面

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

在 @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. tkinter 对键盘和鼠标事件的处理

    鼠标事件 <ButtonPress-n> <Button-n> <n> 鼠标按钮n被按下,n为1左键,2中键,3右键 <ButtonRelease-n> ...

  2. 解决Git在添加ignore文件之前就提交了项目无法再过滤问题

    由于未添加ignore文件造成提交的项目很大(包含生成的二进制文件).所以我们可以将编译生成的文件进行过滤,避免添加到版本库中了. 首先为避免冲突需要先同步下远程仓库 $ git pull 在本地项目 ...

  3. 上google的方法

    最近Google又被墙了....哎,纠结..... 说实话,咱都是良民,爱党爱国,真心不想干啥,只想查点资料的,输入google都上不去了. 方法: 1. FQ.很麻烦,有时候改来改去也容易出错,速度 ...

  4. 小知识点--crontab

    前言 这两周学了很多东西,还把golang语言基本掌握了,收获还是挺多的.在做安全的过程中,有很多需要定时执行的任务,比如抓取主机数量,端口数据等,这都逃不开linux中的crontab命令,今天分享 ...

  5. Markdown之语法入门篇

    Markdown语法入门 一.什么是Markdown语言 我相信有很多小伙伴没有听说过Markdown语言.的确,对于一般人来说,有word足够了.但是有这么一群人,受够了word那糟糕的排版方式,需 ...

  6. Boyer and Moore Fast majority vote algorithm(快速选举算法)

    问题来来自于leetcode上的一道题目,https://leetcode.com/problems/majority-element/,大意是是找出一个数组中,出现次数超过一个半的数字,要求是O(n ...

  7. 之前专门为IE6、7开发的网站如何迁移到IE10及可能遇到的问题和相应解决方案汇总

    由于周末,早晨起来的比较晚,打开博客园转转,看到这样的一篇博文,内容大致是说,服务器由于升级导致的用Asp.NET的UpdatePanel写的下拉联动失效了,这让我联想到了前段时间看到的一份资料,关于 ...

  8. SpringBoot入门学习记录(一)

    最近,SpringBoot.SpringCloud.Dubbo等框架非常流行,作为Coder里的一名小学生,借着改革开放的东风,自然也是需要学习学习的,于是将学习经历记录于此,以备日后查看. 官网:h ...

  9. C# List left join

    public class Test1 { public int ID { get; set; } public string Name { get; set; } } public class Tes ...

  10. B1015 德才论 (25 分)

    19/25 #include<bits/stdc++.h> using namespace std; /* 1.de>=H && cai>=H 2.de> ...