传送门

题意:反正就是一堆操作


LCT总是和玄学东西放在一起
我们不妨令$x_0=0.5$(其实取什么都是一样的,但是最好取在$[0,1]$的范围内),将其代入给出的式子,我们得到的$f(x)$的式子就是一个多项式了。
然后复习一下导数:
$(Cf(x))'=Cf'(x)$($C$为常数)
$sin'(x)=cos(x),cos'(x)=-sin(x),(e^x)'=e^x,C'=0 , (ax+b)'=a$
令$g(x)=u$,则$f[g(x)]' = f'(u) \times g'(x)$
有了这些式子就可以得到给出的三种函数的任意阶导数了。
但是显然我们不能把所有项的系数都算出来。因为在比较靠后的项中,阶乘的值很大,对答案造成的贡献就会小到忽略不计,所以我们可以取前面若干项,这里我取的是前$12$项。
然后用$LCT$维护这些项的系数和,每一次询问把链拿出来直接算就行了,难题变成裸题了qwq

 #include<bits/stdc++.h>
 #define ld long double
 //This code is written by Itst
 using namespace std;

 inline int read(){
     ;
     ;
     char c = getchar();
     while(c != EOF && !isdigit(c)){
         if(c == '-')
             f = ;
         c = getchar();
     }
     while(c != EOF && isdigit(c)){
         a = (a << ) + (a << ) + (c ^ ');
         c = getchar();
     }
     return f ? -a : a;
 }

 ;
 struct node{
     ld point[] , pre[] , a , b;
     ] , fa , type;
     bool mark;
 }Tree[MAXN];
 int N;
 ];

 inline bool nroot(int x){
     ] == x || Tree[Tree[x].fa].ch[] == x;
 }

 inline bool son(int x){
     ] == x;
 }

 inline ld calc(int type , int n , ld a , ld b){
     ld sum = ;
     switch(type){
     :
         ){
         :
             sum = sin(0.5 * a + b);
             break;
         :
             sum = cos(0.5 * a + b);
             break;
         :
             sum = -sin(0.5 * a + b);
             break;
         :
             sum = -cos(0.5 * a + b);
             break;
         }
         return sum * pow(a , n);
     :
         return pow(a , n) * exp(a * 0.5 + b);
     :
         switch(n){
         :
             return a * 0.5 + b;
         :
             return a;
         default:
             ;
         }
     }
 }

 inline void pushup(int x){
      ; i <=  ; ++i)
         Tree[x].point[i] = Tree[x].pre[i] + Tree[Tree[x].ch[]].point[i] + Tree[Tree[x].ch[]].point[i];
 }

 inline void getpre(int x){
      ; i <=  ; ++i)
         Tree[x].pre[i] = calc(Tree[x].type , i , Tree[x].a , Tree[x].b);
 }

 inline void ZigZag(int x){
     bool f = son(x);
     ];
     if(nroot(y))
         Tree[z].ch[son(y)] = x;
     Tree[x].fa = z;
     Tree[x].ch[f ^ ] = y;
     Tree[y].fa = x;
     Tree[y].ch[f] = w;
     if(w)
         Tree[w].fa = y;
     pushup(y);
     pushup(x);
 }

 inline void pushdown(int x){
     if(Tree[x].mark){
         Tree[Tree[x].ch[]].mark ^= ;
         Tree[Tree[x].ch[]].mark ^= ;
         Tree[x].mark = ;
         swap(Tree[x].ch[] , Tree[x].ch[]);
     }
 }

 void pushdown_all(int x){
     if(nroot(x))
         pushdown_all(Tree[x].fa);
     pushdown(x);
 }

 inline void Splay(int x){
     pushdown_all(x);
     while(nroot(x)){
         if(nroot(Tree[x].fa))
             ZigZag(son(x) == son(Tree[x].fa) ? Tree[x].fa : x);
         ZigZag(x);
     }
 }

 inline void access(int x){
      ; x ; y = x , x = Tree[x].fa){
         Splay(x);
         Tree[x].ch[] = y;
         pushup(x);
     }
 }

 inline int findroot(int x){
     access(x);
     Splay(x);
     pushdown(x);
     ])
         pushdown(x = Tree[x].ch[]);
     Splay(x);
     return x;
 }

 inline void makeroot(int x){
     access(x);
     Splay(x);
     Tree[x].mark ^= ;
 }

 inline void split(int x , int y){
     makeroot(x);
     access(y);
     Splay(y);
 }

 inline void link(int x , int y){
     makeroot(x);
     Tree[x].fa = y;
 }

 inline void cut(int x , int y){
     split(x , y);
     Tree[y].ch[] = Tree[x].fa = ;
     pushup(y);
 }

 inline void change(int x , int type , ld a , ld b){
     access(x);
     Splay(x);
     Tree[x].type = type;
     Tree[x].a = a;
     Tree[x].b = b;
     getpre(x);
     pushup(x);
 }

 int main(){
     freopen("4546.in" , "r" , stdin);
     freopen("4546.out" , "w" , stdout);
     N = read();
     int M = read();
     read();
      ; i <= N ; ++i){
         Tree[i].type = read();
         scanf("%Lf %Lf" , &Tree[i].a , &Tree[i].b);
         getpre(i);
     }
     while(M--){
         ld a , b , times , jc;
         int d , e;
         if(scanf("%s" , s) == EOF)
             ;
         ]){
         case 'a':
             d = read() + ;
             e = read() + ;
             link(d , e);
             break;
         case 'd':
             d = read() + ;
             e = read() + ;
             cut(d , e);
             break;
         case 'm':
             d = read() + ;
             e = read();
             scanf("%Lf %Lf" , &a , &b);
             change(d , e , a , b);
             break;
         case 't':
             d = read() + ;
             e = read() + ;
             scanf("%Lf" , &a);
             if(findroot(d) != findroot(e))
                 puts("unreachable");
             else{
                 split(d , e);
                 b = ;
                 times = jc = ;
                 a -= 0.5;
                  ; i <=  ; ++i){
                     b += times * Tree[e].point[i] / jc;
                     times *= a;
                     jc *= (i + );
                 }
                 printf("%.9Lf\n" , b);
             }
         }
     }
     ;
 }

