事实证明物竞笔记是个好东西,可惜没带,不然还能谎称自己会一点求导和微积分。
顺便在这里把比较经典的一些关于求导的东西记录一下:
常用函数求导:
\(C'=0,(x^n)'=nx^{n-1},(\log_ax)'=\frac 1{x\ln a}\)
\((\ln x)'=\frac 1x,(a^x)'=a^x\ln a,(e^x)'=e^x\)
\((\sin x)'=\cos x=\sin(x+\frac{\pi}2)\)
\((\cos x)'=-\sin x=-\cos(x+\frac{\pi}2)\)
\((\tan x)'=\frac 1{\cos^2x}\)
基本求导法则:
\((u\pm v)'=u'\pm v';(uv)'=u'v+uv'\)
\((\frac uv)'=\frac{u'v-uv'}{v^2};y=f[g(x)],y'=f'[g(x)]g'(x)\)
题目下方给了关于泰勒展开的内容,所以我们可以将三个函数转换成多项式形式,然后进行求解(下文中的多项式省略关于误差的那一部分)。
\[f(x)=\sin(ax+b) \]\[f'(x)=a\sin(ax+b+\frac{\pi}2) \]\[f''(x)=a^2\sin(ax+b+\pi) \]\[\dots\dots\dots \]\[f^{(n)}(x)=a^n\sin(ax+b+\frac{n\pi}{2}) \]\[\therefore f(x)=\sum_{i=0}^n\frac{a^i\sin(ax_0+b)}{i!}(x-x_0)^i \]
\[f(x)=e^{ax+b} \]\[f'(x)=ae^{ax+b} \]\[f''(x)=a^2e^{ax+b} \]\[\dots\dots\dots \]\[f^{(n)}(x)=a^ne^{ax+b} \]\[\therefore f(x)=\sum_{i=0}^n\frac{a^ie^{ax_0+b}}{i!}(x-x_0)^i \]
第三种情况本身就很多项式,所以根本不用转化。
当 \(n=15,x_0=0.5\) 时,误差就已经非常可以接受了。
这样我们就可以将多项式合并了,直接使用 \(LCT\) 即可。
时间复杂度 \(O(n\log n)\)。
#include<bits/stdc++.h>
#define fa(x) lct[x].fa
#define fl(x) lct[x].fl
#define sn(x,i) lct[x].sn[i]
#define f(x,i) lct[x].f[i]
#define g(x,i) lct[x].g[i]
using namespace std;
const int N=1e5+5;
const double pi=acos(0.0);
struct node{
int sn[2],fa,fl;
double f[15],g[15];
}lct[N];int n,tp,st[N],m;
int check(int x){
return sn(fa(x),0)!=x&&sn(fa(x),1)!=x;
}int chksn(int x){
return sn(fa(x),1)==x;
}void push_up(int x){
for(int i=0;i<15;i++)
g(x,i)=g(sn(x,0),i)+g(sn(x,1),i)+f(x,i);
}void push_down(int x){
if(!x||!fl(x)) return;
fl(sn(x,0))^=1,fl(sn(x,1))^=1;
swap(sn(x,0),sn(x,1)),fl(x)=0;
}void rotate(int x){
int y=fa(x),z=fa(y),k=chksn(x);
if(!check(y)) sn(z,chksn(y))=x;
fa(x)=z,fa(y)=x,fa(sn(x,1-k))=y;
sn(y,k)=sn(x,1-k),sn(x,1-k)=y;
push_up(y);
}void splay(int x){
st[tp=1]=x;
for(int i=x;!check(i);i=fa(i)) st[++tp]=fa(i);
while(tp) push_down(st[tp--]);
while(!check(x)){
int y=fa(x),z=fa(y);
if(!check(y))
rotate(chksn(x)!=chksn(y)?x:y);
rotate(x);
}push_up(x);
}void access(int x){
for(int i=0;x;i=x,x=fa(x))
splay(x),sn(x,1)=i,push_up(x);
}void mk(int x){
access(x),splay(x),fl(x)^=1;
}void split(int x,int y){
mk(x),access(y),splay(y);
}void cut(int x,int y){
split(x,y),fa(x)=sn(y,0)=0;
}void link(int x,int y){
mk(x),access(y),fa(x)=y;
}int find(int x){
access(x),splay(x);
while(sn(x,0)) x=sn(x,0);
return x;
}void chg(int x,int fg,double a,double b){
double ac=1,jc=1;
for(int i=0;i<15;i++,ac*=a,jc*=i){
if(fg==3) f(x,i)=i>0?(i<2?a:0):a*0.5+b;
else if(fg==2) f(x,i)=ac*exp(a*0.5+b)/jc;
else f(x,i)=ac*sin(a*0.5+b+i*pi)/jc;
}
}int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
string s;cin>>n>>m>>s;
for(int i=1;i<=n;i++){
int fg;double a,b;
cin>>fg>>a>>b,chg(i,fg,a,b);
}while(m--){
cin>>s;
if(s=="appear"){
int u,v;cin>>u>>v;
link(u+1,v+1);
}if(s=="travel"){
int u,v;double x;
cin>>u>>v>>x;
if(find(++u)!=find(++v)){
cout<<"unreachable\n";
continue;
}split(u,v);double jc=1,sum=0;
for(int i=0;i<15;i++)
sum+=jc*g(v,i),jc*=x-0.5;
cout<<fixed<<setprecision(8)<<scientific<<sum<<"\n";
}if(s=="magic"){
int c,fg;double a,b;
cin>>c>>fg>>a>>b;
mk(++c),chg(c,fg,a,b);
}if(s=="disappear"){
int u,v;cin>>u>>v;
cut(u+1,v+1);
}
}return 0;
}
标签:lct,frac,int,题解,内附,ax,THUWC2017,pi,sin
From: https://www.cnblogs.com/chang-an-22-lyh/p/18661051/thuwc2017-zai_mei_miao_de_shu_xue_wang_