题目大意:

  传送门

  给一个动态树,每个节点上维护一个函数为$f(x)=sin(ax+b)$、$f(x)=e^{ax+b}$、$f(x)=ax+b$中的一个。

  支持删边连边,修改节点上函数的操作。

  每次询问$u$到$v$路径上所有函数带入$x$值的和。

题解:

  给了个泰勒公式

  (粘贴自百度)

  不过……要是会导数这题也应该知道……不会导数给了也是白给……不知道出题人怎么想的……

  话说直接给麦克劳林展开+导数不好吗……

  因为$f(x)=e^x$的导数$f'(x)=e^x$所有当取$x_0=0$时就有其麦克劳林展开:

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

  而$sin(x)$导数为$cos(x)$,$cos(x)$导数为$-sin(x)$。所以当$x_0=0$时发现$f(x)$奇数$i$阶导数为$(-1)^{\frac{i-1}{2}}$,偶数阶导均为0。有其麦克劳林展开:

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

  考虑这题数据范围不需要展开太多,大概20项就够了。

  然后把给的参数$ax+b$带进去得到一个关于$x$的长度为20的多项式,我们LCT的时候维护链上系数和即可。

代码:

#include "bits/stdc++.h"

inline int read (){
int s=0,k=1;char ch=getchar();
while (ch<'0'|ch>'9') ch=='-'?k=-1:0,ch=getchar();
while (ch>47&ch<='9') s=s*10+(ch^48),ch=getchar();
return s*k;
} #define double long double using namespace std; const int N=1e5+10; int C[20][20];
long long fac[20]; inline void init() {
register int i,j;
for (C[0][0]=i=1;i<20;++i)
for (C[i][0]=j=1;j<=i;++j)
C[i][j]=C[i-1][j]+C[i-1][j-1];
for (fac[0]=i=1;i<20;++i)
fac[i]=fac[i-1]*i;
} namespace LCT {
#define rev(t) (t?t->rev^=1:0)
#define is_root(t) (!t->fa||(t->fa->son[0]!=t&&t->fa->son[1]!=t))
#define son(t) (t->fa->son[1]==t)
#define size(t,s) (t?t->size[s]:0)
struct node {
node () {fa=son[0]=son[1]=NULL,rev=0,memset(self,0,sizeof self),memset(size,0,sizeof size);}
node *fa,*son[2];
double self[20],size[20];
int rev;
inline void pushdown() {
if (!rev) return ;
swap(son[0],son[1]);
rev(son[0]),rev(son[1]);
rev=0;
}
inline void update() {
for (int i=0;i<20;++i)
size[i]=size(son[0],i)+size(son[1],i)+self[i];
}
inline double ans(double x) {
double ans=0,now=1.0;
for (int i=0;i<20;++i,now*=x)
ans+=now*size[i];
return ans;
}
inline void calc(int type,double a[],double b[]) {
memset(self,0,sizeof self);
if (type==1) { for (int i=0;i<20;++i) if (i%2)
for (int j=0;j<=i;++j) {
self[j]+=((((i-1)/2)&1)?-1:1)*a[j]*b[i-j]*C[i][j]/fac[i];
}
}else if(type==2) {
for (int i=0;i<20;++i)
for (int j=0;j<=i;++j)
self[j]+=a[j]*b[i-j]*C[i][j]/fac[i];
}else self[0]=b[1],self[1]=a[1];
} }tree[N],*tmp[N]; inline void rotate(node *p){
int a=son(p)^1;node *f=p->fa;
f->son[a^1]=p->son[a];
if (p->son[a]) p->son[a]->fa=f;
p->fa=f->fa;
if (!is_root(f)) f->fa->son[son(f)]=p;
f->fa=p,p->son[a]=f,f->update(),p->update();
} inline void update(node *p){
if (!is_root(p)) update(p->fa);
p->pushdown();
} inline void splay(node *p){
register int pos=0;
for(node *t=p;;t=t->fa){
tmp[++pos]=t;
if(is_root(t)) break;
}
for(;pos;--pos) tmp[pos]->pushdown();
for(;!is_root(p);rotate(p))
if(!is_root(p->fa)) rotate(son(p)==son(p->fa)?p->fa:p);
} inline void access(node *p){
for(node *pre=NULL;p;pre=p,p=p->fa)
splay(p),p->son[1]=pre,p->update();
} inline void make_root(node *x) {
access(x),splay(x),x->rev^=1;
} inline void link(node *x,node *y) {
make_root(x);access(y),splay(y),x->fa=y;
y->update();
} inline void cut(node *x,node *y){
make_root(x),access(y),splay(y);
x->fa=y->son[0]=NULL;y->update();
} inline double query(node *x,node *y,double xx){
make_root(x),access(y),splay(y);
return y->ans(xx);
} inline int finds(node *x) {
access(x),splay(x);
while (x->son[0]) x=x->son[0],x->pushdown();
return x-tree;
}
} int n,m;
double a[20],b[20]; int main (int argc, char const* argv[]){
//freopen("2289.in","r",stdin);
init();
char opt[20];
n=read(),m=read(),scanf("%s",opt);
int type;
a[0]=b[0]=1.0;
using namespace LCT;
for (int i=1;i<=n;++i) {
type=read();
scanf("%Lf%Lf",a+1,b+1);
for (int j=2;j<20;++j)
a[j]=a[j-1]*a[1],
b[j]=b[j-1]*b[1];
tree[i].calc(type,a,b);
} int u,v,c;
double x;
while (m--) {
scanf("%s",opt);
if (opt[0]=='a') {
u=read()+1,v=read()+1;
link(&tree[u],&tree[v]);
}else if (opt[0]=='d') {
u=read()+1,v=read()+1;
cut(&tree[u],&tree[v]);
}
else if (opt[0]=='m') {
c=read()+1,type=read();
scanf("%Lf%Lf",a+1,b+1);
for (int j=2;j<20;++j)
a[j]=a[j-1]*a[1],
b[j]=b[j-1]*b[1];
make_root(&tree[c]);
tree[c].calc(type,a,b);
tree[c].update();
}
else {
u=read()+1,v=read()+1;
scanf("%Lf",&x);
if (finds(&tree[u])^finds(&tree[v])) {
puts("unreachable");
}
else {
printf("%.8Le\n",query(&tree[u],&tree[v],x));
}
}
}
return 0;
}

  

