社区讨论

求助

P6849[THUWC 2017] 大葱的神力参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo11gyc0
此快照首次捕获于
2023/10/22 13:39
2 年前
此快照最后确认于
2023/11/02 13:09
2 年前
查看原帖
代码:
CPP
#include<bits/stdc++.h>
#define db double
using namespace std;
int read(){int x=0,c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))x=x*10+c-48,c=getchar();return x;}
char fetch(){char c=getchar();while(!islower(c))c=getchar();return c;}
void swap(int &a,int &b){a^=b^=a^=b;}
const int N=100007;
int fa[N],ch[N][2],rev[N],fac[11],n,Q;db sum[N][11],f[N][11];
#define lc ch[x][0]
#define rc ch[x][1]
int nroot(int x){return ch[fa[x]][0]==x||ch[fa[x]][1]==x;}
void pushup(int x){for(int i=0;i<=10;++i)sum[x][i]=sum[lc][i]+sum[rc][i]+f[x][i];}
void pushrev(int x){swap(lc,rc),rev[x]^=1;}
void pushdown(int x){if(!rev[x])return;rev[x]=0,pushrev(lc),pushrev(rc);}
void pushall(int x){if(nroot(x))pushall(fa[x]);pushdown(x);}
void rotate(int x)
{
    int y=fa[x],z=fa[y],k=ch[y][1]==x;
    if(nroot(y)) ch[z][ch[z][1]==y]=x;
    fa[x]=z,fa[y]=x,fa[ch[x][!k]]=y,ch[y][k]=ch[x][!k],ch[x][!k]=y,pushup(y);
}
void splay(int x)
{
    pushall(x);
    for(int y;nroot(x);rotate(x)) if(nroot(y=fa[x])) rotate((ch[fa[y]][0]==y)^(ch[y][0]==x)? x:y);
    pushup(x);
}
void access(int x){for(int y=0;x;x=fa[y=x])splay(x),rc=y,pushup(x);}
void makeroot(int x){access(x),splay(x),pushrev(x);}
int findroot(int x){access(x),splay(x);while(lc)x=lc;return splay(x),x;}
void split(int x,int y){makeroot(x),access(y),splay(y);}
void link(int x,int y){makeroot(x),fa[x]=y;}
void cut(int x,int y){split(x,y),ch[y][0]=fa[x]=0,pushup(y);}
void modify(int p)
{
    int opt=read();db a,b;scanf("%lf%lf",&a,&b);
    splay(p);
    if(opt==3)
    {
	f[p][0]=b,f[p][1]=a;
	for(int i=2;i<=10;++i) f[p][i]=0;
    }
    if(opt==1)
    {
	db s=sin(b),c=cos(b),x=1;
	for(int i=0;i<=10;++i) f[p][i]=(i>>1&1? -1:1)*(i&1? c:s)*x/fac[i],x*=a;
    }
    if(opt==2)
    {
	db x=1,e=exp(b);
	for(int i=0;i<=10;++i) f[p][i]=x*e/fac[i],x*=a;
    }
    pushup(p);
}
void query(int u,int v)
{
    db a,x=1,ans=0;scanf("%lf",&a);
    if(findroot(u)^findroot(v)) return (void)(puts("unreachable"));
    split(u,v);
    for(int i=0;i<=10;++i) ans+=x*sum[v][i],x*=a;
    printf("%.10lf\n",ans);
}
int main()
{
    n=read(),Q=read(),read(),fac[0]=1;
    for(int i=1;i<=10;++i) fac[i]=i*fac[i-1];
    for(int i=1;i<=n;++i) modify(i);
    for(int u,v;Q;--Q)
	switch(fetch())
	{
	case 'a':u=read()+1,v=read()+1,link(u,v);break;
	case 'd':u=read()+1,v=read()+1,cut(u,v);break;
	case 'm':modify(read()+1);break;
	case 't':u=read()+1,v=read()+1,query(u,v);break;
	}
}

回复

0 条回复,欢迎继续交流。

正在加载回复...