题目大意

有一个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. 洛谷P1432 倒水问题

    题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with th ...

  2. CSS属性操作二

    9.float属性 基本浮动规则 先来了解一下block元素和inline元素在文档流中的排列方式. block元素通常被现实为独立的一块,独占一行,多个block元素会各自新起一行,默认block元 ...

  3. Eventquery.vbs

    https://docs.microsoft.com/en-us/previous-versions/orphan-topics/ws.10/cc772995(v=ws.10)

  4. UVA 11806 组合数学+容斥

    UVA: https://vjudge.net/problem/UVA-11806 AC代码 #include <bits/stdc++.h> #define pb push_back # ...

  5. Cooking Schedule Problem Code: SCHEDULE(优先队列)

    Cooking Schedule Problem Code: SCHEDULE Chef is a well-known chef, and everyone wishes to taste his ...

  6. 2017CodeM复赛

    A.配对游戏(loj6191) 题目: https://loj.ac/problem/6191 分析: g[i][j]表示前i个位置尽可能合并,合并到最后右边剩下j个>,这样情况的概率 那么g[ ...

  7. Spring基于注解的配置概述

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/annotation-based-configuration.html: 从Spring 2.5开始 ...

  8. Oracle 用户表空间查看、修改大小、设置自增长等

      分类: Oracle 首先登入某个用户,查看某个用户在哪个表空间下: select username,default_tablespace from user_users; 查看该用户下所有的表: ...

  9. C\C++中strcat()函数、sprintf函数

    http://blog.csdn.net/smf0504/article/details/52055971 http://c.biancheng.net/cpp/html/295.html

  10. 原来,表名和字段名不能在pdo中“参数化查询”

    https://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-or-column-name-as ...