我数学是真的菜!!

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


题解

如果每座城市的 $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$ 会很方便)。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define rep(i,x,y) for(int i=x;i<=y;++i)
  4. #define N 200002
  5. #define M 16
  6. using namespace std;
  7. inline int read(){
  8. int x=; bool f=; char c=getchar();
  9. for(;!isdigit(c);c=getchar()) if(c=='-') f=;
  10. for(; isdigit(c);c=getchar()) x=(x<<)+(x<<)+(c^'');
  11. if(f) return x;
  12. return -x;
  13. }
  14. int n,m,k,f[N];
  15. char type[];
  16. double jc[N],sum[N][M],a[N],b[N];
  17. int ch[N][],fa[N];
  18. bool rev[N];
  19.  
  20. ;inline bool son(int x){return ch[fa[x]][]==x;}
  21. inline bool isroot(int x){return ch[fa[x]][]!=x && ch[fa[x]][]!=x;}
  22. inline void reverse(int x){
  23. if(!x) return;
  24. swap(ch[x][],ch[x][]), rev[x]^=;
  25. }
  26. void pushup(int x){
  27. rep(i,,M-) sum[x][i]=sum[ch[x][]][i]+sum[ch[x][]][i];
  28. if(f[x]==){
  29. double val=,Sin=sin(b[x]),Cos=cos(b[x]);
  30. for(int i=;i<M;i+=){
  31. sum[x][i]+=Sin*val, val*=a[x];
  32. sum[x][i+]+=Cos*val, val*=a[x];
  33. sum[x][i+]-=Sin*val, val*=a[x];
  34. sum[x][i+]-=Cos*val, val*=a[x];
  35. }
  36. }
  37. else if(f[x]==){
  38. double val=exp(b[x]); sum[x][]+=val;
  39. for(int i=;i<M;++i)
  40. val*=a[x], sum[x][i]+=val;
  41. }
  42. else
  43. sum[x][]+=b[x], sum[x][]+=a[x];
  44. }
  45. void pushdown(int x){
  46. if(!rev[x]) return;
  47. reverse(ch[x][]), reverse(ch[x][]), rev[x]=;
  48. }
  49. void rotate(int x){
  50. int f=fa[x], g=fa[f], c=son(x);
  51. ch[f][c]=ch[x][c^];
  52. if(ch[f][c]) fa[ch[f][c]]=f;
  53. fa[x]=g;
  54. if(!isroot(f)) ch[g][son(f)]=x;
  55. ch[x][c^]=f, fa[f]=x, pushup(f);
  56. }
  57. int stk[N],top;
  58. void splay(int x){
  59. stk[++top]=x;
  60. for(int i=x;!isroot(i);i=fa[i]) stk[++top]=fa[i];
  61. while(top) pushdown(stk[top--]);
  62. for(;!isroot(x);rotate(x))
  63. if(!isroot(fa[x])) son(x)^son(fa[x]) ? rotate(x) : rotate(fa[x]);
  64. pushup(x);
  65. }
  66. void access(int x){
  67. for(int y=; x; y=x,x=fa[x])
  68. splay(x), ch[x][]=y, pushup(x);
  69.  
  70. }
  71. void makeroot(int x){
  72. access(x), splay(x), reverse(x);
  73. }
  74. int findroot(int x){
  75. access(x), splay(x);
  76. while(ch[x][]) x=ch[x][];
  77. splay(x); return x;
  78. }
  79. void split(int x,int y){
  80. makeroot(x), access(y), splay(y);
  81. }
  82. void link(int x,int y){
  83. makeroot(x), fa[x]=y;
  84. }
  85. void cut(int x,int y){
  86. split(x,y), ch[y][]=fa[x]=;
  87. }
  88.  
  89. inline void getJc(){
  90. jc[]=jc[]=;
  91. rep(i,,M-) jc[i]=jc[i-]*i;
  92. }
  93. int main(){
  94. getJc();
  95. n=read(),m=read();
  96. scanf("%s",type);
  97. rep(i,,n) scanf("%d %lf %lf",&f[i],&a[i],&b[i]);
  98. while(m--){
  99. int u,v,ff;
  100. double aa,bb,x,IQ,ans;
  101. char s[];
  102. scanf("%s",s);
  103. if(s[]=='a'){
  104. u=read()+,v=read()+;
  105. link(u,v);
  106. }
  107. else if(s[]=='d'){
  108. u=read()+,v=read()+;
  109. cut(u,v);
  110. }
  111. else if(s[]=='m'){
  112. scanf("%d %d %lf %lf",&u,&ff,&aa,&bb);
  113. ++u;
  114. makeroot(u);
  115. f[u]=ff, a[u]=aa, b[u]=bb;
  116. pushup(u);
  117. }
  118. else{
  119. scanf("%d %d %lf",&u,&v,&IQ);
  120. x=, ++u, ++v;
  121. if(findroot(u)^findroot(v)){
  122. printf("unreachable\n");
  123. continue;
  124. }
  125. split(u,v);
  126. ans=;
  127. rep(i,,M-)
  128. ans+=sum[v][i]*x/jc[i], x*=IQ;
  129. printf("%.8e\n",ans);
  130. }
  131. }
  132. return ;
  133. }

如果你数学学得好,这题就是个 $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. 119. Pascal's Triangle II@python

    Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle. Note t ...

  2. Check for Palindromes-freecodecamp算法题目

    Check for Palindromes(检查回文字符串) 要求 给定的字符串是回文,返回true,反之,返回false.(如果一个字符串忽略标点符号.大小写和空格,正着读和反着读一模一样,那么这个 ...

  3. 【转】浅谈对主成分分析(PCA)算法的理解

    以前对PCA算法有过一段时间的研究,但没整理成文章,最近项目又打算用到PCA算法,故趁热打铁整理下PCA算法的知识.本文观点旨在抛砖引玉,不是权威,更不能尽信,只是本人的一点体会. 主成分分析(PCA ...

  4. Linux基础学习-使用vsftpd服务传输文件

    使用vsftpd服务传输文件 1 安装vsftpd [root@qdlinux ~]# yum install vsftpd Loaded plugins: product-id, search-di ...

  5. 【linux】【安全】服务器安全建议

    引用自 <鸟哥的linux私房菜-服务器篇>  http://cn.linux.vbird.org/linux_server/0210network-secure_1.php 建立完善的登 ...

  6. Tomcat上传文件报错:returned a response status of 403 Forbidden

    出现这样的错误是没有权限对服务器进行写操作.需要在这个项目所在的tomcat中配置可写操作即可: 在tomcat的web.xml添加下面代码: <init-param><param- ...

  7. JDK1.8 HashMap$TreeNode.balanceInsertion 红黑树平衡插入

    红黑树介绍 1.节点是红色或黑色. 2.根节点是黑色. 3.每个叶子节点都是黑色的空节点(NIL节点). 4 每个红色节点的两个子节点都是黑色.(从每个叶子到根的所有路径上不能有两个连续的红色节点) ...

  8. js---JSONP原理及使用

    极简解释: 利用<script>标签没有跨域限制的“漏洞”(历史遗迹啊)来达到与第三方通讯的目的.当需要通讯时,本站脚本创建一个<script>元素,地址指向第三方的API网址 ...

  9. luogu2564 [SCOI2009]生日礼物

    排序枚举左端点,则右端点必定不降 #include <algorithm> #include <iostream> #include <cstring> #incl ...

  10. win7 64位旗舰版下载

    http://www.itqnh.com/deepin/win7-64.html mac   windows https://help.apple.com/bootcamp/assistant/6.0 ...