Description

懒得概括了。。

Solution

挺裸的LCT+挺裸的泰勒展开吧... 稍微了解过一点的人应该都能很快切掉...吧?

就是把每个点的函数泰勒展开一下然后LCT维护子树sum就行了

嗯还是挺傻逼的

记住sin(x)求导是cos(x) md为了这个调了好久\

吐槽:

我就纳了逼闷了最优解为什么这么容易

最开始写完交发现最优解第四,然后写了个double类型的读优然后慢了4000ms...然后不知从哪听说cin读浮点数快的一批然后又换cin就又慢了10000ms... 最后突然想起来最影响时间的是项数,就把展开的项数从16变成12直接跑第一了2333..

Code

#include<bits/stdc++.h>
using std::min;
using std::max;
using std::swap;
using std::vector;
typedef double db;
typedef long long ll;
#define pb(A) push_back(A)
#define pii std::pair<int,int>
#define all(A) A.begin(),A.end()
#define mp(A,B) std::make_pair(A,B)
const int N=1e5+5;
const int maxn=12;
#define ls ch[x][0]
#define rs ch[x][1] char s[20];
int rev[N],stk[N],top;
int n,m,ch[N][2],fa[N];
db sum[N][maxn+5],val[N][maxn+5]; void pushup(int x){
for(int i=0;i<maxn;i++)
sum[x][i]=sum[ls][i]+sum[rs][i]+val[x][i];
} void pushr(int x){
rev[x]^=1;swap(ls,rs);
} void pushdown(int x){
if(rev[x]) pushr(ls),pushr(rs),rev[x]=0;
} bool nroot(int x){
return ch[fa[x]][0]==x or ch[fa[x]][1]==x;
} void rotate(int x){
int y=fa[x],z=fa[y],d=ch[y][1]==x,dd=ch[z][1]==y;
fa[x]=z;if(nroot(y)) ch[z][dd]=x;
ch[y][d]=ch[x][d^1];if(ch[x][d^1]) fa[ch[x][d^1]]=y;
ch[x][d^1]=y;fa[y]=x;pushup(y);
} void splay(int x){
int now=x;stk[++top]=now;
while(nroot(now)) now=fa[now],stk[++top]=now;
while(top) pushdown(stk[top--]);
while(nroot(x)){
int y=fa[x],z=fa[y];
if(nroot(y)) rotate((ch[y][1]==x)^(ch[z][1]==y)?x:y);
rotate(x);
} pushup(x);
} void calc(int opt,db a,db b,int id){
if(opt==1){
db x=sin(b),y=cos(b),now=1;
for(int i=0;i<maxn;i++)
val[id][i]=((i&1)?(i%4==1?y:-y):(i%4==0?x:-x))*now,now*=a;
} else if(opt==2){
db x=exp(b),now=1;
for(int i=0;i<maxn;i++)
val[id][i]=x*now,now*=a;
} else{
val[id][0]=b;val[id][1]=a;
for(int i=2;i<maxn;i++)
val[id][i]=0;
}
} void access(int x){
for(int y=0;x;y=x,x=fa[x])
splay(x),rs=y,pushup(x);
} void makeroot(int x){
access(x),splay(x),pushr(x);
} void link(int x,int y){
makeroot(x),fa[x]=y;
} void split(int x,int y){
makeroot(x),access(y),splay(y);
} void cut(int x,int y){
split(x,y);
fa[x]=ch[y][0]=0;pushup(y);
} int findroot(int x){
while(ls) pushdown(x),x=ls;
return x;
} int getint(){
int X=0,w=0;char ch=getchar();
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while( isdigit(ch))X=X*10+ch-48,ch=getchar();
if(w) return -X;return X;
} signed main(){
n=getint(),m=getint();scanf("%s",s);
for(int i=1;i<=n;i++){
int opt=getint();db a,b;
scanf("%lf%lf",&a,&b);calc(opt,a,b,i);
pushup(i);
}
while(m--){
scanf("%s",s);
if(s[0]=='a'){
int x=getint()+1,y=getint()+1;
link(x,y);
} else if(s[0]=='d'){
int x=getint()+1,y=getint()+1;
cut(x,y);
} else if(s[0]=='m'){
int id=getint()+1,opt=getint();
db a,b;scanf("%lf%lf",&a,&b);
splay(id),calc(opt,a,b,id),pushup(id);
} else{
int a=getint()+1,b=getint()+1;
db x;scanf("%lf",&x);
split(a,b);
if(findroot(b)!=a){puts("unreachable");continue;}
db ans=sum[b][0],now=1,noww=1;
for(int i=1;i<maxn;i++)
noww*=x,now*=i,ans+=sum[b][i]*noww/now;
printf("%.9lf\n",ans);
}
} return 0;
}

