[LOJ2289][THUWC2017]在美妙的数学王国中畅游:Link-Cut Tree+泰勒展开
分析
又有毒瘤出题人把数学题出在树上了。
根据泰勒展开,有:
\]
\]
然而题目里\(x\)的位置是一个\(ax+b\)怎么办啊?直接根据二项式定理暴力展开就好了。
题目中要求支持加边删边,可以想到肯定是LCT。维护一下链上所有结点各次项系数和,查询时直接利用整条链的信息计算答案即可。
计算到\(16\)次项精度就没啥问题了。(其实是为了凑个整)
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
typedef long long LL;
using std::cin;
using std::cout;
using std::endl;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MAXN=100005;
const int MAXM=200005;
int n,m,top,sta[MAXN];
char opt[15];
double fac[20],c[20][20],powk[20],powb[20];
struct lct{
int fa,ch[2];
int opt;
double k,b;
double v[20];
double sum[20];
bool tag;
}a[MAXN];
inline void pre_process(){
fac[0]=1;
rin(i,1,16) fac[i]=fac[i-1]*i;
c[0][0]=1;
rin(i,1,16) rin(j,0,i){
c[i][j]=c[i-1][j];
if(j) c[i][j]+=c[i-1][j-1];
}
}
#define lc a[x].ch[0]
#define rc a[x].ch[1]
inline bool isroot(int x){
return a[a[x].fa].ch[0]!=x&&a[a[x].fa].ch[1]!=x;
}
inline void pushup(int x){
rin(i,0,16) a[x].sum[i]=a[x].v[i]+a[lc].sum[i]+a[rc].sum[i];
}
inline void pushr(int x){
std::swap(lc,rc);
a[x].tag^=1;
}
inline void pushdown(int x){
if(!a[x].tag) return;
if(lc) pushr(lc);
if(rc) pushr(rc);
a[x].tag=0;
}
inline void info(int x){
memset(a[x].v,0,sizeof a[x].v);
if(a[x].opt==1){
powk[0]=powb[0]=1;
rin(i,1,16){
powk[i]=powk[i-1]*a[x].k;
powb[i]=powb[i-1]*a[x].b;
}
int pn=1;
for(int i=1;i<=16;i+=2){
rin(j,0,i){
a[x].v[j]+=pn*powk[j]*powb[i-j]*c[i][j]/fac[i];
}
pn=-pn;
}
}
else if(a[x].opt==2){
powk[0]=powb[0]=1;
rin(i,1,16){
powk[i]=powk[i-1]*a[x].k;
powb[i]=powb[i-1]*a[x].b;
}
rin(i,0,16){
rin(j,0,i){
a[x].v[j]+=powk[j]*powb[i-j]*c[i][j]/fac[i];
}
}
}
else{
a[x].v[1]=a[x].k;
a[x].v[0]=a[x].b;
}
pushup(x);
}
inline void rotate(int x){
int y=a[x].fa,z=a[y].fa,f=(a[y].ch[1]==x),g=a[x].ch[f^1];
if(!isroot(y)) a[z].ch[a[z].ch[1]==y]=x;
a[x].ch[f^1]=y;
a[y].ch[f]=g;
if(g) a[g].fa=y;
a[y].fa=x;
a[x].fa=z;
pushup(y);
}
inline void splay(int x){
int y=x,z=0;
top=1,sta[1]=y;
while(!isroot(y)) sta[++top]=y=a[y].fa;
while(top) pushdown(sta[top--]);
while(!isroot(x)){
y=a[x].fa,z=a[y].fa;
if(!isroot(y)){
if((a[y].ch[0]==x)==(a[z].ch[0]==y)) rotate(y);
else rotate(x);
}
rotate(x);
}
pushup(x);
}
inline void access(int x){
for(int y=0;x;x=a[y=x].fa){
splay(x);
rc=y;
pushup(x);
}
}
inline void makeroot(int x){
access(x);
splay(x);
pushr(x);
}
inline int findroot(int x){
access(x);
splay(x);
while(lc) x=lc;
return x;
}
inline void split(int x,int y){
makeroot(x);
access(y);
splay(y);
}
inline void link(int x,int y){
makeroot(x);
a[x].fa=y;
}
inline void cut(int x,int y){
split(x,y);
a[x].fa=0;
a[y].ch[0]=0;
pushup(y);
}
inline double query(int x,int y,double iq){
split(x,y);
double tt=1,ret=0;
rin(i,0,16){
ret+=a[y].sum[i]*tt;
tt*=iq;
}
return ret;
}
#undef lc
#undef rc
int main(){
pre_process();
n=read(),m=read();
scanf("%s",opt+1);
rin(i,1,n){
a[i].opt=read();
scanf("%lf%lf",&a[i].k,&a[i].b);
info(i);
}
while(m--){
scanf("%s",opt+1);
if(opt[1]=='a'){
int x=read()+1,y=read()+1;
link(x,y);
}
else if(opt[1]=='d'){
int x=read()+1,y=read()+1;
cut(x,y);
}
else if(opt[1]=='m'){
int x=read()+1;a[x].opt=read();
scanf("%lf%lf",&a[x].k,&a[x].b);
getchar();
splay(x);
info(x);
}
else{
int x=read()+1,y=read()+1;
double iq;scanf("%lf",&iq);
getchar();
if(findroot(x)!=findroot(y)){
printf("unreachable\n");
continue;
}
printf("%.8le\n",query(x,y,iq));
}
}
return 0;
}
[LOJ2289][THUWC2017]在美妙的数学王国中畅游:Link-Cut Tree+泰勒展开的更多相关文章
- 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)
[BZOJ5020][THUWC2017]在美妙的数学王国中畅游(Link-Cut Tree,组合数学) 题解 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙 ...
- [THUWC2017]在美妙的数学王国中畅游
[THUWC2017]在美妙的数学王国中畅游 e和sin信息不能直接合并 泰勒展开,大于21次太小,认为是0,保留前21次多项式即可 然后就把e,sin ,kx+b都变成多项式了,pushup合并 上 ...
- [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(LCT)
5020: [THUWC 2017]在美妙的数学王国中畅游 Time Limit: 80 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 323 ...
- 并不对劲的bzoj5020:loj2289:p4546:[THUWC2017]在美妙的数学王国中畅游
题目大意 有一个n(\(n\leq 10^5\))个点的森林,每个点\(u\)上有个函数\(f_u(x)\),是形如\(ax+b\)或\(e^{ax+b}\)或\(sin(ax+b)\)的函数,保证当 ...
- Luogu4546 THUWC2017 在美妙的数学王国中畅游 LCT、泰勒展开
传送门 题意:反正就是一堆操作 LCT总是和玄学东西放在一起我们不妨令$x_0=0.5$(其实取什么都是一样的,但是最好取在$[0,1]$的范围内),将其代入给出的式子,我们得到的$f(x)$的式子就 ...
- [THUWC2017]在美妙的数学王国中畅游 LCT+泰勒展开+求导
p.s. 复合函数求导时千万不能先带值,再求导. 一定要先将符合函数按照求导的规则展开,再带值. 设 $f(x)=g(h(x))$,则对 $f(x)$ 求导: $f'(x)=h'(x)g'(h(x)) ...
- 题解 洛谷 P4546 【[THUWC2017]在美妙的数学王国中畅游】
首先发现有连边和删边的操作,所以我们肯定要用\(LCT\)来进行维护. 接下来考虑如何进行\(LCT\)上的信息合并. \(f=1\),则函数为\(f(x)=sin(ax+b)\) \(f=2\),则 ...
- Luogu P4546 [THUWC2017]在美妙的数学王国中畅游
题意 题意奇奇怪怪,这里就不写了. \(\texttt{Data Range:}1\leq n\leq 10^5,1\leq m\leq 2\times 10^5\) 题解 为什么你们都是卡在数学方面 ...
- 洛谷P4546 [THUWC2017]在美妙的数学王国中畅游 [LCT,泰勒展开]
传送门 毒瘤出题人卡精度-- 思路 看到森林里加边删边,容易想到LCT. 然而LCT上似乎很难实现往一条链里代一个数进去求和,怎么办呢? 善良的出题人在下方给了提示:把奇怪的函数泰勒展开搞成多项式,就 ...
随机推荐
- java基础/数据加解密(Mooc)
一.消息摘要算法 常用摘要算法: 以下 (HEX)内容:bc指Bouncy Castle | cc指:Apache commons Codec 1.消息摘要算法MD5及MD族(MD2,MD4) 消 ...
- PHP5和PHP7引用对比(笔记)
php5在引入引用计数后,使用了refcount_gc来记录次数,同时使用is_ref_gc来记录是否是引用类型. 例如 $a = 'hello'; //$a->zval1(type=IS_ST ...
- index.html(xpath素材)
<bookstore> <title>新华书店</title> <book href="http://www.langlang2017.com/&q ...
- 第六周课程总结&实验报告
一.实验目的 (1)掌握类的继承 (2)变量的继承和覆盖,方法的继承,重载和覆盖的实现: 二.实验的内容 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆 ...
- java主方法组成分析
public static void main(String args[]) public :是一种访问权限,主方法是一切的开始点,开始点一定是公共的 static :表示此方法可由类直接调用 voi ...
- Mybatis-学习笔记(4)1对1、1对多、多对多
1.1对1 有2种方式对内嵌Bean设值: 1>关联查询就一条语句.使用association关键字,直接将嵌套对象的映射表的字段赋值内嵌对象. <association property ...
- Labview 错误1400-打包库封装类时将对类重命名导致
现象 今天遇到了一个神奇的BUG,主程序调用了一个包含类的打包库,打包库中将字符串还原为类句柄时报错. 调用程序结构如下:. 主程序中将类句柄转化为XML字符串程序如下: 打包库内将字符串还原为句柄程 ...
- 1、Java语言概述与开发环境——编译和运行第一个程序HelloWorld.java
编写一个Java程序到运行的步骤概述: 1.将Java代码编写到扩展名为.Java的文件中 2.通过Javac命令对该Java文件进行编译 3.通过Java命令对生成的class文件进行运行 一.编写 ...
- 搜索专题: HDU1258Sum It Up
Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- vue-sticky组件详解
sticky简介 sticky的本意是粘的,粘性的,使用其进行的布局被称为粘性布局. sticky是position属性新推出的值,属于CSS3的新特性,常用与实现吸附效果. 设置了sticky布局的 ...