[THUWC 2017]在美妙的数学王国中畅游

传送门

每个函数泰勒展开,阶乘预处理

后面的项对答案的影响很小可以忽略

L C T LCT LCT板子维护路径和

有关导数

以后交题解不敢压行了

#include<bits/stdc++.h>
#define il inline
using namespace std;
const int N=1e5+5,L=11;
int n,m,T,stk[N],ch[N][2],fa[N],w[N],rev[N];
double a[N][L],sum[N][L];
long long fc[L];
char s[20];
il void psu(int x) {
    for(int i=0; i<L; ++i) sum[x][i]=sum[ch[x][0]][i]+sum[ch[x][1]][i]+a[x][i];
}
il bool isr(int x) {
    return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
}
il void psd(int x) {
    if(rev[x]) swap(ch[x][0],ch[x][1]),rev[ch[x][0]]^=1,rev[ch[x][1]]^=1,rev[x]^=1;
}
il void rtt(int x) {
    int y=fa[x],z=fa[y],d=(ch[y][1]==x);
    if(!isr(y)) ch[z][ch[z][1]==y]=x;
    fa[x]=z,fa[y]=x;
    fa[ch[x][d^1]]=y,ch[y][d]=ch[x][d^1],ch[x][d^1]=y;
    psu(y),psu(x);
}
il void spl(int x) {
    stk[T=1]=x;
    for(int i=x; !isr(i); i=fa[i]) stk[++T]=fa[i];
    for(int i=T; i>=1; --i) psd(stk[i]);
    for(int y=fa[x],z=fa[y]; !isr(x); y=fa[x],z=fa[y]) {
        if(!isr(y)) ((ch[z][1]==y)^(ch[y][1]==x))?rtt(x):rtt(y);
        rtt(x);
    }
}
il void acs(int x) {
    int t=0;
    while(x) {
        spl(x),ch[x][1]=t,psu(x),t=x,x=fa[x];
    }
}
il void mkr(int x) {
    acs(x),spl(x),rev[x]^=1;
}
il int fdr(int x) {
    acs(x);
    spl(x);
    psd(x);
    while(ch[x][0]) psd(x=ch[x][0]);
    return x;
}
il void lk(int x,int y) {
    mkr(x);
    if(fdr(y)!=x) fa[x]=y;
}
il void cut(int x,int y) {
    mkr(x);
    if(fdr(y)==x&&fa[x]==y&&ch[y][0]==x&&ch[x][1]==0) fa[x]=ch[y][0]=0;
    psu(y);
}
il double qry(int x,int y,double v) {
    mkr(x),acs(y),spl(y);
    double t=1,ss=0;
    for(int i=0; i<L; ++i) ss+=t*sum[y][i],t*=v;
    return ss;
}
il void trs(int op,double *a,double A,double B) {
    if(op==1) {
        double S=sin(B),C=cos(B),t=1;
        int f;
        for(int i=0; i<L; ++i) f=((i>>1)&1)?-1:1,a[i]=f*t*(i&1?C:S)/fc[i],t*=A;
    } else if(op==2) {
        double eb=exp(B),t=1;
        for(int i=0; i<L; ++i) a[i]=t*eb/fc[i],t*=A;
    } else {
        a[0]=B,a[1]=A;
        for(int i=2; i<L; ++i) a[i]=0;
    }
}
int main() {
    fc[0]=1;
    for(int i=1; i<L; ++i) fc[i]=fc[i-1]*i;
    scanf("%d%d%s",&n,&m,s);
    double A,B,v;
    int x,y;
    for(int i=1,op; i<=n; ++i) scanf("%d",&op),scanf("%lf%lf",&A,&B),trs(op,a[i],A,B);
    while(m--) {
        scanf("%s%d%d",s,&x,&y);
        ++x,++y;
        if(s[0]=='a') lk(x,y);
        else if(s[0]=='d') cut(x,y);
        if(s[0]=='m') scanf("%lf%lf",&A,&B),mkr(x),trs(--y,a[x],A,B),psu(x);
        if(s[0]=='t') scanf("%lf",&v),fdr(x)!=fdr(y)?puts("unreachable"):printf("%.9lf\n",qry(x,y,v));
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值