【THUWC2017】在美妙的数学王国中畅游

题面

https://www.luogu.org/problem/P4546

题解

泰勒展开一般函数转多项式,$LCT$维护多项式。

#include<cmath>
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ri register int
#define N 120000
using namespace std;

const double e=pow(2,1/log(2));
char typ[15];
int n,m,f[N],ch[N][2],ff[N],rev[N];
double ts[N][15],a[N],b[N];
stack<int> s;

bool notroot(int x) {
  return ch[ff[x]][0]==x || ch[ff[x]][1]==x;
}
bool opt(int x) {
  return ch[ff[x]][1]==x;
}

void pushup(int x) {
  if (f[x]==1) {
    ts[x][0]=sin(a[x]*0.5+b[x]);
    ts[x][1]=cos(a[x]*0.5+b[x])*a[x];
    for (ri i=2;i<15;i++) ts[x][i]=ts[x][i-2]*(-a[x]*a[x]);
  }
  else if (f[x]==2) {
    ts[x][0]=pow(e,0.5*a[x]+b[x]);
    for (ri i=1;i<15;i++) ts[x][i]=ts[x][i-1]*a[x];
  }
  else if (f[x]==3) {
    ts[x][0]=0.5*a[x]+b[x];
    ts[x][1]=a[x];
    for (ri i=2;i<15;i++) ts[x][i]=0;
  }
  for (ri i=0;i<15;i++) ts[x][i]+=ts[ch[x][0]][i]+ts[ch[x][1]][i];
}

void pushdown(int x) {
  if (!rev[x]) return;
  rev[x]=0;
  swap(ch[x][0],ch[x][1]);
  rev[ch[x][0]]^=1; rev[ch[x][1]]^=1;
}

void rotate(int x) {
  int y=ff[x],z=ff[y],s=opt(x),w=ch[x][1^s];
  ff[x]=z; if (notroot(y)) ch[z][opt(y)]=x;
  ch[y][s]=w; ff[w]=y;
  ff[y]=x; ch[x][1^s]=y;
  pushup(y); pushup(x);
}

void splay(int x) {
  int tx=x;
  while (1) {
    s.push(tx);
    if (!notroot(tx)) break;
    tx=ff[tx];
  }
  while (!s.empty()) pushdown(s.top()),s.pop();
  while (notroot(x)) {
    if (!notroot(ff[x])) {
      rotate(x);
    }
    else {
      if (opt(x)==opt(ff[x])) rotate(ff[x]),rotate(x);
      else rotate(x),rotate(x);
    }
  }
}

void access(int x) {
  int y=0;
  while (x) {
    splay(x);
    ch[x][1]=y; pushup(x);
    y=x; x=ff[x];
  }
}

void makeroot(int x) {
  access(x); splay(x);
  rev[x]^=1;
}

void split(int x,int y) {
  makeroot(x);
  access(y); splay(y);
}

void cut(int x,int y) {
  split(x,y);
  ff[x]=ch[y][0]=0;
  pushup(y);
}

void link(int x,int y) {
  makeroot(x);
  ff[x]=y;
}

int findroot(int x) {
  access(x); splay(x);
  while (ch[x][0]) x=ch[x][0];
  return x;
}

int main() {
  scanf("%d %d %s",&n,&m,typ);
  for (ri i=1;i<=n;i++) scanf("%d %lf %lf",&f[i],&a[i],&b[i]);
  char ch[20];
  for (ri i=1,u,v;i<=m;i++) {
    scanf("%s",ch);
    if (ch[0]==‘a‘) {
      scanf("%d %d",&u,&v);
      u++; v++;
      link(u,v);
    }
    else if (ch[0]==‘d‘) {
      scanf("%d %d",&u,&v);
      u++; v++;
      cut(u,v);
    }
    else if (ch[0]==‘m‘) {
      scanf("%d",&u);
      u++;
      splay(u);
      scanf("%d %lf %lf",&f[u],&a[u],&b[u]);
      pushup(u);
    }
    else {
      double T;
      scanf("%d %d %lf",&u,&v,&T);
      u++; v++;
      if (findroot(u)!=findroot(v)) {
        puts("unreachable");
      }
      else {
        double ans=0;
        split(u,v);
        double p1=1,p2=1;
        for (ri i=0;i<15;i++) ans+=ts[v][i]*p2/p1,p1*=(i+1),p2*=(T-0.5);
        printf("%.8e\n",ans);
      }
    }
  }
  return 0;
}

