题目大意

有一个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. CF778A:String Game

    给出字符串s和t,以及s的长度n的一个全排列,求按照这个排列依次删除s的字符,删到何时s中不含子序列t. 解法一: t中的每个字符的位置在s中跳啊跳,合法的情况下t中的字符在s中的位置应该是单调递增的 ...

  2. 解决Flex4在Module里调用PopUpManager报错问题

    项目大了 就需要用到Module, 发现在一个Module里边, 和普通应用里一样popup一个组件的时候, 总是会报错. 这个在Flex3的时候也会出现, 会报样式错误 所以就想到了addPopUp ...

  3. HDU 5521 Meeting【最短路】

    今天旁观了Angry_Newbie的模拟区域赛(2015shenyang) 倒着看最先看的M题,很明显的最短路问题,在我看懂的时候他们已经开始敲B了. 后来听说D过了很多人.. D题一看是个博弈,给了 ...

  4. Delphi接口使用实例介绍

    对于Object Pascal语言来说,最近一段时间最有意义的改进就是从Delphi3开始支持接口(interface),接口定义了能够与一个对象进行交互操作的一组过程和函数.对一个接口进行定义包含两 ...

  5. Java中的数字

    以下内容引用自http://wiki.jikexueyuan.com/project/java/numbers.html: 通常情况下,当处理数字时,使用原始数据类型,如byte,int,long,d ...

  6. Spring的Web MVC框架

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/web-mvc-framework.html: Spring web MVC框架提供了模型-视图-控 ...

  7. jq自定义裁剪,代码超级简单,易修改

    1.自定义宽高效果 1.html 代码  index.html <!DOCTYPE html> <html lang="en"> <head> ...

  8. Callable线程

    写一个Callable线程 import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; im ...

  9. javax/servlet/ServletContext : Unsupported major.minor version 51.0

    原文:http://blog.csdn.net/mlin_123/article/details/50738532 解决:将版本从 3.1.0 改为 3.0.1 <!-- 添加servlet A ...

  10. 【c++】c++一些基础面试题

    http://www.mianwww.com/html/2013/10/19128.html http://blog.csdn.net/wdzxl198/article/details/9050751 ...