题目:https://www.luogu.org/problemnew/show/P4546

先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分;

注意各处 pushup,而且 splay 维护的是一条链但其形态不一定是一条链!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int rd()
{int ret=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return f?ret:-ret;
}
typedef double db;
int const xn=1e5+5;
int n,m,hd[xn],f[xn],fa[xn],c[xn][2],rev[xn];
db A[xn],B[xn],sum[xn];
char tp[10],op[15];
bool isroot(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;}
db cal(int x,db v){db y=A[x]*v+B[x]; if(f[x]==1)return sin(y); if(f[x]==2)return exp(y); return y;}
void pushup(int x){sum[x]=cal(x,1)+sum[c[x][0]]+sum[c[x][1]];}
void rotate(int x)
{int y=fa[x],z=fa[y],d=(c[y][1]==x);if(!isroot(y))c[z][c[z][1]==y]=x;fa[x]=z; fa[y]=x; fa[c[x][!d]]=y;c[y][d]=c[x][!d]; c[x][!d]=y;pushup(y); pushup(x);
}
int sta[xn],top;
void rever(int x)
{if(!rev[x])return;rev[c[x][0]]^=1; rev[c[x][1]]^=1;swap(c[x][0],c[x][1]); rev[x]=0;
}
void splay(int x)
{sta[top=1]=x;for(int i=x;!isroot(i);i=fa[i])sta[++top]=fa[i];//i!for(int i=top;i;i--)rever(sta[i]);while(!isroot(x)){int y=fa[x],z=fa[y];if(!isroot(y))((c[y][0]==x)^(c[z][0]==y))?rotate(x):rotate(y);rotate(x);}
}
void access(int x)
{for(int t=0;x;c[x][1]=t,pushup(x),t=x,x=fa[x])splay(x);//pushup
}
void makeroot(int x)
{access(x); splay(x); rev[x]^=1;
}
int find(int x)
{access(x); splay(x); while(c[x][0])x=c[x][0]; return x;
}
void link(int x,int y)
{makeroot(x); fa[x]=y;
}
void cut(int x,int y)
{makeroot(x); access(y); splay(y);fa[x]=0; c[y][0]=0; pushup(y);
}
db dfs(int x,db v)
{db ret=cal(x,v);if(c[x][0])ret+=dfs(c[x][0],v);if(c[x][1])ret+=dfs(c[x][1],v);return ret;
}
void query1(int x,int y,db v)
{if(find(x)!=find(y)){puts("unreachable"); return;}makeroot(x); access(y); splay(y); db ret=0;//for(int t=x;t!=fa[y];t=fa[t])ret+=cal(t,v);//printf("%.8e\n",ret);printf("%.8e\n",dfs(y,v));
}
void query2(int x,int y)
{if(find(x)!=find(y)){puts("unreachable"); return;}makeroot(x); access(y); splay(y);printf("%.8e\n",sum[y]);
}
int main()
{n=rd(); m=rd(); scanf("%s",tp);for(int i=1;i<=n;i++)f[i]=rd(),scanf("%lf%lf",&A[i],&B[i]);for(int i=1,u,v;i<=m;i++){scanf("%s",op);if(op[0]=='a'){u=rd()+1; v=rd()+1; link(u,v);}else if(op[0]=='d'){u=rd()+1; v=rd()+1; cut(u,v);}else if(op[0]=='m'){int x=rd()+1; access(x); splay(x); f[x]=rd(); scanf("%lf%lf",&A[x],&B[x]); pushup(x);}//a,s,pelse{u=rd()+1; v=rd()+1; db x; scanf("%lf",&x);if(tp[1]=='0')query2(u,v);else query1(u,v,x);}}
}

55(60)分

参考了博客:https://www.cnblogs.com/zhoushuyu/p/8148732.html

A[x] 写成 A[i] 看了一个小时...

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef double db;
int rd()
{int ret=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return f?ret:-ret;
}
int const xn=1e5+5;
int n,m,f[xn],fa[xn],c[xn][2],jc[15],rev[xn];
db A[xn],B[xn],g[xn][15];
char tp[10],op[15];
bool isroot(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;}
db t[5];
void pushup(int x)
{db p=1;if(f[x]==1){t[0]=sin(B[x]); t[1]=cos(B[x]); t[2]=-t[0]; t[3]=-t[1];for(int i=0;i<=12;i++,p=p*A[x])g[x][i]=p*t[i%4]+g[c[x][0]][i]+g[c[x][1]][i];}if(f[x]==2){db tmp=exp(B[x]);for(int i=0;i<=12;i++,p=p*A[x])g[x][i]=p*tmp+g[c[x][0]][i]+g[c[x][1]][i];}if(f[x]==3){g[x][0]=B[x]+g[c[x][0]][0]+g[c[x][1]][0];g[x][1]=A[x]+g[c[x][0]][1]+g[c[x][1]][1];for(int i=2;i<=12;i++)g[x][i]=g[c[x][0]][i]+g[c[x][1]][i];}
}
void rotate(int x)
{int y=fa[x],z=fa[y],d=(c[y][1]==x);if(!isroot(y))c[z][c[z][1]==y]=x;fa[x]=z; fa[y]=x; fa[c[x][!d]]=y;c[y][d]=c[x][!d]; c[x][!d]=y;pushup(y); pushup(x);
}
int sta[xn],top;
void rever(int x)
{if(!rev[x])return; rev[c[x][0]]^=1; rev[c[x][1]]^=1; swap(c[x][0],c[x][1]); rev[x]=0;}
void splay(int x)
{sta[top=1]=x;for(int i=x;!isroot(i);i=fa[i])sta[++top]=fa[i];for(int i=top;i;i--)rever(sta[i]);while(!isroot(x)){int y=fa[x],z=fa[y];if(!isroot(y))((c[y][0]==x)^(c[z][0]==y))?rotate(x):rotate(y);rotate(x);}
}
void access(int x)
{for(int t=0;x;c[x][1]=t,pushup(x),t=x,x=fa[x])splay(x);
}
void makeroot(int x)
{access(x); splay(x); rev[x]^=1;
}
int find(int x)
{access(x); splay(x); while(c[x][0])x=c[x][0]; return x;
}
void link(int x,int y)
{makeroot(x); fa[x]=y;
}
void cut(int x,int y)
{makeroot(x); access(y); splay(y); fa[x]=c[y][0]=0; pushup(y);
}
void query(int x,int y,db v)
{if(find(x)!=find(y)){puts("unreachable"); return;}makeroot(x); access(y); splay(y);db ret=0,p=1; for(int i=0;i<=12;i++,p=p*v)ret+=g[y][i]*p/jc[i];printf("%.8e\n",ret);
}
int main()
{n=rd(); m=rd(); scanf("%s",tp);for(int i=1;i<=n;i++)f[i]=rd(),scanf("%lf%lf",&A[i],&B[i]);jc[0]=1; for(int i=1;i<=12;i++)jc[i]=jc[i-1]*i;for(int i=1,u,v;i<=m;i++){scanf("%s",op);if(op[0]=='a'){u=rd()+1; v=rd()+1; link(u,v);}if(op[0]=='d'){u=rd()+1; v=rd()+1; cut(u,v);}if(op[0]=='m'){int x=rd()+1; splay(x); f[x]=rd(); scanf("%lf%lf",&A[x],&B[x]); pushup(x);}//A[x] not A[i]!if(op[0]=='t'){u=rd()+1; v=rd()+1; db x; scanf("%lf",&x); query(u,v,x);}}return 0;
}

转载于:https://www.cnblogs.com/Zinn/p/10253643.html

洛谷 P4546 bzoj 5020 在美妙的数学王国中畅游 —— LCT+泰勒展开相关推荐

  1. [THUWC2017]在美妙的数学王国中畅游 LCT+泰勒展开+求导

    [THUWC2017]在美妙的数学王国中畅游 LCT+泰勒展开+求导 Code: #include<bits/stdc++.h> using namespace std; #define ...

  2. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)

    Description 数字和数学规律主宰着这个世界.   机器的运转,   生命的消长,   宇宙的进程,   这些神秘而又美妙的过程无不可以用数学的语言展现出来.   这印证了一句古老的名言:   ...

  3. 「LOJ 2289」「THUWC 2017」在美妙的数学王国中畅游——LCT泰勒展开

    题目大意: 传送门 给一个动态树,每个节点上维护一个函数为$f(x)=sin(ax+b)$.$f(x)=e^{ax+b}$.$f(x)=ax+b$中的一个. 支持删边连边,修改节点上函数的操作. 每次 ...

  4. 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游 LCT 泰勒展开

    题目大意 给你一棵树,每个点有一个函数f(x)f(x) 正弦函数 sin(ax+b)(a∈[0,1],b∈[0,π],a+b∈[0,π])\sin(ax+b) (a\in[0,1],b\in[0,\p ...

  5. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游

    BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游 其实题面好像有点不全,建议去洛谷: P4546 [THUWC2017]在美妙的数学王国中畅游 这里还是$BZOJ$的题面. Desc ...

  6. [BZOJ5020][THUWC 2017]在美妙的数学王国中畅游(LCT + 一点数学知识)

    Address 洛谷 P4546 BZOJ 5020 LOJ #2289 Solution 如果只有一次函数 ax+bax+bax+b ,那么这是非常裸的 LCT ,维护 aaa 之和与 bbb 之和 ...

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

    [THUWC2017]在美妙的数学王国中畅游 e和sin信息不能直接合并 泰勒展开,大于21次太小,认为是0,保留前21次多项式即可 然后就把e,sin ,kx+b都变成多项式了,pushup合并 上 ...

  8. 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT

    [BZOJ5020][THUWC 2017]在美妙的数学王国中畅游 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数 ...

  9. 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)

    题解 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数学的语言展现出来. 这印证了一句古老的名言: "学好 ...

最新文章

  1. 解决安装python第三方模块 '-mno-cygwin'报错的问题
  2. GitHub 热点速览:不可思议的浏览器 Browser-2020 周涨 Star 超 3 千
  3. 【重构与模式】6.1用Creation Method替换构造函数
  4. python简易学生信息管理系统
  5. java命名不规范会怎样_java命名规范:注重细节
  6. rss阅读器一览导入opml文件
  7. 【汇编实战开发笔记】80x86汇编基础的三大块知识
  8. dsp和通用计算机的区别,DSP处理器与通用处理器的比较
  9. 测试体质的软件有哪些,有哪些APP可以测体脂?测体脂率APP分享
  10. 使用CSS完成用户注册页面;
  11. ipv6被拒的解决方法
  12. 126邮箱登录(selenium+python)
  13. vnc却显示 failed to connect:操作成功完成。(0)
  14. 英国高技术型人才流失严重 达到50年之最
  15. 【splishsplash】修复catch.hpp的问题
  16. Python基于人脸识别的考勤系统(附源码)
  17. 什么是函数?什么是无参函数?什么是返回值?函数的分类?
  18. 计算机应用应届生自我评价,计算机应用专业应届生自我评价
  19. 华为发布FTTR全光家庭星光F30系列新品,点亮家庭数字生活
  20. Golang Protocol Buffers数据格式教程

热门文章

  1. RAM和Flash区别
  2. 《为爱而生》 | 第一集:遇见学姐
  3. Python面向对象编程---多态
  4. 二十种题型带你复习《概率论与数理统计》得高分(高数叔)
  5. java Eclipse 快捷键
  6. tcpdump抓syn,ack,fin,rst包
  7. 论文笔记---SSH
  8. 关于Ubuntu与Debian的关系,了解!
  9. 持久加密USB安装kali
  10. 东原地产首获“蓝筹地产” 千亿货值业绩增速成亮点