题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5020

   https://www.luogu.org/problemnew/show/P4546

如果保证 x=1 ,则可以用 LCT 维护每个点的函数值。不然的话就用 LCT 拿出那条链,dfs 一下 splay 现算。可以得 60 分。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=1e5+;
int n,m,fa[N],c[N][],sta[N],top; db sm[N],vl[N]; bool fx,rev[N];
struct Node{
int f;db a,b;
db cal(db x)
{
if(f==)return sin(a*x+b);
if(f==)return exp(a*x+b);
if(f==)return a*x+b;
}
}a[N];
bool isroot(int cr){return c[fa[cr]][]!=cr&&c[fa[cr]][]!=cr;}
void pshp(int cr){sm[cr]=sm[c[cr][]]+sm[c[cr][]]+vl[cr];}
void Rev(int cr){if(rev[cr]){rev[cr]=;rev[c[cr][]]^=;rev[c[cr][]]^=;swap(c[cr][],c[cr][]);}}
void rotate(int x)
{
int y=fa[x],z=fa[y],d=(x==c[y][]);
if(!isroot(y))c[z][y==c[z][]]=x;//!isroot(y) not !isroot(z) !!
fa[x]=z;
fa[y]=x; fa[c[x][!d]]=y;
c[y][d]=c[x][!d]; c[x][!d]=y;
if(fx)pshp(y),pshp(x);
}
void splay(int x)
{
sta[top=]=x;
for(int cr=x;!isroot(cr);cr=fa[cr])sta[++top]=fa[cr];
for(int i=top;i;i--)Rev(sta[i]);
int y,z;
while(!isroot(x))
{
y=fa[x];z=fa[y];
if(!isroot(y))
((x==c[y][])^(y==c[z][]))?rotate(x):rotate(y);
rotate(x);
}
}
void access(int cr)
{
for(int t=;cr;splay(cr),c[cr][]=t,pshp(cr),t=cr,cr=fa[cr]);//pshp()!!
}
void mkrt(int cr)
{
access(cr);splay(cr);rev[cr]^=;
}
void link(int x,int y)
{
mkrt(x);fa[x]=y;
}
void cut(int x,int y)
{
mkrt(x);access(y);splay(y);
fa[x]=c[y][]=;if(fx)sm[y]-=vl[x];
}
void mdfy(int cr,int f,db a1,db b1)
{
if(fx)splay(cr),sm[cr]-=vl[cr];
a[cr].f=f;a[cr].a=a1;a[cr].b=b1;
if(fx)vl[cr]=a[cr].cal(),sm[cr]+=vl[cr];
}
int fnd(int cr)//root of real tree
{
while(!isroot(cr))cr=fa[cr];return cr;
}
db dfs(int cr,db x)
{
db ret=a[cr].cal(x);
if(c[cr][])ret+=dfs(c[cr][],x);
if(c[cr][])ret+=dfs(c[cr][],x);
return ret;
}
void print(db x)
{
bool fx=;int t=;
if(x<){fx=;while(x<)x*=,t++;}
if(x>=){while(x>=)x/=,t++;}
printf("%.8fe%c%03d\n",x,fx?'-':'+',t);
}
int main()
{
n=rdn();m=rdn();char ch[];scanf("%s",ch);
if(ch[]=='')fx=;
for(int i=;i<=n;i++)
{
a[i].f=rdn();scanf("%lf%lf",&a[i].a,&a[i].b);
if(fx)vl[i]=sm[i]=a[i].cal();
}
int u,v;db a,b,x;
while(m--)
{
scanf("%s",ch);
if(ch[]=='a'){u=rdn()+;v=rdn()+;link(u,v);}
if(ch[]=='d'){u=rdn()+;v=rdn()+;cut(u,v);}
if(ch[]=='m'){u=rdn()+;v=rdn();scanf("%lf%lf",&a,&b);mdfy(u,v,a,b);}
if(ch[]=='t')
{
u=rdn()+;v=rdn()+;scanf("%lf",&x);
mkrt(u);access(v);splay(v);
if(fnd(u)!=v)puts("unreachable");
else print(fx?sm[v]:dfs(v,x));
}
}
return ;
}

关于本题的求导和泰勒展开可以看这个:https://www.cnblogs.com/zhoushuyu/p/8148732.html

似乎还可以麦克劳林展开:https://www.cnblogs.com/Troywar/p/8982707.html

似乎展开成 12 项的多项式就差不多了,然后可以用 LCT 维护 12 项的系数和,算的时候乘上 xk 再除以阶乘就行。

