首先发现有连边和删边的操作,所以我们肯定要用\(LCT\)来进行维护。

接下来考虑如何进行\(LCT\)上的信息合并。

\(f=1\),则函数为\(f(x)=sin(ax+b)\)

\(f=2\),则函数为\(f(x)=e^{ax+b}\)

\(f=3\),则函数为\(f(x)=ax+b\)

这道题中的信息为这三个函数,因为\(sin(ax+b)\)和\(e^{ax+b}\)不好处理,所以用泰勒展开都其处理为多项式的形式,再进行多项式的合并即可。

泰勒公式:

\[f(x)=\sum_{i=0}^{n} \frac{f^{(i)}(x_0)\times(x-x_0)^i}{i!}
\]

我们让\(x_0=0\),得:

\[f(x)=\sum_{i=0}^{n} \frac{f^{(i)}(0)}{i!}x^i
\]

根据求导的知识,得:

\[(\sin x)'=\cos x
\]

\[(\cos x)'=-\sin x
\]

\[(-\sin x)'=-\cos x
\]

\[(-\cos x)'=\sin x
\]

\[(e^x)'=e^x
\]

同时再应用链式法则。

对\(sin(ax+b)\)进行泰勒展开得:

\[sin(ax+b)=\sum_{i=0}^{n} \frac{f^{(i)}(0)}{i!}x^i
\]

其中,\(f^{(i)}(0)\)为:

\[f^{(i)}(0)=\begin{cases}\sin(b)a^i\ (i\mod4=0)\\\cos(b)a^i\ (i\mod4=1)\\-\sin(b)a^i\ (i\mod4=2)\\-\cos(b)a^i\ (i\mod4=3)\end{cases}
\]

对\(e^{ax+b}\)进行泰勒展开得:

\[e^{ax+b}=\sum_{i=0}^{n} \frac{f^{(i)}(0)}{i!}x^i=\sum_{i=0}^{n} \frac{a^ie^b}{i!}x^i
\]

解决了信息合并后,修改查询什么的都是\(LCT\)的基本操作了,然后这道题就做完了。

实现细节看代码吧。

\(code:\)

#include<bits/stdc++.h>
#define maxn 100010
#define maxm 20
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n,m;
char type[10];
int fa[maxn],ch[maxn][2],rev[maxn],f[maxn];
double fac[maxm],sum[maxn][maxm],a[maxn],b[maxn];
bool check(int x)
{
return ch[fa[x]][1]==x;
}
void pushr(int x)
{
rev[x]^=1;swap(ch[x][0],ch[x][1]);
}
void pushup(int x)
{
for(int i=0;i<=15;++i)
sum[x][i]=sum[ch[x][0]][i]+sum[ch[x][1]][i];
if(f[x]==1)
{
double val=1,s=sin(b[x]),c=cos(b[x]);
for(int i=0;i<=15;i+=4)
{
sum[x][i]+=s*val,val*=a[x];
sum[x][i+1]+=c*val,val*=a[x];
sum[x][i+2]-=s*val,val*=a[x];
sum[x][i+3]-=c*val,val*=a[x];
}
}
if(f[x]==2)
{
double val=exp(b[x]);
for(int i=0;i<=15;++i) sum[x][i]+=val,val*=a[x];
}
if(f[x]==3) sum[x][1]+=a[x],sum[x][0]+=b[x];
}
void pushdown(int x)
{
if(!rev[x]) return;
pushr(ch[x][0]),pushr(ch[x][1]);
rev[x]=0;
}
bool notroot(int x)
{
return ch[fa[x]][0]==x||ch[fa[x]][1]==x;
}
void rotate(int x)
{
int y=fa[x],z=fa[y],k=check(x),w=ch[x][k^1];
if(notroot(y)) ch[z][check(y)]=x;
fa[x]=z;
ch[y][k]=w;
if(w) fa[w]=y;
ch[x][k^1]=y;
fa[y]=x;
pushup(y);
}
void all(int x)
{
if(notroot(x)) all(fa[x]);
pushdown(x);
}
void splay(int x)
{
all(x);
for(int y;notroot(x);rotate(x))
if(notroot(y=fa[x]))
rotate(check(x)^check(y)?x:y);
pushup(x);
}
void access(int x)
{
for(int y=0;x;y=x,x=fa[x])
splay(x),ch[x][1]=y,pushup(x);
}
void makeroot(int x)
{
access(x),splay(x),pushr(x);
}
void split(int x,int y)
{
makeroot(x),access(y),splay(y);
}
int findroot(int x)
{
access(x),splay(x);
while(ch[x][0]) x=ch[x][0];
splay(x);
return x;
}
void link(int x,int y)
{
makeroot(x),fa[x]=y;
}
void cut(int x,int y)
{
split(x,y),fa[x]=ch[y][0]=0;
}
void modify(int x,int nf,double na,double nb)
{
makeroot(x);
f[x]=nf,a[x]=na,b[x]=nb;
}
double query(int x,int y,double q)
{
double ans=0,now=1;
split(x,y);
for(int i=0;i<=15;++i)
ans+=sum[y][i]*now/fac[i],now*=q;
return ans;
}
void init()
{
fac[0]=1;
for(int i=1;i<=18;++i) fac[i]=fac[i-1]*i;
}
int main()
{
init();
read(n),read(m);
scanf("%s",type);
for(int i=1;i<=n;++i)
read(f[i]),scanf("%lf%lf",&a[i],&b[i]);
while(m--)
{
int x,y,nf;
double na,nb,q;
scanf("%s",type);
if(type[0]=='a')
read(x),read(y),link(x+1,y+1);
if(type[0]=='d')
read(x),read(y),cut(x+1,y+1);
if(type[0]=='m')
{
read(x),read(nf),x++;
scanf("%lf%lf",&na,&nb);
modify(x,nf,na,nb);
}
if(type[0]=='t')
{
read(x),read(y),x++,y++;
scanf("%lf",&q);
if(findroot(x)!=findroot(y))
{
puts("unreachable");
continue;
}
printf("%.10lf\n",query(x,y,q));
}
}
return 0;
}

