题目大意

有一个n(\(n\leq 10^5\))个点的森林,每个点\(u\)上有个函数\(f_u(x)\),是形如\(ax+b\)或\(e^{ax+b}\)或\(sin(ax+b)\)的函数,保证当\(x\in[0,1]\)时,\(f_u(x)\in[0,1]\)

有\(q(q\leq 2*10^5)\)个操作,每个操作是以下三个中的一个:

1.连接一条边,保证这条边的两个端点之前不连通

2.切断一条边,保证这条边存在

3.查询,给出\(u,v,x(u,x\leq n, 0\leq x \leq 1)\),表示从\(u\)到\(v\)每个点\(a\)的\(f_a(x)\)之和

题解

要维护一个森林,支持连边、删边,很可能是用LCT做

如果只有第一类函数,那么直接算出\(u\)到\(v\)路径上所有点的一次项系数和零次项系数之和就行

所以将后两类函数转化成多项式函数

可以用泰勒展开,算出十几项,精度基本上就够了

代码
#include<algorithm>
#include<cmath>
#include<complex>
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#define rep(i,x,y) for(int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(int i=(x);i>=(y);--i)
#define D double
#define maxn 100010
#define ls son[u][0]
#define rs son[u][1]
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x==0){putchar('0'),putchar('\n');return;}
if(x<0)putchar('-'),x=-x;
char ch[20];int f=0;
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');return;
}
D key[maxn][20],sum[maxn][20];
int son[maxn][2],fa[maxn],s[maxn],re[maxn],tp,lim=15;
void pu(int u)
{
rep(i,0,lim)sum[u][i]=key[u][i];
if(ls)rep(i,0,lim)sum[u][i]+=sum[ls][i];
if(rs)rep(i,0,lim)sum[u][i]+=sum[rs][i];
return;
}
void mark(int u){if(u)swap(ls,rs),re[u]^=1;}
void pd(int u){if(re[u])mark(ls),mark(rs),re[u]=0;}
int nort(int u){return son[fa[u]][0]==u||son[fa[u]][1]==u;}
int getso(int u){return son[fa[u]][0]!=u;}
void rot(int u)
{
int fu=fa[u],ffu=fa[fu],l=getso(u),fl=getso(fu),r=l^1,rson=son[u][r];
if(nort(fu))son[ffu][fl]=u;son[fu][l]=rson,son[u][r]=fu,fa[rson]=fu,fa[u]=ffu,fa[fu]=u;
pu(fu),pu(u);
}
void splay(int u)
{
int v=u;s[tp=1]=u;while(nort(v))s[++tp]=v=fa[v];while(tp)pd(s[tp--]);
while(nort(u)){int fu=fa[u];if(nort(fu))rot(getso(u)^getso(fu)?u:fu);rot(u);}
}
void acs(int u){for(int v=0;u;v=u,u=fa[u])splay(u),rs=v,pu(u);}
void chrt(int u){acs(u),splay(u),mark(u);}
int getrt(int u){acs(u),splay(u);while(ls)u=ls;return u;}
void link(int u,int v){chrt(u);fa[u]=v;}
void cut(int u,int v){chrt(u),acs(v),splay(v);son[v][0]=fa[u]=0;}
int getrd(int u,int v){chrt(u);if(getrt(v)!=u)return 0;acs(v),splay(v);return v;}
int n,m;
D po[20];
char typ[20];
int main()
{
scanf("%d%d%s",&n,&m,typ);po[0]=1;
rep(i,1,lim)po[i]=po[i-1]*1.0*i;
rep(i,1,n)
{
int x;D a,b;
scanf("%d%lf%lf",&x,&a,&b);
if(x==1)
{
D val=1,Sin=sin(b),Cos=cos(b);
for(int j=0;j<=lim;j+=4)
{
key[i][j]=Sin*val;val*=a;
key[i][j+1]=Cos*val;val*=a;
key[i][j+2]=-Sin*val;val*=a;
key[i][j+3]=-Cos*val;val*=a;
}
}
else if(x==2)
{
D val=exp(b);key[i][0]=val;
for (int j=1;j<=lim;++j)val*=a,key[i][j]=val;
}
else{key[i][0]=b,key[i][1]=a;}
}
while(m--)
{
scanf("%s",typ);
if(typ[0]=='a'){int u=read()+1,v=read()+1;link(u,v);}
else if(typ[0]=='d'){int u=read()+1,v=read()+1;cut(u,v);}
else if(typ[0]=='m')
{
int c=read()+1,f=read();D a,b;scanf("%lf%lf",&a,&b);
splay(c);
rep(i,0,lim)key[c][i]=0;
if(f==1)
{
D val=1,Sin=sin(b),Cos=cos(b);
for(int j=0;j<=lim;j+=4)
{
key[c][j]=Sin*val;val*=a;
key[c][j+1]=Cos*val;val*=a;
key[c][j+2]=-Sin*val;val*=a;
key[c][j+3]=-Cos*val;val*=a;
}
}
else if(f==2)
{
D val=exp(b);key[c][0]=val;
for (int j=1;j<=lim;++j)val*=a,key[c][j]=val;
}
else{key[c][0]=b,key[c][1]=a;}
pu(c);
}
else if(typ[0]=='t')
{
int u=read()+1,v=read()+1;D x,now=1.0,ans=0;scanf("%lf",&x);
int f=getrd(u,v);
if(!f)puts("unreachable");
else
{
rep(i,0,lim)ans+=sum[f][i]*now/po[i],now*=x;
printf("%.8e\n",ans);
}
}
}
return 0;
}

