P4546 [THUWC2017]在美妙的数学王国中畅游

如果只有第3个操作,那么这就是个sd题,随便lct搞搞就过去了

然后就是一个神仙东西 taylor公式

我不会,看gsy博客https://www.cnblogs.com/zhoushuyu/p/8148732.html

#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
#define maxn 100010
#define k 16
il int gi(){
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int F[maxn];double A[maxn],B[maxn];
int ch[maxn][2],fa[maxn];
double f[maxn][k];
bool rev[maxn];
il bool isrt(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
il vd Rev(int x){if(x)rev[x]^=1,std::swap(ch[x][0],ch[x][1]);}
il vd down(int x){
    if(!isrt(x))down(fa[x]);
    if(rev[x])Rev(ch[x][0]),Rev(ch[x][1]),rev[x]=0;
}
il vd upd(int x){
    for(int i=0;i<16;++i)f[x][i]=f[ch[x][0]][i]+f[ch[x][1]][i];
    if(F[x]==1){
        double val=1,Sin=sin(B[x]),Cos=cos(B[x]);
        for(int i=0;i<k;i+=4){
            f[x][i]+=Sin*val,val*=A[x];
            f[x][i+1]+=Cos*val,val*=A[x];
            f[x][i+2]-=Sin*val,val*=A[x];
            f[x][i+3]-=Cos*val,val*=A[x];
        }
    }else if(F[x]==2){
        double val=exp(B[x]);
        for(int i=0;i<k;++i)f[x][i]+=val,val*=A[x];
    }else f[x][0]+=B[x],f[x][1]+=A[x];
}
il vd rotate(int x){
    int y=fa[x],z=fa[y],o=ch[y][1]==x;
    fa[x]=z;if(!isrt(y))ch[z][y==ch[z][1]]=x;
    ch[y][o]=ch[x][!o];fa[ch[x][!o]]=y;
    ch[x][!o]=y,fa[y]=x;
    upd(y);
}
il vd splay(int x){
    down(x);
    for(int y=fa[x],z=fa[y];!isrt(x);rotate(x),y=fa[x],z=fa[y])
        if(!isrt(y))rotate(((ch[y][1]==x)==(ch[z][1]==y))?y:x);
    upd(x);
}
il vd access(int x){for(int y=0;x;x=fa[y=x])splay(x),ch[x][1]=y,upd(x);}
il vd makert(int x){access(x),splay(x),Rev(x);}
il vd link(int x,int y){makert(x),fa[x]=y;}
il vd cut(int x,int y){makert(x),access(y),splay(y),ch[y][0]=fa[x]=0,upd(y);}
il int find(int x){access(x);splay(x);while(ch[x][0])x=ch[x][0];return x;}
double p[k];
int main(){
#ifndef ONLINE_JUDGE
    freopen("4546.in","r",stdin);
    freopen("4546.out","w",stdout);
#endif
    p[0]=1;for(int i=1;i<k;++i)p[i]=p[i-1]*i;
    int n=gi(),m=gi();scanf("%*s");
    for(int i=1;i<=n;++i)F[i]=gi(),scanf("%lf%lf",&A[i],&B[i]),upd(i);
    char opt[10];
    int u,v;
    while(m--){
        scanf("%s",opt);
        if(opt[0]=='a')u=gi(),v=gi(),link(u+1,v+1);
        else if(opt[0]=='d')u=gi(),v=gi(),cut(u+1,v+1);
        else if(opt[0]=='m')u=gi()+1,makert(u),F[u]=gi(),scanf("%lf%lf",&A[u],&B[u]),upd(u);
        else{
            u=gi()+1,v=gi()+1;
            double X,ans=0,pX;scanf("%lf",&X);pX=1;
            if(find(u)!=find(v)){puts("unreachable");continue;}
            makert(u),access(v),splay(v);
            for(int i=0;i<k;++i)ans+=f[v][i]*pX/p[i],pX*=X;
            printf("%.8e\n",ans);
        }
    }
    return 0;
}

虽然我不会,但我在BZOJ上的时间吊打了gsy

posted @ 2018-11-17 13:13  菜狗xzz  阅读(452)  评论(0编辑  收藏  举报