BZOJ 5020 [THUWC2017]Drown in the math ocean (LCT+求导)
题目大意:
太长了略 洛谷题面传送门
嗯,数学题
感觉考试要是出这种题我就死翘翘了【逃
不用想都知道要$LCT$维护断边连边,但询问该如何处理呢
利用题目给出的公式
$f(x)=\sum_{i=0}^{inf} \frac{f^{(i)}(x_{0})(x-x_{0})^{i}}{i!}$
发现,同阶的导变成了常量,可以直接相加了!
我们只需要求出$\sum_{u to v} f^{(i)}(x_{0})$,用$LCT$维护,每次把$x$带入即可
$x_{0}$可以选择0.5
我们可以主动卡精度,每个节点只需要求出对应函数的1~13阶导即可
注意别把第三个操作的$f++$了= =
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 100100
#define M1 2010
#define S1 (N1<<1)
#define T1 (N1<<2)
#define ll long long
#define uint unsigned int
#define rint register int
#define ull unsigned long long
#define dd double
#define ld long double
#define il inline
#define inf 1000000000
using namespace std; const ld X=0.5;
int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,T,type;
int tot;
struct LCT{
int ch[N1][],fa[N1],rev[N1],type[N1];
ld a[N1],b[N1],f[N1][],sum[N1][];
inline int idf(int x){return ch[fa[x]][]==x?:;}
inline void revers(int x){swap(ch[x][],ch[x][]),rev[x]^=;}
inline int isroot(int x){return (ch[fa[x]][]==x||ch[fa[x]][]==x)?:;}
void update(int x)
{
memset(f[x],,sizeof(f[x]));
if(type[x]==){
f[x][]=sin(a[x]*X+b[x]),f[x][]=a[x]*cos(a[x]*X+b[x]);
for(int i=;i<=;i++)
f[x][i]=-a[x]*a[x]*f[x][i-];
}else if(type[x]==){
f[x][]=exp(X*a[x]+b[x]);
for(int i=;i<=;i++)
f[x][i]=a[x]*f[x][i-];
}else{
f[x][]=a[x]*X+b[x],f[x][]=a[x];
}
}
inline void pushup(int x)
{
for(rint i=;i<=;i++)
sum[x][i]=sum[ch[x][]][i]+sum[ch[x][]][i]+f[x][i];
}
void pushdown(int x)
{
if(rev[x])
{
if(ch[x][]) revers(ch[x][]);
if(ch[x][]) revers(ch[x][]);
rev[x]^=;
}
}
int stk[N1],tp;
void rot(int x)
{
int y=fa[x],ff=fa[y],px=idf(x),py=idf(y);
if(!isroot(y)) ch[ff][py]=x; fa[x]=ff;
fa[ch[x][px^]]=y,ch[y][px]=ch[x][px^];
ch[x][px^]=y,fa[y]=x;
pushup(y),pushup(x);
}
void splay(int x)
{
int y=x; stk[++tp]=x;
while(!isroot(y)){stk[++tp]=fa[y],y=fa[y];}
while(tp){pushdown(stk[tp--]);}
while(!isroot(x))
{
y=fa[x];
if(isroot(y)) rot(x);
else if(idf(y)==idf(x)) rot(y),rot(x);
else rot(x),rot(x);
}
}
void access(int x)
{
for(int y=;x;y=x,x=fa[x])
splay(x),ch[x][]=y,pushup(x);
}
void mkroot(int x){access(x),splay(x),revers(x);}
void split(int x,int y){mkroot(x),access(y),splay(y);}
int fdroot(int x)
{
access(x),splay(x);
while(ch[x][]) pushdown(ch[x][]),x=ch[x][];
splay(x); return x;
}
void link(int x,int y)
{
split(x,y);
/*if(findroot(y)!=x)*/ fa[x]=y;
}
void cut(int x,int y)
{
split(x,y);
if(!ch[x][]&&fa[x]==y&&ch[y][]==x)
fa[x]=ch[y][]=,pushup(y);
}
void magic(int x,int p,dd A,dd B)
{
splay(x);
type[x]=p; a[x]=A; b[x]=B;
update(x); pushup(x);
}
ld query(int x,int y,dd w,int &fl)
{
split(x,y); if(fdroot(y)!=x) {fl=-;return ;}
ld mul=,ans=sum[x][],pw=;
for(int i=;i<=;i++)
{
mul*=i; pw*=(w-X);
ans+=sum[x][i]*pw/mul;
}
return ans;
}
void init()
{
for(int i=;i<=n;i++)
{
type[i]=gint();
scanf("%Lf%Lf",&a[i],&b[i]);
update(i);
}
}
}lct; char str[]; int main()
{
freopen("t2.in","r",stdin);
//freopen("a.out","w",stdout);
scanf("%d%d%s",&n,&m,str);
int i,j,x,y,fl=; ld A,B,ans;
lct.init();
for(j=;j<=m;j++)
{
scanf("%s",str); x=gint(),y=gint();
if(str[]=='a'){
x++,y++;
lct.link(x,y);
}else if(str[]=='d'){
x++,y++;
lct.cut(x,y);
}else if(str[]=='m'){
x++;
scanf("%Lf%Lf",&A,&B);
lct.magic(x,y,A,B);
}else{
x++,y++;
scanf("%Lf",&A); fl=;
ans=lct.query(x,y,A,fl);
if(fl==-) puts("unreachable");
else printf("%.12Lf\n",ans);
}
}
return ;
}
/*
既然动态断边连边维护一个树形结构,肯定是要用LCT啦
那么怎么维护呢= =
每个人智商都不同,所以把它带入到每个点的函数里,会T
我们要想个办法,快速处理询问
翻一翻题面,诶!这个公式是干嘛的呢?
f(x)=\sum_{i=0}^{inf} \frac{f^{(i)}(x_{0})(x-x_{0})^{i}}{i!}
x_{0}貌似是随便取的诶,作为一名强迫症肯定要取中间值0.5= =
我怎么说了这么多废话*/
BZOJ 5020 [THUWC2017]Drown in the math ocean (LCT+求导)的更多相关文章
- 【Math】矩阵求导
https://en.wikipedia.org/wiki/Matrix_calculus http://blog.sina.com.cn/s/blog_7959e7ed0100w2b3.html
- bzoj 5020(洛谷4546) [THUWC 2017]在美妙的数学王国中畅游——LCT+泰勒展开
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5020 https://www.luogu.org/problemnew/show/P4546 ...
- 【BZOJ 3561】 3561: DZY Loves Math VI (莫比乌斯,均摊log)
3561: DZY Loves Math VI Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 205 Solved: 141 Description ...
- 【BZOJ 3560】 3560: DZY Loves Math V (欧拉函数)
3560: DZY Loves Math V Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 241 Solved: 133 Description ...
- 【BZOJ】1754: [Usaco2005 qua]Bull Math
[算法]高精度乘法 #include<cstdio> #include<algorithm> #include<cstring> using namespace s ...
- bzoj 5020: [THUWC 2017]在美妙的数学王国中畅游【泰勒展开+LCT】
参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html --其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊 泰勒展开是到正无穷的,但是因 ...
- 洛谷 P4546 & bzoj 5020 在美妙的数学王国中畅游 —— LCT+泰勒展开
题目:https://www.luogu.org/problemnew/show/P4546 先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分: 注意各处 pushup,而且 spla ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖-旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标-备忘板子
来源:旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标 BZOJ又崩了,直接贴一下人家的代码. 代码: #include"stdio.h" #include"str ...
- 【BZOJ】2049: [Sdoi2008]Cave 洞穴勘测(lct/并查集)
http://www.lydsy.com/JudgeOnline/problem.php?id=2049 bzoj挂了..在wikioi提交,,1A-写lct的速度越来越快了-都不用debug-- 新 ...
随机推荐
- Project Euler 42 Coded triangle numbers
题意:三角形数序列的第n项由公式tn = 1/2n(n+1)给出:因此前十个三角形数是: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, - 将一个单词的每个字母分别转化为其 ...
- fs
yum install -y make expat-devel git gcc-c++ autoconf automake libtool wget python-devel ncurses-deve ...
- js日期原型扩展
当初做统计业务需要处理时间 周报:本周 上周 下周 近一周 月报上月 本月 等 需要使用时间处理 所以扩展了这些方法 <!DOCTYPE html> <html xmlns=&quo ...
- php PDO连接mysql
近期在linux装了新的环境.php5.6+mysql5.5+nginx. 然后用原来的mysql链接数据库出现的错误. 原因就是说连接数据库的方法太旧.建议我用mysqli和PDO来连接数据库. 好 ...
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放具体解释
本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行解说,主要通过MFC单文档视图实现显示BMP图片空间几何变换.包含图像平移.图形 ...
- cocos2d-x之浅析Hello World
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- BZOJ 2435: [Noi2011]道路修建 dfs搜图
2435: [Noi2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他 ...
- VIM7.4 编译安装 开启python
https://github.com/wklken/k-vim ./configure --prefix=/usr/local/vim74 \--with-features=huge \--enabl ...
- 6 ZigZig Conversion[M]Z字形变换
题目 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows li ...
- (转载)Android项目实战(三十二):圆角对话框Dialog
Android项目实战(三十二):圆角对话框Dialog 前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...