我数学是真的菜!!

清华光用数学知识就把我吊起来打,我还是太菜了


题解

如果每座城市的 $f$ 都是 $3$,维护一下树的路径上的 $\sum a,\space \sum b$ 即可。

其实就是维护一次项和常数项。由于只有两项,所以很好维护。

这样维护的原理是多项式(这里是一次函数)可以合并,所以要求一条路径的答案,只要把 $x$ 代入这条路径上所有点合并后的多项式即可。

由于前三个操作需要动态树,套 $LCT$ 即可(我强行再学一遍 $LCT$……)

但 $sin(ax+b)$ 和 $e(ax+b)$ 都不是多项式,没法合并啊!(也就是说我们只能暴力求路径上每个点的答案再求和)

然后思考一下,看看题,发现底部给了你一个泰勒展开的公式。

泰勒展开是什么?就是通过求导数,把一个奇怪的函数展开成多项式。这个多项式的项数无穷多,但我们可以只保留前面若干项,保留的项数越多,这个多项式的结果就越接近原函数的结果。(因为越往后的项,值越接近无穷小,小到 $10^{-???}$ 次方的那种,可以忽略不计)

再看一下输出要求,答案只要精确到 $10^{-7}$ 就行,然后应该就明白要干什么了……

泰勒公式:$$f(x)=\sum_{i=0}^{n} \frac{f^{(i)}(x_0)*(x-x_0)^i}{i!}$$

其中 $f^{(i)}(x)$ 表示函数 $f(x)$ 的 $i$ 阶导。

这个公式的 $x_0$  是随便取都可以的,没有区别……只是让你随便代进去一个数而已。

但是 $x_0=0$ 的时候最方便,上式就变成了 $$f(x)=\sum_{i=0}^{n} \frac{f^{(i)}(0)*x^i}{i!}$$

而且这就使函数 $f^{(i)}$ 的自变量 $x=0$ ,也就是说不用管 $x$ 的系数 $a$ 了,在维护时只需要用到它的系数 $b$。下文会再提到。

然后复习一下怎么求导吧……(雾)

指数函数求导:$$(a^x)'=a^x*\ln a$$

($ln\space a$ 代表取自然对数,即底数为 $e$)

特殊的:$$(e^x)'=e^x$$

三角函数求导:$$(\sin x)'=\cos x$$

$$(\cos x)'=-\sin x$$

$$(-\sin x)'=-\cos x$$

$$(-\cos x)'=\sin x$$

四个一循环,其实就是圆上的四个象限。

复合函数的求导公式: $$[f(g(x))]'=g'(x)\times f'(g(x))$$

这道题中,函数 $f$ 就是第一问和第二问要求的那两个式子本身,函数 $g$  则是 $g(x)=ax+b$。

对于第二问,$f(x)=e^{ax+b}$,则 $f(g(x))=e^{ax+b}$ 求一次导后得到 $$[f(g(x))]'=a\times e^{ax+b}$$

然后再对 $[f(g(x))]'$ 求导,当时我就有一个没搞明白的地方:为什么 $a$ 求导后不是 $0$?它不是常数项吗?

后来我才发现,$[f(g(x))]'$ 中的 $a$ 不是常数项,是与变量 $x$ 有关的系数!注意它乘的 $e^{ax+b}$ 里是有个 $x$ 的。

所以再对 $[f(g(x))]'$ 求导,也就是对 $f(g(x))$ 求二次导时不对若干次项的系数 $a$ 求导,直接乘上即可,重点是对 $e^{ax+b}$ 求导。所以 $$[f(g(x))]''=a^2\times e^{ax+b}$$

以此类推,$$[f(g(x))]^{(n)}=a^n\times e^{ax+b}$$

对于第一问的三角函数求导同理,$$\sin'(ax+b)=a \cos(ax+b)$$

$$\sin''(ax+b)=-a^2 \sin(ax+b)$$

$$\sin'''(ax+b)=-a^3 \cos(ax+b)$$

$$\sin''''(ax+b)=a^4 \sin(ax+b)$$

以此类推的循环。

由于我们之前让自变量 $x=x_0=0$ 了,所以实际维护以上所有信息时不用算和 $x$ 相关的项(而且输入的 $x$ 不唯一,本身就没法维护。这就是为什么让那个随意值 $x_0$ 为 $0$ 会很方便)。

 #include<bits/stdc++.h>
#define ll long long
#define rep(i,x,y) for(int i=x;i<=y;++i)
#define N 200002
#define M 16
using namespace std;
inline int read(){
int x=; bool f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=;
for(; isdigit(c);c=getchar()) x=(x<<)+(x<<)+(c^'');
if(f) return x;
return -x;
}
int n,m,k,f[N];
char type[];
double jc[N],sum[N][M],a[N],b[N];
int ch[N][],fa[N];
bool rev[N]; ;inline bool son(int x){return ch[fa[x]][]==x;}
inline bool isroot(int x){return ch[fa[x]][]!=x && ch[fa[x]][]!=x;}
inline void reverse(int x){
if(!x) return;
swap(ch[x][],ch[x][]), rev[x]^=;
}
void pushup(int x){
rep(i,,M-) sum[x][i]=sum[ch[x][]][i]+sum[ch[x][]][i];
if(f[x]==){
double val=,Sin=sin(b[x]),Cos=cos(b[x]);
for(int i=;i<M;i+=){
sum[x][i]+=Sin*val, val*=a[x];
sum[x][i+]+=Cos*val, val*=a[x];
sum[x][i+]-=Sin*val, val*=a[x];
sum[x][i+]-=Cos*val, val*=a[x];
}
}
else if(f[x]==){
double val=exp(b[x]); sum[x][]+=val;
for(int i=;i<M;++i)
val*=a[x], sum[x][i]+=val;
}
else
sum[x][]+=b[x], sum[x][]+=a[x];
}
void pushdown(int x){
if(!rev[x]) return;
reverse(ch[x][]), reverse(ch[x][]), rev[x]=;
}
void rotate(int x){
int f=fa[x], g=fa[f], c=son(x);
ch[f][c]=ch[x][c^];
if(ch[f][c]) fa[ch[f][c]]=f;
fa[x]=g;
if(!isroot(f)) ch[g][son(f)]=x;
ch[x][c^]=f, fa[f]=x, pushup(f);
}
int stk[N],top;
void splay(int x){
stk[++top]=x;
for(int i=x;!isroot(i);i=fa[i]) stk[++top]=fa[i];
while(top) pushdown(stk[top--]);
for(;!isroot(x);rotate(x))
if(!isroot(fa[x])) son(x)^son(fa[x]) ? rotate(x) : rotate(fa[x]);
pushup(x);
}
void access(int x){
for(int y=; x; y=x,x=fa[x])
splay(x), ch[x][]=y, pushup(x); }
void makeroot(int x){
access(x), splay(x), reverse(x);
}
int findroot(int x){
access(x), splay(x);
while(ch[x][]) x=ch[x][];
splay(x); return x;
}
void split(int x,int y){
makeroot(x), access(y), splay(y);
}
void link(int x,int y){
makeroot(x), fa[x]=y;
}
void cut(int x,int y){
split(x,y), ch[y][]=fa[x]=;
} inline void getJc(){
jc[]=jc[]=;
rep(i,,M-) jc[i]=jc[i-]*i;
}
int main(){
getJc();
n=read(),m=read();
scanf("%s",type);
rep(i,,n) scanf("%d %lf %lf",&f[i],&a[i],&b[i]);
while(m--){
int u,v,ff;
double aa,bb,x,IQ,ans;
char s[];
scanf("%s",s);
if(s[]=='a'){
u=read()+,v=read()+;
link(u,v);
}
else if(s[]=='d'){
u=read()+,v=read()+;
cut(u,v);
}
else if(s[]=='m'){
scanf("%d %d %lf %lf",&u,&ff,&aa,&bb);
++u;
makeroot(u);
f[u]=ff, a[u]=aa, b[u]=bb;
pushup(u);
}
else{
scanf("%d %d %lf",&u,&v,&IQ);
x=, ++u, ++v;
if(findroot(u)^findroot(v)){
printf("unreachable\n");
continue;
}
split(u,v);
ans=;
rep(i,,M-)
ans+=sum[v][i]*x/jc[i], x*=IQ;
printf("%.8e\n",ans);
}
}
return ;
}

如果你数学学得好,这题就是个 $LCT$ 裸题(前提是你能熟练秒切 $LCT$)

然而裸题效果对我明显无效