那个 x0 好像取 0 就行了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
#define ls c[cr][0]
#define rs c[cr][1]
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
using namespace std;
const int N=1e5+,M=;
int n,fa[N],c[N][],sta[N],top; bool rev[N]; db sm[N][M+],vl[N][M+],jc[N];
struct Node{
int f;db a,b;
Node(int f=,db a=,db b=):f(f),a(a),b(b) {}
void cz(int cr)
{
if(f==)
{
db p[],lja=;
p[]=sin(b);p[]=cos(b);p[]=-p[];p[]=-p[];
for(int i=;i<M;i+=)
for(int j=;j<;j++,lja*=a)sm[cr][i+j]=vl[cr][i+j]=p[j]*lja;
}
if(f==)
{
db ml=exp(b),lja=;
for(int i=;i<M;i++,lja*=a)sm[cr][i]=vl[cr][i]=ml*lja;
}
if(f==)
{
sm[cr][]=vl[cr][]=b; sm[cr][]=vl[cr][]=a;
for(int i=;i<M;i++)sm[cr][i]=vl[cr][i]=;
}
}
}w[N];
bool isrt(int cr){return c[fa[cr]][]!=cr&&c[fa[cr]][]!=cr;}
void pshp(int cr)
{
for(int i=;i<M;i++)sm[cr][i]=sm[ls][i]+sm[rs][i]+vl[cr][i];
}
void Rev(int cr){if(rev[cr]){rev[cr]=;rev[ls]^=;rev[rs]^=;swap(ls,rs);}}
void rotate(int x)
{
int y=fa[x],z=fa[y],d=(x==c[y][]);
if(!isrt(y))c[z][y==c[z][]]=x;
fa[x]=z;
fa[y]=x; fa[c[x][!d]]=y;
c[y][d]=c[x][!d]; c[x][!d]=y;
pshp(y);pshp(x);
}
void splay(int x)
{
sta[top=]=x;
for(int cr=x;!isrt(cr);cr=fa[cr])sta[++top]=fa[cr];
for(int i=top;i;i--)Rev(sta[i]);
int y,z;
while(!isrt(x))
{
y=fa[x];z=fa[y];
if(!isrt(y))
((x==c[y][])^(y==c[z][]))?rotate(x):rotate(y);
rotate(x);
}
}
void access(int cr)
{
for(int t=;cr;splay(cr),rs=t,pshp(cr),t=cr,cr=fa[cr]);//pshp()!!!
}
void mkrt(int cr)
{
access(cr);splay(cr);rev[cr]^=;
}
void link(int x,int y)
{
mkrt(x);fa[x]=y;
}
void cut(int x,int y)
{
mkrt(x);access(y);splay(y);
fa[x]=c[y][]=;pshp(y);
}
void mdfy(int cr,int f,db a,db b)
{
splay(cr);
w[cr]=Node(f,a,b);w[cr].cz(cr);
}
db cal(int cr,db x)
{
db ret=,ml=;
for(int i=;i<M;i++,ml*=x)
ret+=sm[cr][i]*ml/jc[i];
return ret;
}
int fnd(int cr)
{
while(!isrt(cr))cr=fa[cr];return cr;
}
void print(db x)
{
bool fx=;int t=;
if(x<){fx=;while(x<)x*=,t++;}
if(x>=){while(x>=)x/=,t++;}
printf("%.8fe%c%03d\n",x,fx?'-':'+',t);
}
int main()
{
jc[]=;for(int i=;i<M;i++)jc[i]=jc[i-]*i;
n=rdn();int m=rdn();char ch[];scanf("%s",ch);
for(int i=;i<=n;i++)
w[i].f=rdn(),scanf("%lf%lf",&w[i].a,&w[i].b),w[i].cz(i),pshp(i);//pshp for sm[]
int u,v;db a,b;
while(m--)
{
scanf("%s",ch);
if(ch[]=='a'){u=rdn()+;v=rdn()+;link(u,v);}
if(ch[]=='d'){u=rdn()+;v=rdn()+;cut(u,v);}
if(ch[]=='m'){u=rdn()+;v=rdn();scanf("%lf%lf",&a,&b);mdfy(u,v,a,b);}
if(ch[]=='t')
{
u=rdn()+;v=rdn()+;scanf("%lf",&a);
mkrt(u);access(v);splay(v);
if(fnd(u)!=v)puts("unreachable");
else print(cal(v,a));
}
}
return ;
}

bzoj 5020(洛谷4546) [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. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)

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

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

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

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

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

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

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

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

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

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

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

  8. 5020: [THUWC 2017]在美妙的数学王国中畅游

    传送门 当年听llj讲的时候觉得这简直是个不可做的神题. 现在看来并不是很神,可能是我已经被剧透了的缘故... 一开始以为是函数套函数,懵蔽了好久,结果只是求和 被剧透了泰勒展开就比较水了..只要你不 ...

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

    bzoj5020 \[答案误差只要小于 10^{-7}\] 题解 Taylor展开式: \[若f(x)的n阶导数在[a, b]内连续,则f(x)在x_{0}\in[a, b]可表示为\] \[f(x) ...

随机推荐

  1. Django学习笔记之Ajax与文件上传

      Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输 ...

  2. 安装Git【转】

    本文转载自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 最早Git是在Linu ...

  3. HDU 1556 Color the ball(线段树:区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...

  4. Hive安装-windows(转载)

    1.安装hadoop 2.从maven中下载mysql-connector-java-5.1.26-bin.jar(或其他jar版本)放在hive目录下的lib文件夹 3.配置hive环境变量,HIV ...

  5. linux find/grep 与cat联合使用

    find ./ -name  file_name.txt   | xargs cat >> file_name.txt

  6. Flutter基础Widget之按钮(RaisedButton、FlatButton、OutlineButton,IconButton)

    Flutter中给我们预先定义好了一些按钮控件给我们用,常用的按钮如下 RaisedButton :凸起的按钮,其实就是Android中的Material Design风格的Button ,继承自Ma ...

  7. CentOS下安装Telnet服务

    环境:centos6.6   IP:172.18.0.190 1.查看是否安装Telnet: rpm -qa telnet-server rpm -qa xinetd 2.安装Telnet: yum ...

  8. mysql 判断表字段是否存在,然后修改

    -- ---------------------------- -- 判断 vrv_paw_rule 表是否存在 thresholdMin 字段,不存在则添加; 存在则修改字段类型 DELIMITER ...

  9. Javascript 面向对象编程(补充):封装

    Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...

  10. Python自动化运维之路-01

    python的主要应用 python的擅长领域 学python有没有前途?python的语言排名 语言选择 运维会了开发后可以干什么? python的最大优势就是什么都能做. 课程概述 毕业目标 周五 ...