「LOJ 2289」「THUWC 2017」在美妙的数学王国中畅游——LCT&泰勒展开的更多相关文章

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

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

  2. 【THUWC 2017】在美妙的数学王国中畅游

    数学王国里有n座城市,每座城市有三个参数\(f\),\(a\),\(b\),一个智商为\(x\)的人经过一座城市的获益\(f(x)\)是 若\(f=1\),则\(f(x)=\sin(ax+b)\): ...

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

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

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

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

  5. BZOJ5020 [THUWC 2017]在美妙的数学王国中畅游LCT

    题意很明显是要用LCT来维护森林 难点在于如何处理函数之间的关系 我们可以根据题目给的提示关于泰勒展开的式子 将三种函数变成泰勒展开的形式 因为$x∈[0,1]$ 所以我们可以将三个函数在$x_0=0 ...

  6. loj2289 [THUWC 2017]在美妙的数学王国中畅游(LCT+Taylor展开)

    link 题目大意: 你需要维护一个树 每个点都有个sin(ax+b)或exp(ax+b)或ax+b 你需要维护一些操作:连边.删边.修改某个点的初等函数.询问某条树链上所有函数带入某个值后权值和或不 ...

  7. bzoj 5020: [THUWC 2017]在美妙的数学王国中畅游【泰勒展开+LCT】

    参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html --其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊 泰勒展开是到正无穷的,但是因 ...

  8. 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT

    [BZOJ5020][THUWC 2017]在美妙的数学王国中畅游 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数 ...

  9. 【LOJ】#2289. 「THUWC 2017」在美妙的数学王国中畅游

    题解 我们发现,题目告诉我们这个东西就是一个lct 首先,如果只有3,问题就非常简单了,我们算出所有a的总和,所有b的总和就好了 要是1和2也是多项式就好了--其实可以!也就是下面泰勒展开的用处,我们 ...

随机推荐

  1. Redis的集群配置

    如果我们redis的压力很大,如果我们的并发高到我们读数据和写数据都有了很大压力. 那么我们可能就需要把redis分开部署,并且配置为一个『主从』的状态. 在服务器上构筑Redis的集群配置: 1.切 ...

  2. 听晴明老师从头讲React Native 百度云下载 百度网盘

    适用人群 能使用至少一门主流编程语言:有基本的面向对象的概念:最好有一些web相关的知识和概念. 课程概述 新颖.实用.详尽的ReactNative零基础课程,由国内权威的ReactNative中文网 ...

  3. 前端Mahsup异步依赖方式不能做业务数据依赖

    很久之前流行mashup方式做内容集成,之前为了IP定位的方便,引用了第三方的IP定位JS,然后根据其内容与服务器同步地址数据并写入Cookie,可是这种方式一旦,第三方的库反应缓慢时,就会出现大问题 ...

  4. 与班尼特·胡迪一起拿奖学金(HZNU-2273)

    与班尼特·胡迪一起拿奖学金 AC Time Limit:  2 s      Memory Limit:   256 MB Description 班尼特·胡迪这学期的体测终于上80分了,当期末考试的 ...

  5. Python实现PPPOE攻击工具

    前言 大家可能对PPPOE不是很熟悉,但是肯定对拨号上网非常熟悉,拨号上网就是用的这种通信协议.一般PPPOE认证上网主要用于校园网或者小区网中,拨号界面如下图所示. 但是PPPOE这种通信协议,是有 ...

  6. Create R NoteBook require updated versions of the following packages : knitr,rmarkdown.

    Create R NoteBook require updated versions of  the following packages : knitr,rmarkdown. 点击yes安装失败的时 ...

  7. java之Spring(AOP)前奏-动态代理设计模式(上)

    我们常常会遇到这样的事,项目经理让你为一个功能类再加一个功能A,然后你加班为这个类加上了功能A: 过了两天又来了新需求,再在A功能后面加上一个新功能B,你加班写好了这个功能B,加在了A后面:又过 了几 ...

  8. Lenghth of Last Word

    description: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', ...

  9. python笔记:#013#高级变量类型

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) ...

  10. Beta 冲刺day3

    1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:昨天主要是对第三方与企业复杂的逻辑关系进行分析和优化,以及进行部分模块的功能测试和代码测试. 今天解决的进度:根据前天得到的需求问题进行 ...