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

Description

数字和数学规律主宰着这个世界。
 
机器的运转,
 
生命的消长,
 
宇宙的进程,
 
这些神秘而又美妙的过程无不可以用数学的语言展现出来。
 
这印证了一句古老的名言:
 
“学好数理化,走遍天下都不怕。”
 
学渣小R被大学的数学课程虐得生活不能自理,微积分的成绩曾是他在教室里上的课的最低分。然而他的某位陈姓室友却能轻松地在数学考试中得到满分。为了提升自己的数学课成绩,有一天晚上(在他睡觉的时候),他来到了数学王国。
 
数学王国中,每个人的智商可以用一个属于 [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

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

 

Sample Input

3 7 C1
1 1 0
3 0.5 0.5
3 -0.5 0.7
appear 0 1
travel 0 1 0.3
appear 0 2
travel 1 2 0.5
disappear 0 1
appear 1 2
travel 1 2 0.5

Sample Output

9.45520207e-001
1.67942554e+000
1.20000000e+000

解题思路:

题目描述如此毒瘤。

从操作3得到的启发,将多项式展开对应项相加。

这道题可以将sin(ax+b),eax+b泰勒展开。

精度的话16位肯定够。剩下的就是裸的LCT了。

听霉霉的歌写泰勒展开不容易错

代码:

 

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #define lll tr[spc].ch[0]
  5 #define rrr tr[spc].ch[1]
  6 #define ls ch[0]
  7 #define rs ch[1]
  8 const int N=100010;
  9 const int oo=16;
 10 struct trnt{
 11     int ch[2];
 12     int fa;
 13     int lzt;
 14     int type;
 15     bool anc;
 16     double a,b;
 17     double C[oo];
 18     double f[oo];
 19     double val(double x)
 20     {
 21         double ans=f[0];
 22         double t=x;
 23         for(int i=1;i<oo;i++,t*=x)
 24             ans+=f[i]*t;
 25         return ans;
 26     }
 27     void Insert(void)
 28     {
 29         scanf("%d",&type);
 30         scanf("%lf%lf",&a,&b);
 31         return ;
 32     }
 33     void Taylor(double *fac)
 34     {
 35         double at[oo],bt[oo];
 36         for(int i=0;i<oo;i++)
 37             C[i]=at[i]=bt[i]=0;
 38         at[0]=1;
 39         bt[0]=1;
 40         for(int i=1;i<oo;i++)
 41             at[i]=at[i-1]*a,bt[i]=bt[i-1]*b;
 42         if(type==1)
 43         {//sin(ax+b)
 44             double tmp=1;
 45             for(int i=1;i<oo;i+=2)
 46             {
 47                 for(int j=0;j<=i;j++)
 48                     C[j]+=tmp*at[j]*bt[i-j]/fac[j]/fac[i-j];
 49                 tmp*=-1.00;
 50             }
 51             return ;
 52         }
 53         if(type==2)
 54         {//e^(ax+b)
 55             for(int i=0;i<oo;i++)
 56             {
 57                 for(int j=0;j<=i;j++)
 58                     C[j]+=fac[i]/fac[j]/fac[i-j]*at[j]*bt[i-j]/fac[i];
 59             }
 60             return ;
 61         }
 62         if(type==3)
 63         {
 64             C[0]=b;
 65             C[1]=a;
 66             return ;
 67         }
 68     }
 69 }tr[N];
 70 int n,m;
 71 double fac[50];
 72 char tmp[10000];
 73 bool whc(int spc)
 74 {
 75     return tr[tr[spc].fa].rs==spc;
 76 }
 77 void pushup(int spc)
 78 {
 79     for(int i=0;i<oo;i++)
 80         tr[spc].f[i]=tr[spc].C[i];
 81     if(lll)
 82         for(int i=0;i<oo;i++)
 83             tr[spc].f[i]+=tr[lll].f[i];
 84     if(rrr)
 85         for(int i=0;i<oo;i++)
 86             tr[spc].f[i]+=tr[rrr].f[i];
 87     return ;
 88 }
 89 void trr(int spc)
 90 {
 91     if(!spc)
 92         return ;
 93     std::swap(lll,rrr);
 94     tr[spc].lzt^=1;
 95     return ;
 96 }
 97 void pushdown(int spc)
 98 {
 99     if(tr[spc].lzt)
100     {
101         trr(lll);
102         trr(rrr);
103         tr[spc].lzt=0;
104     }
105     return ;
106 }
107 void recal(int spc)
108 {
109     if(!tr[spc].anc)
110         recal(tr[spc].fa);
111     pushdown(spc);
112     return ;
113 }
114 void rotate(int spc)
115 {
116     int f=tr[spc].fa;
117     bool k=whc(spc);
118     tr[f].ch[k]=tr[spc].ch[!k];
119     tr[spc].ch[!k]=f;
120     if(tr[f].anc)
121     {
122         tr[f].anc=0;
123         tr[spc].anc=1;
124     }else
125         tr[tr[f].fa].ch[whc(f)]=spc;
126     tr[spc].fa=tr[f].fa;
127     tr[f].fa=spc;
128     tr[tr[f].ch[k]].fa=f;
129     pushup(f);
130     pushup(spc);
131     return ;
132 }
133 void splay(int spc)
134 {
135     recal(spc);
136     while(!tr[spc].anc)
137     {
138         int f=tr[spc].fa;
139         if(tr[f].anc)
140         {
141             rotate(spc);
142             return ;
143         }
144         if(whc(spc)^whc(f))
145             rotate(spc);
146         else
147             rotate(f);
148         rotate(spc);
149     }
150     return ;
151 }
152 void access(int spc)
153 {
154     int lst=0;
155     while(spc)
156     {
157         splay(spc);
158         tr[rrr].anc=1;
159         tr[lst].anc=0;
160         rrr=lst;
161         lst=spc;
162         pushup(spc);
163         spc=tr[spc].fa;
164     }
165     return ;
166 }
167 void Mtr(int spc)
168 {
169     access(spc);
170     splay(spc);
171     trr(spc);
172     return ;
173 }
174 void split(int x,int y)
175 {
176     Mtr(x);
177     access(y);
178     splay(y);
179     return ;
180 }
181 void link(int x,int y)
182 {
183     Mtr(x);
184     tr[x].fa=y;
185     return ;
186 }
187 bool together(int x,int y)
188 {
189     split(x,y);
190     while(tr[y].ls)
191         y=tr[y].ls;
192     return x==y;
193 }
194 void cut(int x,int y)
195 {
196     split(x,y);
197     tr[x].fa=0;
198     tr[x].anc=true;
199     tr[y].ls=0;
200     pushup(y);
201     return ;
202 }
203 int main()
204 {
205     scanf("%d%d",&n,&m);
206     scanf("%s",tmp);
207     fac[0]=1;
208     for(int i=1;i<oo;i++)
209     {
210         double x=i;
211         fac[i]=fac[i-1]*x;
212     }
213     for(int i=1;i<=n;i++)
214     {
215         tr[i].Insert();
216         tr[i].Taylor(fac);
217         tr[i].anc=1;
218     }
219     while(m--)
220     {
221         scanf("%s",tmp+1);
222         if(tmp[1]=='a')
223         {
224             int a,b;
225             scanf("%d%d",&a,&b);
226             a++,b++;
227             link(a,b);
228         }else if(tmp[1]=='d')
229         {
230             int a,b;
231             scanf("%d%d",&a,&b);
232             a++,b++;
233             cut(a,b);
234         }else if(tmp[1]=='m')
235         {
236             int x;
237             scanf("%d",&x);
238             x++;
239             splay(x);
240             tr[x].Insert();
241             tr[x].Taylor(fac);
242         }else{
243             int a,b;
244             scanf("%d%d",&a,&b);
245             double x;
246             scanf("%lf",&x);
247             a++,b++;
248             if(!together(a,b))
249                 puts("unreachable");
250             else{
251                 double ret=tr[b].val(x);
252                 printf("%.8e\n",ret);
253             }
254         }
255     }
256     return 0;
257 }

 

 

 

转载于:https://www.cnblogs.com/blog-Dr-J/p/10116746.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis存储数据类型_Redis与Memcahe的区别最全整理

经常看到大家只能对比redis和memecache的前两项区别【持久化】和【数据类型】&#xff0c;这里&#xff0c;给整理了最全的memcache和redis的区别&#xff0c;欢迎交流哦缓存(1)【持久化能力】Redis支持持久化&#xff0c;memcache也支持但一般不做持久化(重启丢失数据)(2)【数…

java学习(117):list迭代器和包含方法

import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; //员工信息类 //date类 public class test50 {private String name;private String sex;private Date birth;public void showme(){System.out.println(this.getName());System.out.p…

Python转码解压多进程

Python批量转换文件编码格式 Eclipse中看ANSI编码的文件有乱码&#xff0c;所以希望通过python将相关文件转换成utf-8编码。 源&#xff1a;https://www.cnblogs.com/tsbc/p/4450675.html 遍历文件夹 如果文件名是.cpp .h 如果原来的编码不是utf-8,将文件编码格式改成utf-…

某项目的双代号网络图如下所示_2019一级建造师项目管理知识点大全3

更多精彩内容&#xff0c;点击 蓝字 关注我们1Z203000 建设工程项目进度控制1Z203010 建设工程项目进度控制与进度计划系统>>> 1Z203011 项目进度控制的目的考点 1&#xff1a;项目进度控制的工作环节 项目管理各方都有进度控制的任务&#xff0c;但其控制的目标和…

java学习(118):vector类

import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; //员工信息类 //date类 public class test50 {private String name;private String sex;private Date birth;public void showme(){System.out.println(this.getName());System.out.p…

Ipython\Jupyter数据分析工具

使用Python进行数据分析优点   1 Python大量的库为数据分析和处理提供了完整的工具集   2 比起R和Matlab等其他主要用于数据分析的编程语言&#xff0c;Python更全能   3 Python库一直在增加&#xff0c;算法的实现采用更具有创新性的方法   4 Python能和很多语言对接&…

linux搭建vsftp服务器_Linux安装配置vsftp搭建FTP的详细配置

vsftp是very secure ftp的缩写&#xff0c;它最初的发展理念就是构建一个安全的ftp服务。现在它确实是一个非常安全稳定的ftp服务软件&#xff0c;广泛用作在Unix/Linux操作系统中&#xff0c;作为文件服务器使用。安装vsftp这里演示使用yum安装&#xff0c;该软件非常的小&…

java学习(119):set类

public class Goods {//商品实体类private String number;//商品编号private String name;//商品价格private double price;//商品单价private int quantity;//商品数量public void setNumber(String number) {this.number number;}public String getNumber() {return numbe…

分页的limit_20.MySQL中的LIMIT(分页)

对于一次性查询出的大量记录&#xff0c;不仅不便于阅读查看&#xff0c;还会浪费系统效率。MySQL中提供了一个关键字LIMIT&#xff0c;可以限定记录的数量&#xff0c;也可以指定查询从哪一条记录开始(通常用于分页)。1.准备CREATE DATABASE mahaiwuji;USE mahaiwuji;CREATE T…

java学习(120):set的iterator

public class Goods {//商品实体类private String number;//商品编号private String name;//商品价格private double price;//商品单价private int quantity;//商品数量public void setNumber(String number) {this.number number;}public String getNumber() {return numbe…

深入浅出etcd系列 – 心跳和选举

作者&#xff1a;宝爷 校对&#xff1a;DJ 1、绪论 etcd作为华为云PaaS的核心部件&#xff0c;实现了PaaS大多数组件的数据持久化、集群选举、状态同步等功能。如此重要的一个部件&#xff0c;我们只有深入地理解其架构设计和内部工作机制&#xff0c;才能更好地学习华为云Kube…

java学习(121):treeset排序集合

//treeset排序集合 import java.util.*;public class test61{public static void main(String[] args){TreeSet treenew TreeSet();//创建一个采用默认树形自然排序的对象tree.add(new Integer(50));tree.add(new Integer(150));tree.add(new Integer(250));tree.add(new Integ…

修改value_EXCEL批量名称修改

!!嘿嘿,今天给大家更新一章网上算是比较热的一个EXCEL技巧,当然这个是用VBA才能做到的,那就是名称的批量修改.打个比方吧.如果今天你要整理一下,你过往的一些照片,或者文件,这些文件或者照片要按照编辑时间和事件名称来进行编辑,那么你会怎么办?或者说,今天我到西湖去玩了一趟…

java处理url中的特殊字符%等

java处理url中的特殊字符&#xff08;如&,%...&#xff09;URL(Uniform Resoure Locator&#xff0c;统一资源定位器)是Internet中对资源进行统一定位和管理的标志。一个完整的URL包括如下内容&#xff1a;1. 应用协议名称&#xff0c;包括http,ftp,file等标志2. …

java学习(122):treeset自定义排序

//自定义排序 import java.util.*; public class test62 {public static void main(String[] args){TreeSet treenew TreeSet();//创建一个采用默认树形自然排序的对象tree.add(new Integer(50));tree.add(new Integer(150));tree.add(new Integer(250));tree.add(new Integer(…

运行指定代码_JavaScript 运行机制(Event Loop)详解

一、为什么JavaScript是单线程&#xff1f;JavaScript语言的一大特点就是单线程&#xff0c;也就是说&#xff0c;同一个时间只能做一件事。那么&#xff0c;为什么JavaScript不能有多个线程呢&#xff1f;这样能提高效率啊。JavaScript的单线程&#xff0c;与它的用途有关。作…

Java 支付宝支付,退款,单笔转账到支付宝账户(单笔转账到支付宝账户)

上次分享了支付宝订单退款的代码,今天分享一下支付宝转账的操作. 现在是有一个余额提现的功能,本来是打算做提现到银行卡的,但是客户嫌麻烦不想注册银联的开放平台账户,就说先提现到支付宝就行,二期再做银行卡的提现. 先在支付宝APP里添加此功能,需要签约. 此API官方参数文档 …

java学习(123):treeset排序集合

import java.util.Comparator;public class GoodsSorts implements Comparator {public int compare(Object o1,Object o2){Goods g1(Goods)o1;Goods g2(Goods)o2;System.out.println("调用排序方法");if(g1.getPrice()>g2.getPrice()){return -1;}else if(g1.get…

python全栈工程师能接到私活么_Python全栈工程师(包、模块 的导入)

ParisGabriel每天坚持手写 一天一篇 决定坚持几年 为了梦想 为了信仰Python人工智能从入门到精通$ pip3 install tensorflow &#xff1a;第三方模块tensorflow 的安装电脑必须有网 命令行自动下载安装dir(模块名)&#xff1a;查看模块所有属性自定义模块导入示例:自定义模块…

题目一:给出一个n,代表有从1到n的数字[1,2,3,··· n],问可以构成多少种二叉搜索树?...

题目一&#xff1a;给出一个n,代表有从1到n的数字[1,2,3, n]&#xff0c;问可以构成多少种二叉搜索树&#xff1f; 一开始的想法是直接递归构造&#xff0c;时间复杂度是指数上升&#xff1b;后来想法是找规律&#xff1a;先看例子&#xff1a; n 1, 有一个元素,可以构成一个二…