题面

LOJ传送门

思路

这里很重要

它提示我们,把给定的三个函数泰勒展开,并用LCT维护每一项泰勒展开式的值,维护十几项就满足了题目的精度要求

我们考虑一个函数在0位置的泰勒展开

$f(x)=\sum_{i=0}^{\infty} \frac{x^i f^{(i)}(0)}{i!}$

发现后面式子里面的$\frac{xi}{x!}$可以留到询问时候处理,我们只需要维护$\sum_{i=0}{\infty} f^{(i)}(0)$即可

对于$f(x)=sin(ax+b)$,其导函数如下:

$f{(4n)}(x)=a{4n}sin(ax+b)$

$f{(4n+1)}(x)=a{4n+1}cos(ax+b)$

$f{(4n+2)}(x)=-a{4n+2}sin(ax+b)$

$f{(4n+3)}(x)=-a{4n+3}cos(ax+b)$

对于$f(x)=e^{ax+b}$,其导函数如下:

$f{(n)}(x)=a{n}e^{ax+b}$(其实就是乘了一个$a$的幂)

对于$f(x)=ax+b$,其一阶导数为$f'(x)=a$,没有更高阶导数

所以,我们在$x=0$的位置泰勒展开这三个函数,并且LCT维护、询问即可

详见代码

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cassert>
#include<cmath>
#define ll long double
using namespace std;
inline int read(){
int re=0,flag=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') flag=-1;
ch=getchar();
}
while(isdigit(ch)) re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
int fa[200010],ch[200010][2],rev[200010];
long double w[200010][15],sum[200010][15],a[200010],b[200010];int tp[200010];
//tp={1,2,3} --> {sin,exp,ax+b}
void calc(int cur){//这里是计算泰勒展开值
//注意因为我们取的位置是x=0,所以展开以后保存的函数自变量取值为0a+b=b
ll A=a[cur],B=b[cur],*val=w[cur];register int i;
switch(tp[cur]){
case 3://sin(ax+b)
val[0]=B;val[1]=A;
for(i=2;i<12;i++) val[i]=0;
break;
case 2://exp(ax+b)
val[0]=exp(B);
for(i=1;i<12;i++) val[i]=val[i-1]*A;
break;
case 1://ax+b
val[0]=sin(B);
val[1]=A*cos(B);
for(i=2;i<12;i++) val[i]=-val[i-2]*A*A;
break;
default:assert(0);
}
}
void update(int cur){
for(register int i=0;i<12;i++) sum[cur][i]=sum[ch[cur][0]][i]+sum[ch[cur][1]][i]+w[cur][i];
}
void pushrev(int cur){
if(!cur) return;
swap(ch[cur][0],ch[cur][1]);
rev[cur]^=1;
}
void pushdown(int cur){
if(!rev[cur]) return;
pushrev(ch[cur][0]);
pushrev(ch[cur][1]);
rev[cur]=0;
}
bool nroot(int cur){return ch[fa[cur]][0]==cur||ch[fa[cur]][1]==cur;}
void push(int cur){
if(nroot(cur)) push(fa[cur]);
pushdown(cur);
}
bool get(int cur){return ch[fa[cur]][1]==cur;}
void rotate(int x){
int f=fa[x],ff=fa[f],son=get(x),nr=nroot(f);
ch[f][son]=ch[x][son^1];
if(ch[f][son]) fa[ch[f][son]]=f;
fa[f]=x;ch[x][son^1]=f;
fa[x]=ff;
if(nr) ch[ff][ch[ff][1]==f]=x;
update(f);update(x);
}
void splay(int x){
push(x);
for(int f;nroot(x);rotate(x)){
f=fa[x];
if(nroot(f)){
rotate((get(x)==get(f))?f:x);
}
}
}
void access(int x){
for(int y=0;x;y=x,x=fa[x]){
splay(x);ch[x][1]=y;update(x);
}
}
void mroot(int u){
access(u);splay(u);pushrev(u);
}
void link(int u,int v){
mroot(u);fa[u]=v;
}
void cut(int u,int v){
mroot(u);access(v);splay(v);
fa[u]=ch[v][0]=0;update(v);
}
int find(int u){
access(u);splay(u);
while(ch[u][0]) u=ch[u][0];
return u;
}
long double query(int u,int v,long double x){
mroot(u);access(v);splay(v);
long double re=0,tmp=1;register int i;
for(i=0;i<12;i++){
re+=tmp*(long double)(sum[v][i]);
tmp/=(long double)(i+1);tmp*=x;
}
return re;
}
int n,m;char s[20];
int main(){
n=read();m=read();scanf("%s",s);int i,t1,t2;double t3,t4;
for(i=1;i<=n;i++){
fa[i]=ch[i][0]=ch[i][1]=rev[i]=0;
tp[i]=read();
scanf("%lf%lf",&t3,&t4);
a[i]=t3;b[i]=t4;
calc(i);
}
while(m--){//注意题目中点是从0开始的
scanf("%s",s);
if(s[0]=='a'){
t1=read();t2=read();
t1++;t2++;
link(t1,t2);
}
if(s[0]=='d'){
t1=read();t2=read();
t1++;t2++;
cut(t1,t2);
}
if(s[0]=='m'){
t1=read();t1++;
tp[t1]=read();
scanf("%lf%lf",&t3,&t4);
a[t1]=t3;b[t1]=t4;
mroot(t1);calc(t1);update(t1);
}
if(s[0]=='t'){
t1=read();t2=read();scanf("%lf",&t3);
t1++;t2++;
if(find(t1)!=find(t2)) puts("unreachable");
else printf("%.10lf\n",(double)(query(t1,t2,t3)));
}
}
}

