Description

数学王国中,每个人的智商可以用一个属于 [0,1]的实数表示。数学王国中有 n 个城市,编号从 0 到 n−1 ,这些城市由若干座魔法桥连接。每个城市的中心都有一个魔法球,每个魔法球中藏有一道数学题。每个人在做完这道数学题之后都会得到一个在 [0,1] 区间内的分数。一道题可以用一个从 [0,1] 映射到 [0,1]的函数 f(x) 表示。若一个人的智商为 x ,则他做完这道数学题之后会得到 f(x)分。函数 f有三种形式:
    正弦函数 sin(ax+b) (a∈[0,1],b∈[0,π],a+b∈[0,π])
    指数函数 e^(ax+b) (a∈[−1,1],b∈[−2,0],a+b∈[−2,0])
    一次函数 ax+b (a∈[−1,1],b∈[0,1],a+b∈[0,1]
数学王国中的魔法桥会发生变化,有时会有一座魔法桥消失,有时会有一座魔法桥出现。但在任意时刻,只存在至多一条连接任意两个城市的简单路径(即所有城市形成一个森林)。在初始情况下,数学王国中不存在任何的魔法桥。
数学王国的国王拉格朗日很乐意传授小R数学知识,但前提是小R要先回答国王的问题。这些问题具有相同的形式,即一个智商为 x 的人从城市 u 旅行到城市 v(即经过 u 到 v 这条路径上的所有城市,包括 u和 v )且做了所有城市内的数学题后,他所有得分的总和是多少。

Input

第一行两个正整数 n,m 和一个字符串 type 。
表示数学王国中共有 n 座城市,发生了 m 个事件,该数据的类型为 type 。 
typet 字符串是为了能让大家更方便地获得部分分,你可能不需要用到这个输入。
其具体含义在【数据范围与提示】中有解释。
接下来 n 行,第 i 行表示初始情况下编号为 i 的城市的魔法球中的函数。
一个魔法用一个整数 f表示函数的类型,两个实数 a,b 表示函数的参数,若
    f=1,则函数为 f(x)=sin(ax+b)(a∈[0,1],b∈[0,π],a+b∈[0,π])
    f=2,则函数为 f(x)=e^(ax+b)(a∈[−1,1],b∈[−2,0],a+b∈[−2,0])
    f=3,则函数为 f(x)=ax+b(a∈[−1,1],b∈[0,1],a+b∈[0,1])
接下来 m行,每行描述一个事件,事件分为四类。
    appear u v 表示数学王国中出现了一条连接 u 和 v 这两座城市的魔法桥 (0≤u,v<n,u≠v) ,保证连接前 u和 v 这两座城市不能互相到达。
    disappear u v 表示数学王国中连接 u 和 v 这两座城市的魔法桥消失了,保证这座魔法桥是存在的。
    magic c f a b 表示城市 c 的魔法球中的魔法变成了类型为 f ,参数为 a,b 的函数
    travel u v x 表示询问一个智商为 x 的人从城市 u 旅行到城市 v 
(即经过 u到 v 这条路径上的所有城市,包括 u 和 v )后,他得分的总和是多少。
 若无法从 u 到达 v ,则输出一行一个字符串 unreachable。
1≤n≤100000,1≤m≤200000

Output

对于每个询问,输出一行实数,表示得分的总和。

考虑到函数定义域都是[0,1],维护函数在0.5处的泰勒展开的前几项,可以达到精度要求,然后就是经典的lct操作了

  1. #include<bits/stdc++.h>
  2. typedef double ld;
  3. const int K=,N=1e5+;
  4. ld fiv[K];
  5. struct node{
  6. node*f,*c[];
  7. int rv;
  8. ld v[K],s[K];
  9. void revs(){
  10. if(this)rv^=,std::swap(c[],c[]);
  11. }
  12. void up(ld*a){
  13. for(int i=;i<K;++i)s[i]+=a[i];
  14. }
  15. void up(){
  16. for(int i=;i<K;++i)s[i]=v[i];
  17. if(c[])up(c[]->s);
  18. if(c[])up(c[]->s);
  19. }
  20. void dn(){
  21. if(rv){
  22. c[]->revs();
  23. c[]->revs();
  24. rv=;
  25. }
  26. }
  27. bool nrt(){
  28. return f&&(f->c[]==this||f->c[]==this);
  29. }
  30. int wc(){
  31. return this==f->c[];
  32. }
  33. ld cal(ld x){
  34. x-=0.5;
  35. ld y=;
  36. for(int i=K-;i>=;--i)y=y*x+s[i];
  37. return y;
  38. }
  39. void init(int tp,ld a,ld b){
  40. b+=a/;
  41. if(tp==){
  42. double z[]={sin(b),cos(b),-sin(b),-cos(b)},pa=;
  43. for(int i=;i<K;++i)v[i]=z[i%]*pa*fiv[i],pa*=a;
  44. }else if(tp==){
  45. double z=exp(b);
  46. for(int i=;i<K;++i)v[i]=z*fiv[i],z*=a;
  47. }else if(tp==){
  48. v[]=b,v[]=a;
  49. for(int i=;i<K;++i)v[i]=;
  50. }
  51. up();
  52. }
  53. }ns[N],*ss[N];
  54. int ssp=;
  55. void sc(node*x,int d,node*y){
  56. if(x->c[d]=y)y->f=x;
  57. }
  58. void rot(node*x){
  59. node*f=x->f,*g=f->f;
  60. int d=x->wc();
  61. if(f->nrt())g->c[f->wc()]=x;
  62. x->f=g;
  63. sc(f,d,x->c[d^]);
  64. sc(x,d^,f);
  65. f->up();
  66. }
  67. void sp(node*x){
  68. for(node*a=x;(ss[ssp++]=a)->nrt();a=a->f);
  69. while(ssp)ss[--ssp]->dn();
  70. while(x->nrt()){
  71. node*f=x->f;
  72. if(f->nrt())rot(x->wc()==f->wc()?f:x);
  73. rot(x);
  74. }
  75. x->up();
  76. }
  77. void acs(node*x){for(node*y=;x;sp(x),x->c[]=y,x->up(),y=x,x=x->f);}
  78. void mrt(node*x){acs(x);sp(x);x->revs();}
  79. void lk(node*x,node*y){mrt(x);x->f=y;}
  80. void get(node*x,node*y){mrt(x),acs(y),sp(y);}
  81. void ct(node*x,node*y){get(x,y);x->f=y->c[]=;y->up();}
  82. int n,m,tp;
  83. ld a,b;
  84. int main(){
  85. for(int i=fiv[]=;i<K;++i)fiv[i]=fiv[i-]/i;
  86. scanf("%d%d%*s",&n,&m);
  87. for(int i=;i<n;++i){
  88. scanf("%d%lf%lf",&tp,&a,&b);
  89. ns[i].init(tp,a,b);
  90. }
  91. while(m--){
  92. char op[];
  93. int x,y;
  94. scanf("%s%d%d",op,&x,&y);
  95. if(op[]=='a')lk(ns+x,ns+y);
  96. else if(op[]=='d')ct(ns+x,ns+y);
  97. else if(op[]=='t'){
  98. scanf("%lf",&a);
  99. get(ns+x,ns+y);
  100. node*w=ns+x;
  101. while(w->f)w=w->f;
  102. if(w==ns+y)printf("%.8e\n",w->cal(a));
  103. else puts("unreachable");
  104. sp(ns+x);
  105. }else{
  106. scanf("%lf%lf",&a,&b);
  107. sp(ns+x);
  108. ns[x].init(y,a,b);
  109. }
  110. }
  111. return ;
  112. }

bzoj5020: [THUWC 2017]在美妙的数学王国中畅游的更多相关文章

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

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

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

    题意很明显是要用LCT来维护森林 难点在于如何处理函数之间的关系 我们可以根据题目给的提示关于泰勒展开的式子 将三种函数变成泰勒展开的形式 因为$x∈[0,1]$ 所以我们可以将三个函数在$x_0=0 ...

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

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

  4. bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5020 https://loj.ac/problem/2289 题解 这个 appear 和 d ...

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

    bzoj5020 \[答案误差只要小于 10^{-7}\] 题解 Taylor展开式: \[若f(x)的n阶导数在[a, b]内连续,则f(x)在x_{0}\in[a, b]可表示为\] \[f(x) ...

  6. 解题:THUWC 2017 在美妙的数学王国中畅游

    题面 _“数字和数学规律主宰着这个世界.”_ 在 @i207M 帮助下折腾了半天终于搞懂了导数和泰勒展开,引用某学长在考场上的感受:感觉整个人都泰勒展开了 显然是个奇奇怪怪的东西套上LCT,发现直接维 ...

  7. bzoj 5020(洛谷4546) [THUWC 2017]在美妙的数学王国中畅游——LCT+泰勒展开

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5020 https://www.luogu.org/problemnew/show/P4546 ...

  8. loj2289 [THUWC 2017]在美妙的数学王国中畅游(LCT+Taylor展开)

    link 题目大意: 你需要维护一个树 每个点都有个sin(ax+b)或exp(ax+b)或ax+b 你需要维护一些操作:连边.删边.修改某个点的初等函数.询问某条树链上所有函数带入某个值后权值和或不 ...

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

    参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html --其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊 泰勒展开是到正无穷的,但是因 ...

随机推荐

  1. (17)模型层 -ORM之msql 单表的增、删、改、查 及其他操作

    单表操作-增.删.改.查 ret=models.User.objects.filter(id=1)  #这里的结果是一个queryset对象 ret=modles.User.Objects.filte ...

  2. (0-1)CSS 标签语法的属性

    CSS text-decoration 属性 display display 属性规定元素应该生成的框的类型

  3. whmcs语言汉化路径

    前台语言访问文件夹/lang,后台语言文件放入/admin/lang

  4. 企业wiki之confluence安装部署(linux)及其破解

    系统环境(虚拟机) centos6.5   2G运行内存,30g硬盘,cpu最好也分配两个或多个,因为我在安装过程中发现很卡,cpu占用率几乎占满 需要用到的安装包和文件可以在这里找 链接:https ...

  5. System类的使用

    1.System类: 不能被实例化,调用方式:  System.方法 2.用于计算程序执行的时间,currentTimeMillis()方法 System.currentTimeMillis(): p ...

  6. lsusb

    1.lsusb查看系统的USB设备 $ lsusb Bus Device : ID : Kingston Technology Bus Device : ID 1d6b: Linux Foundati ...

  7. 关于导出csv格式文件的身份证号、日期的处理

    EXCEL系统的单元格,默认格式是常规或数值格式下,数字超过10位即以科学计数法显示,对15位以后的数字用0填充. 在导入到Excel.导出csv文件时,对于身份证号自动变成科学计数法的地方,就要做一 ...

  8. linux下常见软件安装

    读者还可以参考文档:https://download.csdn.net/download/qq_27799563/10482900 Mysql的安装过程: 解压MySQL安装包: tar -xvf M ...

  9. 利用JSON将Map转换为类对象

    Map类型做为一种常见的Java类型,经常在开发过程中使用,笔者最近遇到要将Map对象做为一种通用的参数变量,下传到多个业务类方法中,然后在各个业务类方法中将Map转换为指定类对象的情况.如何将Map ...

  10. Mysql5.6 for Centos6.5源码编译安装

    ## 说明 不同服务器需要改变 server_id ,同一台机器上需要改变 port 1. 关闭防火墙[root@mysql ~]# service iptables status --查看防火墙状态 ...