【bzoj5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT
题目描述
输入
输出
样例输入
3 7 C1
1 1 0
3 0.5 0.5
3 -0.5 0.7
appear 0 1
travel 0 1 0.3
appear 0 2
travel 1 2 0.5
disappear 0 1
appear 1 2
travel 1 2 0.5
样例输出
9.45520207e-001
1.67942554e+000
1.20000000e+000
题解
泰勒展开+LCT
如果对于每个子树直接维护函数的话很难维护。
注意到题目给出的函数都是收敛的,因此可以使用泰勒展开公式维护多项式。
本题用到的公式:
$e^x=\sum\limits_{i=0}^\infty \frac{x^i}{i!}\\ \sin x=\sum\limits_{i=0}^\infty (-1)^i\frac{x^{2i+1}}{(2i+1)!}$
要求$ax+b$对应的函数值直接把$ax+b$代入,用二项式定理展开即可。
注意到分母都是阶乘级别的,而$x$在$[0,1]$范围内,因此当$i$大到一定程度时可以忽略不计。因此可以只保留多项式的前几项,本题中保留16项即可保证精度。
剩下的就好办了,直接对LCT中Splay Tree的每个节点维护它的生成多项式和它子树生成多项式的和。查询时直接取出路径对应的生成多项式,把x代入即可出解。
时间复杂度$O(16n\log n+256n)=O(勉强能过)$,稍微有点卡常。。(不过像我这样自带超大常数的,跑了39s卡过了,应该也没什么特别卡的)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
#define K 16
using namespace std;
struct data
{double w[K] , sum[K];int fa , c[2] , rev;
}a[N];
double p1[K] , p2[K] , fac[K] , choose[K][K];
char str[15];
inline void pushup(int x)
{int i;for(i = 0 ; i < K ; i ++ ) a[x].sum[i] = a[a[x].c[0]].sum[i] + a[a[x].c[1]].sum[i] + a[x].w[i];
}
inline void pushdown(int x)
{if(a[x].rev){int l = a[x].c[0] , r = a[x].c[1];swap(a[l].c[0] , a[l].c[1]) , swap(a[r].c[0] , a[r].c[1]);a[l].rev ^= 1 , a[r].rev ^= 1 , a[x].rev = 0;}
}
inline bool isroot(int x)
{return x != a[a[x].fa].c[0] && x != a[a[x].fa].c[1];
}
void update(int x)
{if(!isroot(x)) update(a[x].fa);pushdown(x);
}
inline void rotate(int x)
{int y = a[x].fa , z = a[y].fa , l = (a[y].c[1] == x) , r = l ^ 1;if(!isroot(y)) a[z].c[a[z].c[1] == y] = x;a[x].fa = z , a[y].fa = x , a[a[x].c[r]].fa = y , a[y].c[l] = a[x].c[r] , a[x].c[r] = y;pushup(y) , pushup(x);
}
inline void splay(int x)
{update(x);int y , z;while(!isroot(x)){y = a[x].fa , z = a[y].fa;if(!isroot(y)){if((a[y].c[0] == x) ^ (a[z].c[0] == y)) rotate(x);else rotate(y);}rotate(x);}
}
inline void access(int x)
{int t = 0;while(x) splay(x) , a[x].c[1] = t , pushup(x) , t = x , x = a[x].fa;
}
inline int findroot(int x)
{while(a[x].fa) x = a[x].fa;return x;
}
inline void makeroot(int x)
{access(x) , splay(x) , swap(a[x].c[0] , a[x].c[1]) , a[x].rev ^= 1;
}
inline void link(int x , int y)
{makeroot(x) , a[x].fa = y;
}
inline void split(int x , int y)
{makeroot(x) , access(y) , splay(y);
}
inline void cut(int x , int y)
{split(x , y) , a[x].fa = a[y].c[0] = 0 , pushup(y);
}
void work(int x , int f , double a1 , double a2)
{memset(a[x].w , 0 , sizeof(a[x].w));int i , j;for(i = 1 ; i < K ; i ++ ) p1[i] = p1[i - 1] * a1 , p2[i] = p2[i - 1] * a2;if(f == 1){for(i = 1 ; i < K ; i += 4)for(j = 0 ; j <= i ; j ++ )a[x].w[j] += p1[j] * p2[i - j] * choose[i][j] / fac[i];for(i = 3 ; i < K ; i += 4)for(j = 0 ; j <= i ; j ++ )a[x].w[j] -= p1[j] * p2[i - j] * choose[i][j] / fac[i];}else if(f == 2){for(i = 0 ; i < K ; i ++ )for(j = 0 ; j <= i ; j ++ )a[x].w[j] += p1[j] * p2[i - j] * choose[i][j] / fac[i];}else a[x].w[1] = a1 , a[x].w[0] = a2;
}
inline void init()
{int i , j;p1[0] = p2[0] = fac[0] = 1;for(i = 1 ; i < K ; i ++ ) fac[i] = fac[i - 1] * i;for(i = 0 ; i < K ; i ++ ){choose[i][0] = 1;for(j = 1 ; j <= i ; j ++ ) choose[i][j] = choose[i - 1][j] + choose[i - 1][j - 1];}
}
int main()
{init();int n , m , i , f , x , y;double a1 , a2 , ans;scanf("%d%d%*s" , &n , &m);for(i = 1 ; i <= n ; i ++ ) scanf("%d%lf%lf" , &f , &a1 , &a2) , work(i , f , a1 , a2) , pushup(i);while(m -- ){scanf("%s" , str);switch(str[0]){case 'a': scanf("%d%d" , &x , &y) , x ++ , y ++ , link(x , y); break;case 'd': scanf("%d%d" , &x , &y) , x ++ , y ++ , cut(x , y); break;case 'm': scanf("%d%d%lf%lf" , &x , &f , &a1 , &a2) , x ++ , splay(x) , work(x , f , a1 , a2) , pushup(x); break;default:{scanf("%d%d%lf" , &x , &y , &a1) , x ++ , y ++ ;if(findroot(x) != findroot(y)) puts("unreachable");else{for(i = 1 ; i < K ; i ++ ) p1[i] = p1[i - 1] * a1;split(x , y) , ans = 0;for(i = 0 ; i < K ; i ++ ) ans += p1[i] * a[y].sum[i];printf("%.8le\n" , ans);}}}}return 0;
}
转载于:https://www.cnblogs.com/GXZlegend/p/7488266.html
【bzoj5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT相关推荐
- 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT
[BZOJ5020][THUWC 2017]在美妙的数学王国中畅游 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数 ...
- bzoj5020[THUWC 2017]在美妙的数学王国中畅游(LCT)
传送门:https://loj.ac/problem/2289 https://www.lydsy.com/JudgeOnline/problem.php?id=5020 solutionsoluti ...
- [BZOJ5020][THUWC 2017]在美妙的数学王国中畅游(LCT + 一点数学知识)
Address 洛谷 P4546 BZOJ 5020 LOJ #2289 Solution 如果只有一次函数 ax+bax+bax+b ,那么这是非常裸的 LCT ,维护 aaa 之和与 bbb 之和 ...
- BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游
BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游 其实题面好像有点不全,建议去洛谷: P4546 [THUWC2017]在美妙的数学王国中畅游 这里还是$BZOJ$的题面. Desc ...
- BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)
Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数学的语言展现出来. 这印证了一句古老的名言: ...
- [BZOJ5020] [THUWC 2017]在美妙的数学王国中畅游
Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数学的语言展现出来. 这印证了一句古老的名言: "学好数理化 ...
- [bzoj5020][THUWC 2017]在美妙的数学王国中畅游
Orz w_yqts lct+泰勒展开 #include <bits/stdc++.h> using namespace std; #define db double #define N ...
- 解题:THUWC 2017 在美妙的数学王国中畅游
题面 _"数字和数学规律主宰着这个世界."_ 在 @i207M 帮助下折腾了半天终于搞懂了导数和泰勒展开,引用某学长在考场上的感受:感觉整个人都泰勒展开了 显然是个奇奇怪怪的东西套 ...
- [THUWC 2017]在美妙的数学王国中畅游
LOJ2289 看到加边减边想到LCT 猜到要合并函数,然后看到"小R教你学数学" 果断泰勒展开 以下所有结果均令x0=0x_0=0x0=0 sin(ax+b)=sin(b) ...
最新文章
- 10-TypeScript中的接口
- 原来这部电影 18 禁?用神经网络“看”剧本,AI 秒给预测评级
- GPUImageMovieWriter实现暂停录制,重新录制
- 【9】青龙面板系列教程之互助规则的配置
- 阿杜版主 我找您有事想请教下您!!
- 宝塔面板搭载ThinkPHP5.0项目关于open_basedir报错解决办法
- centos7重新加载服务的命令_Centos7 systemctl添加service服务参数说明
- python 获取Dmidecode 输出的系统硬件信息
- php伪静态失败,php伪静态后html不能访问怎么办
- python调用菜单响应事件_tkinter菜单能发送调用它们的事件吗?
- 从ASCII到UTF-8——字符集到底是什么?
- @postconstruct 不执行_一张图:Spring Boot 应用在启动阶段执行代码的几种方式
- javascript 密码花园 并不清晰的js基础 总结(1)
- Android ASCII编码转换成相对应字符
- tomcat 内存溢出配置
- 百度文库中的文字不能复制,怎么办?
- 天狼星单片机c语言教程,单片机资料百度盘教程.doc
- 学习 Java,使用哪个版本最好
- 完美黑苹果clover EFI BigSur11.2 神舟K580c i5 BCM94360HMB WIFI蓝牙二合一网卡
- 微软 edge浏览器自动关闭问题处理