并不对劲的bzoj5020:loj2289:p4546:[THUWC2017]在美妙的数学王国中畅游的更多相关文章

  1. 洛谷P4546 [THUWC2017]在美妙的数学王国中畅游 [LCT,泰勒展开]

    传送门 毒瘤出题人卡精度-- 思路 看到森林里加边删边,容易想到LCT. 然而LCT上似乎很难实现往一条链里代一个数进去求和,怎么办呢? 善良的出题人在下方给了提示:把奇怪的函数泰勒展开搞成多项式,就 ...

  2. P4546 [THUWC2017]在美妙的数学王国中畅游

    如果只有第3个操作,那么这就是个sd题,随便lct搞搞就过去了 然后就是一个神仙东西 taylor公式 我不会,看gsy博客https://www.cnblogs.com/zhoushuyu/p/81 ...

  3. bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5020 https://loj.ac/problem/2289 题解 这个 appear 和 d ...

  4. Luogu P4546 [THUWC2017]在美妙的数学王国中畅游

    题意 题意奇奇怪怪,这里就不写了. \(\texttt{Data Range:}1\leq n\leq 10^5,1\leq m\leq 2\times 10^5\) 题解 为什么你们都是卡在数学方面 ...

  5. [THUWC2017]在美妙的数学王国中畅游

    [THUWC2017]在美妙的数学王国中畅游 e和sin信息不能直接合并 泰勒展开,大于21次太小,认为是0,保留前21次多项式即可 然后就把e,sin ,kx+b都变成多项式了,pushup合并 上 ...

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

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

  7. [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(LCT)

    5020: [THUWC 2017]在美妙的数学王国中畅游 Time Limit: 80 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 323  ...

  8. BZOJ5020 THUWC2017在美妙的数学王国中畅游(LCT)

    明摆着的LCT,问题在于如何维护答案.首先注意到给出的泰勒展开式,并且所给函数求导非常方便,肯定要用上这玩意.容易想到展开好多次达到精度要求后忽略余项.因为x∈[0,1]而精度又与|x-x0|有关,当 ...

  9. [LOJ2289][THUWC2017]在美妙的数学王国中畅游:Link-Cut Tree+泰勒展开

    分析 又有毒瘤出题人把数学题出在树上了. 根据泰勒展开,有: \[e^x=1+\frac{1}{1!}x+\frac{1}{2!}x^2+\frac{1}{3!}x^3+...\] \[sin(x)= ...

随机推荐

  1. Poj3253:Fence Repair 【贪心 堆】

    题目大意:背景大概是个资本家剥削工人剩余价值的故事....有一块木板,要把它切成几个长度,切一次的费用是这整块被切木板的长度,例如将一个长度为21的木板切成2和19两块费用为21,切成两块的长度及顺序 ...

  2. 常见Bean映射工具分析评测及Orika介绍

    原地址:http://tech.dianwoda.com/2017/11/04/gao-xing-neng-te-xing-feng-fu-de-beanying-she-gong-ju-orika/ ...

  3. gcc,gdb基础学习2

    gdb调试: 源文件:test.cc >>g++ -g test.cc -o test.o  这里需要参数-g,因为接下来要使用gdb进行调试,生成目标文件test·o 因为需要将调试信息 ...

  4. Android基本动画

    Android基本动画 Android Animations动画使用详解 一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XM ...

  5. POJ 2109 Power of Cryptography【高精度+二分 Or double水过~~】

    题目链接: http://poj.org/problem?id=2109 参考: http://blog.csdn.net/code_pang/article/details/8263971 题意: ...

  6. Org-mode五分钟教程ZZZ

    Table of Contents 1 源起 2 简介 2.1 获取 org-mode 2.2 安装 3 基础用法 3.1 创建一个新文件 3.2 简单的任务列表 3.3 使用标题组织一篇文章 3.4 ...

  7. SD/MMC的Commands和Responses的总结

    SD总线通信是基于指令和数据比特流,起始位開始和停止位结束. SD总线通信有三个元素:1.Command:由host发送到卡设备.使用CMD线发送. 2.Response:从card端发送到host端 ...

  8. 磁盘显示为GPT(保护分区)

    问题描述:PE进入系统,在计算机管理里面磁盘显示为GPT(保护分区).此时硬盘是不能重新分区或者格式化的. 解决思路:低版本的WIndows(PE)是不支持GPT分区的,我们需要使用系统自带的Disk ...

  9. 成员函数指针 C++ FAQ LITE — Frequently Asked Questions

    http://www.sunistudio.com/cppfaq/pointers-to-members.html C++ FAQ LITE — Frequently Asked Questions ...

  10. 精通CSS:高级Web标准解决方式(第2版)

    精通CSS:高级Web标准解决方式(第2版) 跳转至: 导航. 搜索 层叠重要度:(也就是说.用户!important能够覆盖inline style) !important.用户>作者.最后是 ...