Luogu4546 THUWC2017 在美妙的数学王国中畅游 LCT、泰勒展开的更多相关文章

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

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

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

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

  3. 【BZOJ5020】[LOJ2289]【THUWC2017】在美妙的数学王国中畅游 - LCT+泰勒展开

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

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

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

  5. 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游 LCT 泰勒展开

    题目大意 给你一棵树,每个点有一个函数\(f(x)\) 正弦函数 \(\sin(ax+b) (a\in[0,1],b\in[0,\pi],a+b\in[0,\pi])\) 指数函数 \(e^{ax+b ...

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

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

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

    题面 LOJ传送门 思路 这里很重要 它提示我们,把给定的三个函数泰勒展开,并用LCT维护每一项泰勒展开式的值,维护十几项就满足了题目的精度要求 我们考虑一个函数在0位置的泰勒展开 $f(x)=\su ...

  8. 「LOJ 2289」「THUWC 2017」在美妙的数学王国中畅游——LCT&泰勒展开

    题目大意: 传送门 给一个动态树,每个节点上维护一个函数为$f(x)=sin(ax+b)$.$f(x)=e^{ax+b}$.$f(x)=ax+b$中的一个. 支持删边连边,修改节点上函数的操作. 每次 ...

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

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

随机推荐

  1. putty之pscp上传文件

    控制台下打开pscp可执行文件 命令 >pscp -i 证书名 -r 要上传的文件 root@服务器路径:/opt

  2. Linux 磁盘分区方案简析

    Linux 磁盘分区方案简析 by:授客 QQ:1033553122   磁盘分区 任何硬盘在使用前都要进行分区.硬盘的分区有两种类型:主分区和扩展分区.一个硬盘上最多只能有4个主分区,其中一个主分区 ...

  3. MVC与单元测试实践之健身网站(七)-添加计划

    ​计划的制定涉及到周期-动作包-动作的关联操作,在上一篇<计划的添加与重置>完成了周期的设置.动作包的添加,现在要完成的是动作的添加操作. 一 具体功能 a) 在选定了一个大周期具有的天数 ...

  4. android系统通过图片绝对路径获取URI的三种方法

    最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1.3的系统上都是可用的. 1.将所有的图片路径取出,遍历比较找到需要的路径 ...

  5. JMeter—后置处理器(十)

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第五节后置处理器后置处理器是用来处理采样器发送的请求后得到的响应数据 一.Debug PostProcessor ...

  6. forfiles命令详解

    目录复制命令: xcopy   //server/bak/*.*    d:/serverbak /s /e /v /c / d /y /h             at 05:30 shutdown ...

  7. What To Do When MySQL Runs Out of Memory: Troubleshooting Guide

    In this article, I will show you how to use the new version of MySQL (5.7+) and how to troubleshoot ...

  8. 理解inode 以及 软链接和硬链接概念区分

    inode简单理解 本文来源自网络文章,并针对文章内容加以批注和修改.希望能帮到你! 一. 磁盘设备 说到inode,首先必须要提及下<操作系统>中磁盘存储器的管理一节.磁盘设备是一种相当 ...

  9. webpack打包去掉console.log打印与debugger调试

    如图,找到build/webpack.prod.conf.js 在 UglifyJsPlugin 插件下添加下列代码 drop_debugger: true, drop_console: true

  10. python第五十三课——time模块

    1.time.datatime.calendar模块的引入讲解(重视) Unix时间戳(timestamp):返回的是数值类型数据(float值), 概念:记录了从1970年00点00分00秒至今的秒 ...