原文地址:https://www.cnblogs.com/shxnb666/p/11478813.html

时间: 2024-11-08 13:58:15

【THUWC2017】在美妙的数学王国中畅游的相关文章

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

5020: [THUWC 2017]在美妙的数学王国中畅游 Time Limit: 80 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 323  Solved: 136[Submit][Status][Discuss] Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数学的语言展现出来. 这印证了一句古老的名言: “学好数理化,走遍天下都不怕.” 学渣小R被大

THUWC2017 在美妙的数学王国中畅游

在美妙的数学王国中畅游 数学王国中,每个人的智商可以用一个属于 \([0,1]\) 的实数表示.数学王国中有 \(n\) 个城市,编号从 \(0\) 到 \(n-1\) ,这些城市由若干座魔法桥连接.每个城市的中心都有一个魔法球,每个魔法球中藏有一道数学题.每个人在做完这道数学题之后都会得到一个在 \([0,1]\) 区间内的分数.一道题可以用一个从 \([0,1]\) 映射到 \([0,1]\) 的函数 \(f(x)\) 表示.若一个人的智商为 \(x\) ,则他做完这道数学题之后会得到 \(

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

传送门 题意:反正就是一堆操作 LCT总是和玄学东西放在一起我们不妨令$x_0=0.5$(其实取什么都是一样的,但是最好取在$[0,1]$的范围内),将其代入给出的式子,我们得到的$f(x)$的式子就是一个多项式了.然后复习一下导数:$(Cf(x))'=Cf'(x)$($C$为常数)$sin'(x)=cos(x),cos'(x)=-sin(x),(e^x)'=e^x,C'=0 , (ax+b)'=a$令$g(x)=u$,则$f[g(x)]' = f'(u) \times g'(x)$有了这些式子

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

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

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

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]

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

题面 _"数字和数学规律主宰着这个世界."_ 在 @i207M 帮助下折腾了半天终于搞懂了导数和泰勒展开,引用某学长在考场上的感受:感觉整个人都泰勒展开了 显然是个奇奇怪怪的东西套上LCT,发现直接维护的话并不能快速链上求和.所以用友好的提示里的泰勒展开,对每个点的函数进行泰勒展开后就变成了维护多项式的和,大概展开十几项精度就够了(我展开了16项).题目告诉我们了这三个函数在[0,1]都能展开,那就在零点展开呗,这不是最方便的吗=.= 当然因为可能~~并没~~有人和制杖的我一样对导数一

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

https://loj.ac/problem/2289 LCT+泰勒展开 首先e^x求导完是ln e * e^x还是e^x sin x求导完变成cos x,cos x求导完变成sin x 由于复合函数f(g(x))求导完是f'(g(x))*g'(x) 所以就可以轻松的推出sin x和e^x的n阶导数 对于泰勒展开的那个公式,我们发现x0=0.5时,每一项的系数为1/2/n!,到了后面对ans的影响非常小,可以忽略,于是我们只要把多项式的前14项提出来就好. 接下来动态树上的操作用Link Cut

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

参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html --其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊 泰勒展开是到正无穷的,但是因为精度问题,所以一般展开十几项就可以(这里展开了17项).以下是公式: \[ e^x=\sum_{i=0}^{\infty}\frac{x^i}{i!} \] \[ sin(x)=\sum_{i=0}^{\infty}\frac{(-1)^ix^{2i+1}}{(2i+1)!} \] 然后用二项式定

关于数学函数中的abs

数学函数中的abs当你用abs之后括号之中的数字就转换成了int格式.可能会丢失一些数据造成误差而且还会有,    警告: #include<stdio.h> #include<math.h> int main() { __int64 a,b,c; while(scanf("%I64X%I64X",&a,&b)!=EOF) { c=abs(a+b); if((a+b)>=0) printf("%I64X\n",c); e