【LOJ】#2289. 「THUWC 2017」在美妙的数学王国中畅游
题解
我们发现,题目告诉我们这个东西就是一个lct
首先,如果只有3,问题就非常简单了,我们算出所有a的总和,所有b的总和就好了
要是1和2也是多项式就好了……其实可以!也就是下面泰勒展开的用处,我们可以用一个多项式取逼近这个函数,而且,多项式次数越高越准确,我们大概到13次多项式就好了
如何创造出这个多项式呢,泰勒展开的式子是这样的
\(\sum_{i = 0}^{n} \frac{f^{(i)}(x_{0}) (x - x_{0})^{i}}{i!}\)
其中\(f^{(i)}(x)\)表示\(f(x)\)的\(i\)阶导数
然后问题就变成了维护13个值的和的lct了
然后,如何求导
根据高中选修2-2
我们有
\(f(g(x)) = g'(x)f'(g(x))\)
对于第一类型的函数
\(sin^{(1)}(ax + b) = a\cdot cos(ax + b)\)
\(sin^{(2)}(ax + b) = -a^{2}\cdot sin(ax + b)\)
\(sin^{(3)}(ax + b) = -a^{3}\cdot cos(ax + b)\)
\(sin^{(4)}(ax + b) = a^{4}\cdot sin(ax + b)\)
4次一个轮回
对于第二类型的函数
\(f(x)^{(1)} = a\cdot e^{ax + b}\)
\(f(x)^{(2)} = a^{2}\cdot e^{ax + b}\)
\(f(x)^{(n)} = a^{n}\cdot e^{ax + b}\)
= =lct的cut是,先把一个点变成根,另一个点Access一下,再Splay成根,然后断掉根节点的左儿子
代码
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
//#define ivorysi
#define pb push_back
#define MAXN 100005
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long int64;
typedef double db;
int N,M;
char s[25];
db fac[20];
struct Tr {
Tr *lc,*rc,*fa;
db sum[14],f[14];
bool rev;
void Update() {
for(int i = 0 ; i <= 13 ; ++i) sum[i] = f[i];
if(lc) for(int i = 0 ; i <= 13 ; ++i) sum[i] += lc->sum[i];
if(rc) for(int i = 0 ; i <= 13 ; ++i) sum[i] += rc->sum[i];
}
void Reverse() {
rev ^= 1;swap(lc,rc);
}
void Pushdown() {
if(rev) {
if(lc) lc->Reverse();
if(rc) rc->Reverse();
rev = 0;
}
}
}*tr[MAXN];
bool which(Tr *u) {
return u == u->fa->rc;
}
bool isRoot(Tr *u) {
if(!u->fa) return 1;
return u->fa->rc != u && u->fa->lc != u;
}
void Rotate(Tr *u) {
Tr *v = u->fa,*w = v->fa;
Tr *b = u == v->lc ? u->rc : u->lc;
if(!isRoot(v)) (v == w->lc ? w->lc : w->rc) = u;
u->fa = w;v->fa = u;
if(b) b->fa = v;
if(u == v->lc) v->lc = b,u->rc = v;
else v->rc = b,u->lc = v;
v->Update();
}
void Splay(Tr *u) {
static Tr* que[MAXN];
int tot = 0;Tr *x;
for(x = u ; !isRoot(x) ; x = x->fa) que[++tot] = x;
que[++tot] = x;
for(int i = tot ; i >= 1 ; --i) que[i]->Pushdown();
while(!isRoot(u)) {
if(!isRoot(u->fa)) {
if(which(u->fa) == which(u)) Rotate(u->fa);
else Rotate(u);
}
Rotate(u);
}
u->Update();
}
void Access(Tr *u) {
for(Tr *x = NULL ; u ; x = u, u = u->fa) {
Splay(u);
u->rc = x;
u->Update();
}
}
Tr* FindRoot(Tr *u){
Access(u);Splay(u);
Tr *res = u;
res->Pushdown();
while(res->lc) {res = res->lc;res->Pushdown();}
return res;
}
void MakeRoot(Tr *u) {Access(u);Splay(u);u->Reverse();}
void Link(Tr *u,Tr *v) {MakeRoot(u);u->fa = v;}
void Cut(Tr *u,Tr *v) {MakeRoot(u);Access(v);Splay(v);v->lc = u->fa = 0;v->Update();}
db Select(Tr *u,Tr *v,db x) {
MakeRoot(u);Access(v);Splay(u);
db res = 0,t = 1;
for(int i = 0 ; i <= 13 ; ++i) {
res += t * u->sum[i];
t *= x;
}
return res;
}
void Change(Tr *u,int ty,db a,db b) {
MakeRoot(u);
memset(u->f,0,sizeof(u->f));
if(ty == 1) {
db x = 1;
for(int i = 0 ; i <= 13 ; ++i) {
if(i % 4 == 0) u->f[i] = x * sin(b) / fac[i];
if(i % 4 == 1) u->f[i] = x * cos(b) / fac[i];
if(i % 4 == 2) u->f[i] = -x * sin(b) / fac[i];
if(i % 4 == 3) u->f[i] = -x * cos(b) / fac[i];
x *= a;
}
}
else if(ty == 2) {
db v = exp(b),x = 1;
for(int i = 0 ; i <= 13 ; ++i) {u->f[i] = v * x / fac[i];x *= a;}
}
else {
u->f[1] = a;u->f[0] = b;
}
u->Update();
}
void Solve() {
scanf("%d%d",&N,&M);
scanf("%s",s + 1);
fac[0] = 1;
for(int i = 1 ; i <= 13 ; ++i) fac[i] = fac[i - 1] * i;
int f,u,v;db a,b;
for(int i = 1 ; i <= N ; ++i) {
tr[i] = new Tr;tr[i]->lc = tr[i]->rc = tr[i]->fa = 0;
scanf("%d%lf%lf",&f,&a,&b);
Change(tr[i],f,a,b);
}
for(int i = 1 ; i <= M ; ++i) {
scanf("%s",s + 1);
if(s[1] == 'a' || s[1] == 'd') {
scanf("%d%d",&u,&v);++u;++v;
if(s[1] == 'a') Link(tr[u],tr[v]);
if(s[1] == 'd') Cut(tr[u],tr[v]);
}
else if(s[1] == 'm') {
scanf("%d%d%lf%lf",&u,&f,&a,&b);++u;
Change(tr[u],f,a,b);
}
else {
scanf("%d%d%lf",&u,&v,&a);++u;++v;
if(FindRoot(tr[u]) != FindRoot(tr[v])) puts("unreachable");
else printf("%.8e\n",Select(tr[u],tr[v],a));
}
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
【LOJ】#2289. 「THUWC 2017」在美妙的数学王国中畅游的更多相关文章
- @loj - 2289@「THUWC 2017」在美妙的数学王国中畅游
目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个点编号 0 到 n-1,每个点有一个从 [0,1] 映射到 ...
- 「LOJ 2289」「THUWC 2017」在美妙的数学王国中畅游——LCT&泰勒展开
题目大意: 传送门 给一个动态树,每个节点上维护一个函数为$f(x)=sin(ax+b)$.$f(x)=e^{ax+b}$.$f(x)=ax+b$中的一个. 支持删边连边,修改节点上函数的操作. 每次 ...
- 「THUWC 2017」在美妙的数学王国中畅游
这个题目很明显在暗示你要用泰勒展开. 直接套上去泰勒展开的式子,精度的话保留12项左右即可. 分别维护每一项的和,可能比较难写吧. 然后强行套一个LCT就没了.
- 【THUWC 2017】在美妙的数学王国中畅游
数学王国里有n座城市,每座城市有三个参数\(f\),\(a\),\(b\),一个智商为\(x\)的人经过一座城市的获益\(f(x)\)是 若\(f=1\),则\(f(x)=\sin(ax+b)\): ...
- LOJ 2288「THUWC 2017」大葱的神力
LOJ 2288「THUWC 2017」大葱的神力 Link Solution 比较水的提交答案题了吧 第一个点爆搜 第二个点爆搜+剪枝,我的剪枝就是先算出 \(mx[i]\) 表示选取第 \(i \ ...
- 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT
[BZOJ5020][THUWC 2017]在美妙的数学王国中畅游 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数 ...
- [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(LCT)
5020: [THUWC 2017]在美妙的数学王国中畅游 Time Limit: 80 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 323 ...
- 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)
[BZOJ5020][THUWC2017]在美妙的数学王国中畅游(Link-Cut Tree,组合数学) 题解 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙 ...
- [THUWC2017]在美妙的数学王国中畅游
[THUWC2017]在美妙的数学王国中畅游 e和sin信息不能直接合并 泰勒展开,大于21次太小,认为是0,保留前21次多项式即可 然后就把e,sin ,kx+b都变成多项式了,pushup合并 上 ...
随机推荐
- jquery实现行列的单向固定和列的拖拽
其实这些功能在PL/SQL Dev中都有实现,在页面中还是蛮常见的. 我实现列的单向固定的原理:将需要单向固定的列放在一个<table>标签中,而整体的数据放在另一个<table&g ...
- CSS3实战之background篇
在CSS3中,background可以添加多个背景图像组,背景图像之间通过逗号进行分隔. 每个背景图像层都可以包含下面的值 background-image 定义背景图像 background-col ...
- soj1046. Plane Spotting
1046. Plane Spotting Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Craig is fond o ...
- petri网初步
历史:Petri网的概念是德国的Carl Adam Petri早在1962年提出来的.他在他的论文里提出了一个新的信息流模型,这个模型基于系统各部分的异步并发的操作,并把各部分之间的关系用网状的图来描 ...
- HDU 4639 hehe 杭电2013多校联赛第四场1008题
解题报告:题目的意思是输入一个字符串,并规定,里面的“hehe”可以用"wqnmlgb"来代替,也可以不代替,问输入的这个字符串在经过相关的代替之后可以有多少种不同的形态.先打一个 ...
- vue_router 动态路由
配置子路由: 路由的视图都需要使用view-router 子路由也可以嵌套路由使用: children来做嵌套如上图 使用location.页面name就可以做页面跳转 mounted:挂载,延迟跳转 ...
- boost 时间
利用boost来获取当前时间又方便快捷,还不用考虑跨平台的问题. 1. 输出YYYYMMDD [cpp] view plaincopy #include <boost/date_time/gre ...
- 原生的js实现jsonp的跨域封装
一.原理 jsonp是利用浏览器请求script文件时不受同源策略的限制而实现的,伪造一个script标签,将请求数据的url赋值给script的src属性,并将该标签添加到html中,浏览器会自动发 ...
- 2016.6.21——Add Binary
Add Binary 本题收获: 对于相加而言,考虑进位以及进位之后的值为多少,全部进位完毕后进位还为1(11 + 11 = 110)需要添加一位.1.string中默认每个元素为char型 2.从i ...
- Dream------scala--scala内部类实战
Dream------scala--scala内部类实战 scala的内部类跟java的内部类有很大的不同,java中的内部类实际上是从属于外部类,而scala的内部类是从属于外部类对象的(及外部类实 ...