【THUWC2017】在美妙的数学王国中畅游(bzoj5020)的更多相关文章

  1. [THUWC2017]在美妙的数学王国中畅游

    [THUWC2017]在美妙的数学王国中畅游 e和sin信息不能直接合并 泰勒展开,大于21次太小,认为是0,保留前21次多项式即可 然后就把e,sin ,kx+b都变成多项式了,pushup合并 上 ...

  2. [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(LCT)

    5020: [THUWC 2017]在美妙的数学王国中畅游 Time Limit: 80 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 323  ...

  3. Luogu4546 THUWC2017 在美妙的数学王国中畅游 LCT、泰勒展开

    传送门 题意:反正就是一堆操作 LCT总是和玄学东西放在一起我们不妨令$x_0=0.5$(其实取什么都是一样的,但是最好取在$[0,1]$的范围内),将其代入给出的式子,我们得到的$f(x)$的式子就 ...

  4. [THUWC2017]在美妙的数学王国中畅游 LCT+泰勒展开+求导

    p.s. 复合函数求导时千万不能先带值,再求导. 一定要先将符合函数按照求导的规则展开,再带值. 设 $f(x)=g(h(x))$,则对 $f(x)$ 求导: $f'(x)=h'(x)g'(h(x)) ...

  5. [LOJ2289][THUWC2017]在美妙的数学王国中畅游:Link-Cut Tree+泰勒展开

    分析 又有毒瘤出题人把数学题出在树上了. 根据泰勒展开,有: \[e^x=1+\frac{1}{1!}x+\frac{1}{2!}x^2+\frac{1}{3!}x^3+...\] \[sin(x)= ...

  6. 题解 洛谷 P4546 【[THUWC2017]在美妙的数学王国中畅游】

    首先发现有连边和删边的操作,所以我们肯定要用\(LCT\)来进行维护. 接下来考虑如何进行\(LCT\)上的信息合并. \(f=1\),则函数为\(f(x)=sin(ax+b)\) \(f=2\),则 ...

  7. Luogu P4546 [THUWC2017]在美妙的数学王国中畅游

    题意 题意奇奇怪怪,这里就不写了. \(\texttt{Data Range:}1\leq n\leq 10^5,1\leq m\leq 2\times 10^5\) 题解 为什么你们都是卡在数学方面 ...

  8. 洛谷P4546 [THUWC2017]在美妙的数学王国中畅游 [LCT,泰勒展开]

    传送门 毒瘤出题人卡精度-- 思路 看到森林里加边删边,容易想到LCT. 然而LCT上似乎很难实现往一条链里代一个数进去求和,怎么办呢? 善良的出题人在下方给了提示:把奇怪的函数泰勒展开搞成多项式,就 ...

  9. P4546 [THUWC2017]在美妙的数学王国中畅游

    如果只有第3个操作,那么这就是个sd题,随便lct搞搞就过去了 然后就是一个神仙东西 taylor公式 我不会,看gsy博客https://www.cnblogs.com/zhoushuyu/p/81 ...

  10. BZOJ5020 THUWC2017在美妙的数学王国中畅游(LCT)

    明摆着的LCT,问题在于如何维护答案.首先注意到给出的泰勒展开式,并且所给函数求导非常方便,肯定要用上这玩意.容易想到展开好多次达到精度要求后忽略余项.因为x∈[0,1]而精度又与|x-x0|有关,当 ...

随机推荐

  1. 什么样子的WordPress网站更受搜索引擎欢迎

    网站的导航功能对于搜索引擎而言是非常重要的 网站的导航功能对于帮助用户迅速找到他们想要的内容来说是很重要的.它对帮助搜索引擎理解该网站有哪些重要内容同样非常重要.虽然百度的搜索结果都是指向每一个特定的 ...

  2. tcp、http和socket的区别

    本文原链接:https://www.jianshu.com/p/88d69454bdde tcp.http和socket的区别 一:tcp协议 tcp协议属于传输层协议(UDP也属于传输层协议,但是U ...

  3. Java字符串池(String Pool)深度解析(转)

    出自  http://www.cnblogs.com/fangfuhai/p/5500065.html 在工作中,String类是我们使用频率非常高的一种对象类型.JVM为了提升性能和减少内存开销,避 ...

  4. 怎样将Oracle数据库设置为归档模式及非归档模式

    怎样将Oracle数据库设置为归档模式及非归档模式 1.Oracle日志分类 分三大类: Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和 redo lo ...

  5. C#_接口基础学习

    参考:https://www.cnblogs.com/hamburger/p/4681681.html

  6. Python数据分析【炼数成金15周完整课程】

    点击了解更多Python课程>>> Python数据分析[炼数成金15周完整课程] 课程简介: Python是一种面向对象.直译式计算机程序设计语言.也是一种功能强大而完善的通用型语 ...

  7. 【android】【android studio】修改emulator的本地化环境

    Changing the emulator locale from the adb shell To change the locale in the emulator by using the ad ...

  8. python向上取整 向下取整

    向上取整 ceil() 函数返回数字的向上取整整数,就是返回大于等于变量的最近的整数. ceil()是不能直接访问的,需要导入 math 模块. import math math.ceil( x ) ...

  9. stm32L0工程建立(HAL+IAR,无cubemx)

    https://files.cnblogs.com/files/CodeWorkerLiMing/STM32HAL%E5%BA%93%E5%AD%A6%E4%B9%A0%E2%80%94%E5%B7% ...

  10. Wannafly挑战赛21 机器人

    从前在月球上有一个机器人.月球可以看作一个 n*m 的网格图,每个格子有三种可能:空地,障碍,机器人(有且仅有一个),现在地面指挥中心想让机器人在月球上行走,每次可以发送一个指令,为 U-往上走.D- ...