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) ...
随机推荐
- MS08_067漏洞渗透攻击
MS08_067漏洞渗透攻击实践 前期准备 kali和winxp要ping通 kali开启msfconsole: 同时在这里可以看到目前可攻击载荷个数一共是471个,也可以看到其他攻击的数量如图. 用 ...
- 20145325张梓靖 《Java程序设计》第7周学习总结
20145325张梓靖 <Java程序设计>第7周学习总结 教材学习内容总结 时间的度量 格林威治时间,简称GMT时间,由观察太阳而得来:世界时,UT:国际原子时,TAI:世界协调时间,U ...
- 将vi打造成IDE
一.环境 发行版:Ubuntu 18.04 LTS 代号:bionic 内核版本:4.15.0-33-generic 二.步骤 2.1 准备工作 sudo apt-get install python ...
- HYSBZ 1036 树的统计Count(树链剖分)题解
思路: 树链剖分,不知道说什么...我连模板都不会用 代码: #include<map> #include<ctime> #include<cmath> #incl ...
- 谷歌浏览器&360浏览器安装——有道云笔记插件
谷歌浏览器: 有道云笔记插件:http://hk.chromefor.com/down.php?key=FulQTdJ9In3iXfdVicFW(点击即下载) 在谷歌浏览器里按快捷键:Alt+E 接 ...
- LA 7277 Landscaping(最小割)
https://vjudge.net/problem/UVALive-7277 题意: 给出一个n*m的地图,.代表低坡,#代表高坡. 现在有n+m辆车分别从上端和左端出发,如果在行驶的过程中需要转换 ...
- HDU 4183 Pahom on Water(最大流)
https://vjudge.net/problem/HDU-4183 题意: 这道题目的英文实在是很难理解啊. 给出n个圆,每个圆有频率,x.y轴和半径r4个属性,每次将频率为400的圆作为起点,频 ...
- Java网络编程学习A轮_07_基于Buffer的Socket编程
示例代码: https://github.com/gordonklg/study,socket module A. LineSeparate 基于 Buffer 实现逐行读取的 EchoServer ...
- JS级联下拉框
//Ajax级联获取SDKfunction GetDropDownList(parent_ddlID, fill_dllID, url, param) { this.pId = parent_d ...
- HttpClient将手机上的数据发送到服务器
到官网下载jar包,下载GA发布版本即可 在项目中将httpclient-4.5.5.jar.httpcore-4.4.9.jar.httpmime-4.5.5.jar.commons-logging ...