12.29 模拟赛
T1 bzoj 5020 在美妙的数学王国中畅游
题目大意:
一个动态树支持link cut 每个点上有个式子以$f,a,b$的形式给出
$f=1$时表示式子为$sin(ax+b)$;$f=2$时表示式子为$e^{ax+b}$;$f=3$时表示式子为$ax+b$
查询时 给一个$x$,查询一个路径$u,v$上的所有式子代入$x$的值 修改可以支持修改一个点的式子
思路:
既然题目提示里都给了泰勒展开了,那就自然的想到把每个式子分解为大概12项的多项式就可以满足精度了
这样的话就是正常$LCT$上分别维护$0-11$次项的和,其他就是$LCT$基操了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #include<map> 10 #include<set> 11 #define rep(i,s,t) for(register int i=(s),i__end=(t);i<=i__end;++i) 12 #define dwn(i,s,t) for(register int i=(s),i__end=(t);i>=i__end;--i) 13 #define ren(x) for(register int i=fst[x];i;i=nxt[i]) 14 #define Fill(x,t) memset(x,t,sizeof(x)) 15 #define ll long long 16 #define inf 2139062143 17 #define MAXN 200100 18 using namespace std; 19 inline int read() 20 { 21 int x=0,f=1;char ch=getchar(); 22 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 23 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 24 return x*f; 25 } 26 int n,m;char s[20];double res,pw[20]; 27 struct LCT 28 { 29 int ch[MAXN][2],f[MAXN],tag[MAXN],st[MAXN];double val[MAXN][20],sum[MAXN][20]; 30 inline int isroot(int x){return ch[f[x]][0]!=x&&ch[f[x]][1]!=x;} 31 inline void upd(int x) {rep(i,0,11) sum[x][i]=sum[ch[x][0]][i]+sum[ch[x][1]][i]+val[x][i];} 32 inline int which(int x) {return ch[f[x]][1]==x;} 33 inline void rvs(int x) {tag[x]^=1;swap(ch[x][0],ch[x][1]);} 34 inline void rotate(int x) 35 { 36 int fa=f[x],ff=f[fa],k=which(x); 37 if(!isroot(fa)) ch[ff][ch[ff][1]==fa]=x;f[x]=ff; 38 ch[fa][k]=ch[x][k^1],f[ch[fa][k]]=fa,ch[x][k^1]=fa,f[fa]=x; 39 upd(fa);upd(x); 40 } 41 inline void pshd(int pos) 42 { 43 if(!tag[pos]) return;tag[pos]=0; 44 if(ch[pos][1]) rvs(ch[pos][1]); 45 if(ch[pos][0]) rvs(ch[pos][0]); 46 } 47 void splay(int x) 48 { 49 int top=0;st[++top]=x; 50 for(int i=x;!isroot(i);i=f[i])st[++top]=f[i]; 51 for(int i=top;i;i--) pshd(st[i]); 52 for(int fa;!isroot(x);rotate(x)) 53 if(!isroot(fa=f[x])) rotate(which(x)==which(fa)?fa:x);upd(x); 54 } 55 inline void access(int x) {for(int t=0;x;t=x,x=f[x]) {splay(x);ch[x][1]=t;upd(x);}} 56 inline void mkrt(int x) {access(x);splay(x);rvs(x);} 57 inline void link(int x,int y) {mkrt(x);f[x]=y;} 58 inline void split(int x,int y) {mkrt(x);access(y);splay(y);} 59 inline void cut(int x,int y) {split(x,y);ch[y][0]=f[x]=0;upd(y);} 60 inline int find(int x) 61 { 62 access(x);splay(x); 63 while(ch[x][0]) pshd(x),x=ch[x][0];return x; 64 } 65 inline void mdf(int x,int tp,double a,double b) 66 { 67 mkrt(x);rep(i,0,11) val[x][i]=0; 68 if(tp==3) val[x][0]=b,val[x][1]=a; 69 else if(tp==2) 70 { 71 val[x][0]=exp(b);rep(i,1,15) val[x][i]=val[x][i-1]*a; 72 }else 73 { 74 double tmp=1,g[4]={sin(b),cos(b),-sin(b),-cos(b)}; 75 rep(i,0,11) val[x][i]=g[i%4]*tmp,tmp*=a; 76 }upd(x); 77 } 78 }lct; 79 int main() 80 { 81 n=read(),m=read();scanf("%s",s);int x,t;double a,b;pw[0]=1;rep(i,1,15) pw[i]=pw[i-1]*i; 82 rep(i,1,n) {t=read();scanf("%lf%lf",&a,&b);lct.mdf(i,t,a,b);} 83 while(m--) 84 { 85 scanf("%s",s); 86 if(s[0]=='a') x=read()+1,t=read()+1,lct.link(x,t); 87 if(s[0]=='d') x=read()+1,t=read()+1,lct.cut(x,t); 88 if(s[0]=='m') {x=read()+1,t=read();lct.mkrt(x);scanf("%lf%lf",&a,&b);lct.mdf(x,t,a,b);} 89 if(s[0]=='t') 90 { 91 x=read()+1,t=read()+1;scanf("%lf",&a);b=1.0,res=0.0; 92 if(lct.find(x)^lct.find(t)) {puts("unreachable");continue;} 93 lct.split(x,t);rep(i,0,11) res+=lct.sum[t][i]*b/pw[i],b*=a; 94 printf("%.8e\n",res); 95 } 96 } 97 }
T2 bzoj 5006 随机二分图
题目大意: