咕咕咕?咕咕咕!

题意:

Description

数字和数学规律主宰着这个世界。

机器的运转,

生命的消长,

宇宙的进程,

这些神秘而又美妙的过程无不可以用数学的语言展现出来。

这印证了一句古老的名言:

“学好数理化,走遍天下都不怕。”

学渣小R被大学的数学课程虐得生活不能自理,微积分的成绩曾是他在教室里上的课的最低分。然而他的某位陈姓室友却能轻松地在数学考试中得到满分。为了提升自己的数学课成绩,有一天晚上(在他睡觉的时候),他来到了数学王国。

数学王国中,每个人的智商可以用一个属于 [0,1]的实数表示。数学王国中有 n 个城市,编号从 0 到 n−1 ,这些城市由若干座魔法桥连接。每个城市的中心都有一个魔法球,每个魔法球中藏有一道数学题。每个人在做完这道数学题之后都会得到一个在 [0,1] 区间内的分数。一道题可以用一个从 [0,1] 映射到 [0,1]的函数 f(x) 表示。若一个人的智商为 x ,则他做完这道数学题之后会得到 f(x)分。函数 f有三种形式:

正弦函数 sin(ax+b) (a∈[0,1],b∈[0,π],a+b∈[0,π])

指数函数 e^(ax+b) (a∈[−1,1],b∈[−2,0],a+b∈[−2,0])

一次函数 ax+b (a∈[−1,1],b∈[0,1],a+b∈[0,1]

数学王国中的魔法桥会发生变化,有时会有一座魔法桥消失,有时会有一座魔法桥出现。但在任意时刻,只存在至多一条连接任意两个城市的简单路径(即所有城市形成一个森林)。在初始情况下,数学王国中不存在任何的魔法桥。

数学王国的国王拉格朗日很乐意传授小R数学知识,但前提是小R要先回答国王的问题。这些问题具有相同的形式,即一个智商为 x 的人从城市 u 旅行到城市 v(即经过 u 到 v 这条路径上的所有城市,包括 u和 v )且做了所有城市内的数学题后,他所有得分的总和是多少。

Input

第一行两个正整数 n,m 和一个字符串 type 。

表示数学王国中共有 n 座城市,发生了 m 个事件,该数据的类型为 type 。

typet 字符串是为了能让大家更方便地获得部分分,你可能不需要用到这个输入。

其具体含义在【数据范围与提示】中有解释。

接下来 n 行,第 i 行表示初始情况下编号为 i 的城市的魔法球中的函数。

一个魔法用一个整数 f表示函数的类型,两个实数 a,b 表示函数的参数,若

f=1,则函数为 f(x)=sin(ax+b)(a∈[0,1],b∈[0,π],a+b∈[0,π])

f=2,则函数为 f(x)=e^(ax+b)(a∈[−1,1],b∈[−2,0],a+b∈[−2,0])

f=3,则函数为 f(x)=ax+b(a∈[−1,1],b∈[0,1],a+b∈[0,1])

接下来 m行,每行描述一个事件,事件分为四类。

appear u v 表示数学王国中出现了一条连接 u 和 v 这两座城市的魔法桥 (0≤u,v<n,u≠v) ,保证连接前 u和 v 这两座城市不能互相到达。

disappear u v 表示数学王国中连接 u 和 v 这两座城市的魔法桥消失了,保证这座魔法桥是存在的。

magic c f a b 表示城市 c 的魔法球中的魔法变成了类型为 f ,参数为 a,b 的函数

travel u v x 表示询问一个智商为 x 的人从城市 u 旅行到城市 v

(即经过 u到 v 这条路径上的所有城市,包括 u 和 v )后,他得分的总和是多少。

若无法从 u 到达 v ,则输出一行一个字符串 unreachable。

1≤n≤100000,1≤m≤200000

Output

对于每个询问,输出一行实数,表示得分的总和。

Hint

【小R教你学数学】

若函数$f(x)$的$n$阶导数在$[a,b]$区间内连续,则对$f(x)$在$x_0(x_0∈[a,b])$处使用$n$次拉格朗日中值定理可以得到带拉格朗日余项的泰勒展开式:

$$f(x)=f(x_0)+\frac{f^{'}(x_0)(x-x_0)}{1!}+\frac{f^{''}(x_0)(x-x_0)^2}{2!}+\cdots +\frac{f^{(n-1)}(x_0)(x-x_0)^{n-1}}{(n-1)!}+\frac{f^{(n)}(\xi)(x-x_0)^n}{n!}$$

$$x∈[a,b]$$

其中,当$x>x_0$时,$\xi∈[x_0,x]$。当$x<x_0$时,$\xi∈[x,x_0]$

$f^{(n)}$表示函数$f$的$n$阶导数

题解:

提示直接告诉你做法啊……

LCT维护操作谁都会,主要是维护这三个函数的值;

首先根据提示把三个函数分别泰勒展开,若干项之后误差就会很小,实测取十五位就可以满足精度要求;

考虑询问,要求的实际上就是$\sum\limits_{i∈<u,v>}F(x)$(其中$x$表示那个人的智商);

因此$x$是一个定值,泰勒展开式里每一项的$\frac{(x-x_0)^i}{i!}$可以直接提取出来,LCT维护每个点子树中所有函数的0到15阶导之和,计算答案时再乘回去就行了;

具体实现我选了在$x=1/2$处展开;

时间复杂度$O(15nlogn)$,常数略大

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
typedef double db;
const double pi=acos(-1.0);
const double e=pow(,/log());
struct node{
int fa,rev,son[];
db s[];
}t[];
int n,m,x,y,top,st[],f[];
db ans,k,t1,t2,a[],b[];
char ty[];
void updata(int u){
if(f[u]==){
t[u].s[]=sin(a[u]*.+b[u]);
t[u].s[]=cos(a[u]*.+b[u])*a[u];
for(int i=;i<;i++){
t[u].s[i]=-t[u].s[i-]*(a[u]*a[u]);
}
}else if(f[u]==){
t[u].s[]=pow(e,a[u]*.+b[u]);
for(int i=;i<;i++){
t[u].s[i]=t[u].s[i-]*a[u];
}
}else{
t[u].s[]=a[u]*.+b[u];
t[u].s[]=a[u];
for(int i=;i<;i++)t[u].s[i]=;
}
for(int i=;i<;i++){
t[u].s[i]+=t[t[u].son[]].s[i]+t[t[u].son[]].s[i];
}
}
bool ntrt(int u){
return t[t[u].fa].son[]==u||t[t[u].fa].son[]==u;
}
bool sn(int u){
return t[t[u].fa].son[]==u;
}
void getr(int u){
swap(t[u].son[],t[u].son[]);
t[u].rev^=;
}
void pushr(int u){
if(t[u].rev){
if(t[u].son[])getr(t[u].son[]);
if(t[u].son[])getr(t[u].son[]);
t[u].rev=;
}
}
void rotate(int u){
int f=t[u].fa,ff=t[f].fa,ch=sn(u),cf=sn(f);
if(ntrt(f))t[ff].son[cf]=u;
t[f].son[ch]=t[u].son[ch^];
t[t[f].son[ch]].fa=f;
t[u].son[ch^]=f;
t[f].fa=u;
t[u].fa=ff;
updata(f);
updata(u);
}
void splay(int u){
st[top=]=u;
for(int nw=u;ntrt(nw);nw=t[nw].fa)st[++top]=t[nw].fa;
while(top)pushr(st[top--]);
for(;ntrt(u);rotate(u)){
int f=t[u].fa;
if(ntrt(f)){
rotate(sn(u)^sn(f)?u:f);
}
}
}
void access(int u){
for(int nw=;u;nw=u,u=t[u].fa){
splay(u);
t[u].son[]=nw;
updata(u);
}
}
void mkroot(int u){
access(u);
splay(u);
getr(u);
}
void split(int u,int v){
mkroot(u);
access(v);
splay(v);
}
void link(int u,int v){
mkroot(u);
t[u].fa=v;
}
void cut(int u,int v){
split(u,v);
t[u].fa=t[v].son[]=;
updata(v);
}
int getroot(int u){
access(u);
splay(u);
while(t[u].son[]){
pushr(u);
u=t[u].son[];
}
return u;
}
int main(){
scanf("%d%d%s",&n,&m,ty);
for(int i=;i<=n;i++){
scanf("%d%lf%lf",&f[i],&a[i],&b[i]);
}
for(int i=;i<=m;i++){
scanf("%s",ty);
if(ty[]=='a'){
scanf("%d%d",&x,&y);
x++,y++;
link(x,y);
}else if(ty[]=='d'){
scanf("%d%d",&x,&y);
x++,y++;
cut(x,y);
}else if(ty[]=='m'){
scanf("%d",&x);
x++;
mkroot(x);
scanf("%d%lf%lf",&f[x],&a[x],&b[x]);
updata(x);
}else{
scanf("%d%d%lf",&x,&y,&k);
x++,y++;
if(getroot(x)!=getroot(y))puts("unreachable");
else{
ans=;
t1=t2=;
split(x,y);
for(int i=;i<;i++){
ans+=t[y].s[i]*t2/t1;
t1*=(i+);
t2*=(k-.);
}
printf("%.8e\n",ans);
}
}
}
return ;
}

【BZOJ5020】[LOJ2289]【THUWC2017】在美妙的数学王国中畅游 - LCT+泰勒展开的更多相关文章

  1. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)

    Description 数字和数学规律主宰着这个世界.   机器的运转,   生命的消长,   宇宙的进程,   这些神秘而又美妙的过程无不可以用数学的语言展现出来.   这印证了一句古老的名言:   ...

  2. [THUWC2017]在美妙的数学王国中畅游 LCT+泰勒展开+求导

    p.s. 复合函数求导时千万不能先带值,再求导. 一定要先将符合函数按照求导的规则展开,再带值. 设 $f(x)=g(h(x))$,则对 $f(x)$ 求导: $f'(x)=h'(x)g'(h(x)) ...

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

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

  4. 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游 LCT 泰勒展开

    题目大意 给你一棵树,每个点有一个函数\(f(x)\) 正弦函数 \(\sin(ax+b) (a\in[0,1],b\in[0,\pi],a+b\in[0,\pi])\) 指数函数 \(e^{ax+b ...

  5. [THUWC2017][bzoj5020] 在美妙的数学王国中畅游 [LCT+泰勒展开]

    题面 LOJ传送门 思路 这里很重要 它提示我们,把给定的三个函数泰勒展开,并用LCT维护每一项泰勒展开式的值,维护十几项就满足了题目的精度要求 我们考虑一个函数在0位置的泰勒展开 $f(x)=\su ...

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

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

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

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

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

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

  9. Luogu4546 THUWC2017 在美妙的数学王国中畅游 LCT、泰勒展开

    传送门 题意:反正就是一堆操作 LCT总是和玄学东西放在一起我们不妨令$x_0=0.5$(其实取什么都是一样的,但是最好取在$[0,1]$的范围内),将其代入给出的式子,我们得到的$f(x)$的式子就 ...

随机推荐

  1. class一些内置方法

    一. __getattribute__ class Foo: def __init__(self,x): self.x=x def __getattr__(self, item): print('执行 ...

  2. ios高效开发二--ARC跟block那点事

    block是可以捕捉上下文的特殊代码块. block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本. 如果通过self拥有一个block,然后 ...

  3. python第二周:数据类型、列表、字典

    1.模块初识: sys模块: import sys print(sys.path) #path打印环境变量--> ['F:\\python学习\\projects\\s14\\day2', 'F ...

  4. 在WPF的MVVM框架中获取下拉选择列表中的选中项

    文章概述: 本演示介绍怎样在WPF的MVVM框架中.通过数据绑定的方式获取下拉列表中的选中项.程序执行后的效果例如以下图所看到的: 相关下载(代码.屏幕录像):http://pan.baidu.com ...

  5. HDU 3292

    快速幂模+佩尔方程 #include <iostream> #include <cstdio> #include <algorithm> #include < ...

  6. [Performance] Optimize Paint and Composite for the website

    "Paint" is one of the most preference killer, it can easily cost more than 60fps, and once ...

  7. 【手势交互】6. 微动VID

    中国 天津 http://www.sharpnow.com/ 微动VID是天津锋时互动科技有限公司开发的中国Leap Motion. 它能够识别并跟踪用户手部的姿态.包含:指尖和掌心的三维空间位置:手 ...

  8. Mysql第四天 数据库设计

    不考虑主备.集群等方案,基于业务上的设计主要是表结构及表间关系的设计. 而关于表中字段主要是依据业务来进行定义,我们能够指定的大概有这么几项: 存储引擎 一般用InnoDB,特殊需求特殊选用 字符集和 ...

  9. (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  M ...

  10. redis windows安装与使用

    是什么 Redis(Remote Dictionary Server)远程字典服务器 开源免费 C语言编写的 key/value分布式内存数据库,基于内存运行 Redis支持数据的持久化,可以将内存中 ...