[THUWC2017] 在美妙的数学王国畅游的更多相关文章

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

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

  2. [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(LCT)

    5020: [THUWC 2017]在美妙的数学王国中畅游 Time Limit: 80 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 323  ...

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

    题意 题意奇奇怪怪,这里就不写了. \(\texttt{Data Range:}1\leq n\leq 10^5,1\leq m\leq 2\times 10^5\) 题解 为什么你们都是卡在数学方面 ...

  4. 洛谷P4546 [THUWC2017]在美妙的数学王国中畅游 [LCT,泰勒展开]

    传送门 毒瘤出题人卡精度-- 思路 看到森林里加边删边,容易想到LCT. 然而LCT上似乎很难实现往一条链里代一个数进去求和,怎么办呢? 善良的出题人在下方给了提示:把奇怪的函数泰勒展开搞成多项式,就 ...

  5. Luogu4546 THUWC2017 在美妙的数学王国中畅游 LCT、泰勒展开

    传送门 题意:反正就是一堆操作 LCT总是和玄学东西放在一起我们不妨令$x_0=0.5$(其实取什么都是一样的,但是最好取在$[0,1]$的范围内),将其代入给出的式子,我们得到的$f(x)$的式子就 ...

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

    如果只有第3个操作,那么这就是个sd题,随便lct搞搞就过去了 然后就是一个神仙东西 taylor公式 我不会,看gsy博客https://www.cnblogs.com/zhoushuyu/p/81 ...

  7. BZOJ5020 THUWC2017在美妙的数学王国中畅游(LCT)

    明摆着的LCT,问题在于如何维护答案.首先注意到给出的泰勒展开式,并且所给函数求导非常方便,肯定要用上这玩意.容易想到展开好多次达到精度要求后忽略余项.因为x∈[0,1]而精度又与|x-x0|有关,当 ...

  8. 并不对劲的bzoj5020:loj2289:p4546:[THUWC2017]在美妙的数学王国中畅游

    题目大意 有一个n(\(n\leq 10^5\))个点的森林,每个点\(u\)上有个函数\(f_u(x)\),是形如\(ax+b\)或\(e^{ax+b}\)或\(sin(ax+b)\)的函数,保证当 ...

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

    p.s. 复合函数求导时千万不能先带值,再求导. 一定要先将符合函数按照求导的规则展开,再带值. 设 $f(x)=g(h(x))$,则对 $f(x)$ 求导: $f'(x)=h'(x)g'(h(x)) ...

随机推荐

  1. MyBatis-Plus 3.0.3 Sql注入器添加,即全局配置Sql注入器,sqlInjector改写

    官网上写着 但是,这个其实是2.0系列的写法,由于引用了最新的3.0.3这个功能基本不好使. 3.0.3版本的写法 也就是中间加了一层,原来是AutoSqlInjector,现在改为AbstractS ...

  2. 第44章:MongoDB-集群--Sharding(分片)--分片的片键选择

    ①片键选择的重要性 所谓片键,就是用来拆分数据的字段,通常为1-2个字段,由于片键一旦确定,并已经分片过后,基本上就不可能再修改片键了,因此初期设计和选择就非常重要了 ②片键规则 1:不可以是数组 2 ...

  3. DataTransfer对象的一些总结

    所有元素都支持防止目标事件,但是这些元素默认是不允许释放的,如果拖动元素经过不允许放置的元素无论用户如何操作,都不会触发drop事件,不过可以把任何元素变成有效的放置目标.方法是重写dropenter ...

  4. Python开发——15.协程与I/O模型

    一.协程(Coroutine) 1.知识背景 协程又称微线程,是一种用户态的轻量级线程.子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完 ...

  5. wincc 用脚本记录日志

    方法1: 在vbs脚本库里面添加 Sub LogTxt(message)    Const ForReading = 1, ForWriting = 2, ForAppending = 8    Di ...

  6. 【翻译】从头开始写一个时间序列数据库-Writing a Time Series Database from Scratch

    本文来自: https://fabxc.org/tsdb/, 如翻译有误,请纠正. 我是从事监控工作的.特别是Prometheus, 一个包含自定义的时间序列库以及集成Kuberntes的监控系统. ...

  7. webservice的两种方式SOAP和REST的通俗理解

    Webservice代表所有基于web的服务,包含两种方式SOAP和REST 以SOAP为例: 一个RPC call 就是把一个XML文档post到某个URL下,这个xml文档里写明我要调用的函数名和 ...

  8. beautifulsoup爬取糗事百科

    # _*_ coding:utf-8 _*_ import urllib2 from bs4 import BeautifulSoup user_agent = "Mozilla/5.0 ( ...

  9. CentOS7 openssh7.9p1安装

    先安装telnet,以防安装ssh出现问题,无法远程登录设备. 最新版openssh下载地址:http://www.openssh.com/ftp.html 一.安装telnet和xinetd: 1. ...

  10. JAVA主流框架---SSM整合

      1.通过监听器的形式引入spring 2.SpringMVC容器和Spring容器间的关系 3.汇通的主旨 让大家熟练掌握SSM调用过程.并且将后台调用彻底掌握. 4.传统项目的搭建的弊端 1.传 ...