【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合并 上 ...
随机推荐
- 科学计算三维可视化---Mlab基础(改变物体的外观颜色)
import numpy as np from mayavi import mlab #建立数据 x,y = np.mgrid[-::200j,-::200j] z = *np.sin(x*y)/(x ...
- Hi3518 网络监控SOC芯片规格参数
Hi3518 网络监控SOC芯片 视频编解码 处理器内核 ● ARM926@ 440MHz,16KB I-Cache ,16KB D-Cache 视频编码 ● H.264 Main Pro ...
- openwrt的sysupgrade和factory固件的区别
openwrt的固件一般分两种类型:factory原厂固件.sysupgrade固件 factory多了一些验证的东西,用于在原厂固件的基础上进行升级. 普通家用路由一般不是openwrt固件,如果要 ...
- spring框架学习(七)spring管理事务方式之xml配置
1.DAO AccountDao.java package cn.mf.dao; public interface AccountDao { //加钱 void increaseMoney(Integ ...
- Druid.io通过NiFi摄取流数据
NiFi是一个易于使用,功能强大且可靠的系统来处理和分发数据. 本文讲述如何用NiFi将Http的Json数据传到Druid.国外的一篇文章讲到如何用NiFi将推文传到Druid,https://co ...
- 20155325 2016-2017-2 《Java程序设计》第7周学习总结
教材学习内容总结 名称 作用 Calendar 设定时间日期等字段 add() 改变Calendar的时间 roll() 针对日期中某个字段加减 getDefault() 取得默认时区信息 教材学习中 ...
- HDU 1176 排列2 全排列
解题报告:给出四个数,然后要你把这四个数组合成的各不相同的四位数按照从小到大的顺序输出来,然后如果最高位是0的话不能输出来,还有最高位是数字如果一样的话,则放在同一行输出. 本来是个比较简单的生成全排 ...
- OpenCV3.4.1+vs2017安装及配置
一.OpenCV3.4.1下载与安装 1.OpenCV3.4.1下载 可以去OpenCV官网上下载http://opencv.org/ 然后找到对应的系统环境就可以下载了,当然了官网上下载会很慢,推荐 ...
- tmux终端工具
本文原始地址:http://www.cnblogs.com/chinas/p/7094172.html,转载请注明出处,谢谢!!! 1.介绍 tmux(终端复用工具):一个很有趣的工具,类似GNU S ...
- STL-map and multimap
定义 map<int,int> a; map<int,string> a; map<double,int> a; …… 首先要知道的一些 Map是STL的一个关联容 ...