题解 洛谷 P4546 【[THUWC2017]在美妙的数学王国中畅游】的更多相关文章

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

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

  2. 并不对劲的bzoj5020:loj2289:p4546:[THUWC2017]在美妙的数学王国中畅游

    题目大意 有一个n(\(n\leq 10^5\))个点的森林,每个点\(u\)上有个函数\(f_u(x)\),是形如\(ax+b\)或\(e^{ax+b}\)或\(sin(ax+b)\)的函数,保证当 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Docker(一)Docker概述

    Docker概述 概述 Docker是供开发人员和系统管理员 使用容器构建,运行和共享应用程序的平台.使用容器来部署应用程序称为容器化.容器不是新的,但用于轻松部署应用程序的容器却是新的. 容器化越来 ...

  2. 尚学堂 217 java中的字节码操作2

    package com.bjsxt.test; @Author(name="gaoqi", year=2014) public class Emp { private int em ...

  3. 微信小程序navigator带参数跳转及接收参数内容

    // index.wxml <navigator class='looks-view' wx:for="{{imgUrlNew}}" wx:key="index&q ...

  4. Linux安装Redis 6.0.5 ./install_server.sh报错

    Linux安装Redis 6.0.5 ./install_server.sh报错 linux 安装Redis6.0.5时 进行到./install_server.sh时报错, This systems ...

  5. pikachu靶场-暴力破解(验证码、token)

    甲.基于表单的破解 较为简单,直接BurpSuite爆破. 乙.验证码绕过(on server) 打开题目,比第一题多了一个验证码验证,很多初学者遇到验证码就会感觉不知所措.其实这题也较为简单,首先正 ...

  6. JDK8--03:lambda表达式语法

    对于lambda表达式的基础语法,一个是要了解lambda表达式的基础语法,另外一个是需要了解函数式接口 一.lambda表达式基础语法描述 java8中引入了新的操作符  ->  ,可以称为l ...

  7. 【错误】fatal: destination path already exists and is not an empty directory. 错误及解决办法

    今天在使用Git for Windows clone代码时,遇到了题目所示的错误,简单来说就是目标路径‘.’已经存在并且不是一个空目录. 可是在我在文件夹下并没有看到任何文件,显示“该文件夹为空”,然 ...

  8. Python之浅谈函数

    目录 文件的高级应用 文件修改的两种方式 第一种 第二种 函数的定义 函数的参数 函数的返回值 文件的高级应用 r+即可读又可写,并且是在后面追加 w+清空文件的功能是w提供的 a+a有追加的功能,a ...

  9. Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析

    一.生命周期 @Bean自定义初始化和销毁方法 //====xml方式: init-method和destroy-method==== <bean id="person" c ...

  10. redis基础02-redis的5种对象数据类型

    表格引用地址:http://www.cnblogs.com/xrq730/p/8944539.html 参考书籍:<Redis设计与实现>,<Redis运维与开发> 1.对象 ...