[THUWC2017][bzoj5020] 在美妙的数学王国中畅游 [LCT+泰勒展开]的更多相关文章

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

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

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

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

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

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

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

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

  5. bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5020 https://loj.ac/problem/2289 题解 这个 appear 和 d ...

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

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

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

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

  8. 洛谷 P4546 & bzoj 5020 在美妙的数学王国中畅游 —— LCT+泰勒展开

    题目:https://www.luogu.org/problemnew/show/P4546 先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分: 注意各处 pushup,而且 spla ...

  9. 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)

    [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(Link-Cut Tree,组合数学) 题解 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙 ...

随机推荐

  1. 【例题收藏】◇例题·IV◇ Wooden Sticks

    ◇例题·IV◇ Wooden Sticks 借鉴了一下 Candy? 大佬的思路 +传送门+ (=^-ω-^=) 来源:+POJ 1065+ ◆ 题目大意 有n个木棍以及一台处理木棍的机器.第i个木棍 ...

  2. springmvc 前端表单提交给后端出现乱码

    在springmvc框架练习中遇到了乱码问题,经过一番网上查找解决方法之后,最后发现是需要在tomcat中的server.xml中添加编码设置 URIEncoding="UTF-8" ...

  3. 实现BX的内容加上123 并把和送到寄存器AX

    ① 一条指令 ] ②两条指令 MOV AX,BX Tips: LEA指令与MOV指令的区别: ① MOV指令是 数据        传送指令-------传送数据 LEA指令是   有效地址 传送指令 ...

  4. python__高级 : @修饰器(装饰器)的理解

    以下是第一次了解的时候写的东西,有的地方理解不正确,虽已改正但是太片面,请直接看下面第二次修改加上的内容. ---------------------------------------------- ...

  5. 详解 JavaScript 中 splice() 方法

    splice() 方法是一个比较少用的方法,但是功能确实很好,并且在我们 coding 的时候,经常有需要 splice() 方法,先介绍一下该方法. 在 JavaScript 中 splice() ...

  6. Python的输入和输出问题详解

    输出用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print('hello, world') pr ...

  7. linux无名管道

    特点 无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写 只能在有共同祖先的进程间使用(父子进程.兄弟进程.子孙进程等) fork或者execve调用创建的子进程,继承了父进程的文件描述符 ...

  8. Clion 不能杀死进程

    描述 自己使用时发现点了结束按钮后,打开任务管理器,发现刚才运行的程序还在,并没有被杀死. 有时如果一个程序写了死循环,就会出现疯狂占用内存,最后不得不关机重启. 解决方案 这是他的社区有人也有这样的 ...

  9. 笔记-falsk-入门-1

    笔记-falsk-入门-1 1.      前言 有几个概念需要解释下,WSGI,JINJA2,WERKZEUG Flask是典型的微框架,作为Web框架来说,它仅保留了核心功能:请求响应处理和模板渲 ...

  10. storm实时计算实例(socket实时接入)

    介绍 实现了一个简单的从实时日志文件监听,写入socket服务器,再接入Storm计算的一个流程. 源码 日志监听实时写入socket服务器   package socket; import java ...