bzoj 5020(洛谷4546) [THUWC 2017]在美妙的数学王国中畅游——LCT+泰勒展开
题目: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+泰勒展开的更多相关文章
- bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5020 https://loj.ac/problem/2289 题解 这个 appear 和 d ...
- BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)
Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数学的语言展现出来. 这印证了一句古老的名言: ...
- bzoj 5020: [THUWC 2017]在美妙的数学王国中畅游【泰勒展开+LCT】
参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html --其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊 泰勒展开是到正无穷的,但是因 ...
- BZOJ5020 [THUWC 2017]在美妙的数学王国中畅游LCT
题意很明显是要用LCT来维护森林 难点在于如何处理函数之间的关系 我们可以根据题目给的提示关于泰勒展开的式子 将三种函数变成泰勒展开的形式 因为$x∈[0,1]$ 所以我们可以将三个函数在$x_0=0 ...
- loj2289 [THUWC 2017]在美妙的数学王国中畅游(LCT+Taylor展开)
link 题目大意: 你需要维护一个树 每个点都有个sin(ax+b)或exp(ax+b)或ax+b 你需要维护一些操作:连边.删边.修改某个点的初等函数.询问某条树链上所有函数带入某个值后权值和或不 ...
- 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT
[BZOJ5020][THUWC 2017]在美妙的数学王国中畅游 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数 ...
- 洛谷 P4546 & bzoj 5020 在美妙的数学王国中畅游 —— LCT+泰勒展开
题目:https://www.luogu.org/problemnew/show/P4546 先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分: 注意各处 pushup,而且 spla ...
- 5020: [THUWC 2017]在美妙的数学王国中畅游
传送门 当年听llj讲的时候觉得这简直是个不可做的神题. 现在看来并不是很神,可能是我已经被剧透了的缘故... 一开始以为是函数套函数,懵蔽了好久,结果只是求和 被剧透了泰勒展开就比较水了..只要你不 ...
- [THUWC 2017]在美妙的数学王国中畅游
bzoj5020 \[答案误差只要小于 10^{-7}\] 题解 Taylor展开式: \[若f(x)的n阶导数在[a, b]内连续,则f(x)在x_{0}\in[a, b]可表示为\] \[f(x) ...
随机推荐
- Android用PhoneGap封装webapp在android代码中实现连按退出和loadingpage
用PhoneGap封装后的程序有一些瑕疵,比如启动时黑屏,菜单按钮和返回按钮不好控制等. PhoneGap也在github提交的它的源码(版本:2.8): https://github.com/apa ...
- 20145221 《Java程序设计》第五周学习总结
20145221 <Java程序设计>第五周学习总结 教材学习内容总结 第八章部分 - 异常处理 语法与继承架构 使用try...catch 首先要明确一点:Java中所有错误都会打包为对 ...
- python 去除不可见的控制字符
尤其是在json load的时候,字符串中的不可见控制字符可能会导致错误,应该先对字符串进行控制字符过滤. 对网页文本同样适用,最好在处理网页文本时先进性控制字符清洗. Replace null by ...
- linux中find与rm实现查找并删除目录或文件
linux 下用find命令查找文件,rm命令删除文件. 删除指定目录下指定文件find 要查找的目录名 -name .svn |xargs rm -rf 删除指定名称的文件或文件夹: find -t ...
- Java回顾之集合
在这篇文章里,我们关注Java中的集合(Collection).集合是编程语言中基础的一部分,Java自JDK早期,就引入了Java Collection Framework.设计JCF的那个人,后来 ...
- ES5和ES6中的继承
看到一篇写的非常好的关于js继承的文章,其中对构造函数.原型.实例之间的关系的描述十分透彻,故转载作者文章以随时学习,并供大家共同进步! ES5 ES5中的继承,看图: function Super( ...
- Rspec: everyday-rspec实操: 第10章测试其他功能,第11章TDD 第12章总结。
10.测试文件上传 作者推荐的Paperclip,官方维护组已经不推荐使用deprecated. 推荐使用rails自带的 ActiveStorage. Active Storage: 推进文件上传到 ...
- 058——VUE中vue-router之实例操作新闻列表单页面应用与路由别名的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- EPANET头文件解读系列4——EPANET2.H
该头文件的功能与系列3中的TOOLKIT.H类似,而且内容也几乎一致,所以也就不再详细介绍.
- FireFox和IE下使用Date来构造新Date对象的BUG
正常方式 我们都知道可以使用new Date()来创建一个Date对象. new Date();//Date {Mon Jun 15 2015 15:53:16 GMT+0800} 也可以用new D ...