题目背景

帕秋莉有一个巨大的图书馆,里面有数以万计的书,其中大部分为魔导书。

题目描述

魔导书是一种需要钥匙才能看得懂的书,然而只有和书写者同等或更高熟练度的人才能看得见钥匙。因此,每本魔导书都有它自己的等级 ai,同时它也有自己的知识程度为 wi​,现在我们想要知道,一个等级为 bi的生物(...),可以从这些魔导书中得到多少知识。

然而不幸的是,每个生物并不知道自己确切的等级,只有一个等级的大致范围,你需要计算出这个生物获得知识程度的期望值。

输入格式

第一行两个正整数 n,m 代表起始书的个数,以及操作的个数。

以下 n 行,每行两个正整数 ai 和 wi​,代表每本书的等级以及知识程度。

接下来的 m 行,每行 2 或 3 个正整数。

操作 1:格式:1 x y。含义:求等级为 [x,y] 的生物能获得的期望知识程度。

操作 2:格式:2 x y。含义:图书馆又收入了一本等级为 x,知识程度为 y 的魔导书。

输出格式

输出包含若干行实数,即为所有操作 1 的结果,答案保留四位小数。

输入输出样例

输入 #1

5 5

1 1

2 1

3 1

4 1

5 1

1 2 5

1 1 5

1 3 5

2 1 5

1 1 2

输出 #1

3.5000

3.0000

4.0000

6.5000

说明/提示

对于 30% 的数据,保证 1 <=所有输入的数字 ≤10^3。

对于 100% 的数据,保证 1≤n,m≤10^5,对于其他数字,保证在 32 位带符号整数范围内(保证运算中所有的数均在 −2^63∼2^63−1 内)。

分析

首先,题目让我们求的是这个柿子

$\displaystyle\sum_{i=x}^{y} tot[i] $ /(y-x+1)

即 \(\displaystyle\sum_{i=x}^{y} tot[i] \over y-x+1\)

tot[i]为i这个等级能看到的知识程度的总和。

我们可以以等级为区间,知识程度为权值。

那不就是区间和除以区间长度了吗?

看到区间和,我们就可以想到用线段树来维护。

但等级可能会达到2^32-1,所以我们考虑一下动态开点或者离散化(蒟蒻我不会写)

当新添一本书后,等级大于他的都可以看到,就相当于从这本书的等级到inf的区间,加上这本书的知识程度。

查询操作,就是区间和除以区间长度就OK了。

一定要注意开 long long(不开long long 见祖宗)

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. #define LL long long
  6. const int inf = 2147483536;
  7. int n,m,x,y,opt,root,tot;
  8. inline int read()
  9. {
  10. int s = 0, w = 1; char ch = getchar();
  11. while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
  12. while(ch >= '0' && ch <= '9'){s = s * 10+ch -'0'; ch = getchar();}
  13. return s * w;
  14. }
  15. struct Tree
  16. {
  17. struct node{
  18. int lc,rc;
  19. LL sum,add;
  20. }tr[10000010];
  21. void down(int o,int l,int r)//下放操作
  22. {
  23. if(tr[o].add)
  24. {
  25. int mid = (l+r)>>1;
  26. if(!tr[o].lc) tr[o].lc = build();//如果没有子节点就新建一个
  27. if(!tr[o].rc) tr[o].rc = build();
  28. tr[tr[o].lc].add += tr[o].add;//正常的下放操作
  29. tr[tr[o].rc].add += tr[o].add;
  30. tr[tr[o].lc].sum += 1LL * tr[o].add * (mid-l+1);
  31. tr[tr[o].rc].sum += 1LL * tr[o].add * (r-mid);
  32. tr[o].add = 0;
  33. }
  34. }
  35. int build()//新建一个节点
  36. {
  37. tot++;
  38. tr[tot].lc = tr[tot].rc = tr[tot].sum = 0;
  39. return tot;
  40. }
  41. void insert(int root,int L,int R,int x,int y,int val)//区间修改
  42. {
  43. if(x <= L && y >= R)
  44. {
  45. tr[root].add += val;
  46. tr[root].sum +=1LL * val * (R-L+1);
  47. return;
  48. }
  49. int mid = (L+R)>>1;
  50. down(root,L,R);//下放标记
  51. if(x <= mid)
  52. {
  53. if(!tr[root].lc) tr[root].lc = build();//一定要新开节点,不然就会RE
  54. insert(tr[root].lc,L,mid,x,y,val);
  55. }
  56. if(y > mid)
  57. {
  58. if(!tr[root].rc) tr[root].rc = build();
  59. insert(tr[root].rc,mid+1,R,x,y,val);
  60. }
  61. tr[root].sum = tr[tr[root].lc].sum + tr[tr[root].rc].sum;//up操作
  62. }
  63. LL ask(int root,int L,int R,int x,int y)//区间和
  64. {
  65. LL ans = 0;
  66. if(x <= L && y >= R){return tr[root].sum;}
  67. int mid = (L+R)>>1;
  68. down(root,L,R);
  69. if(!tr[root].lc) tr[root].lc = build();
  70. if(!tr[root].rc) tr[root].rc = build();
  71. if(x <= mid) ans += ask(tr[root].lc,L,mid,x,y);
  72. if(y > mid) ans += ask(tr[root].rc,mid+1,R,x,y);
  73. return ans;
  74. }
  75. }tree;
  76. int main()
  77. {
  78. n = read(); m = read();
  79. root = tree.build();
  80. for(int i = 1; i <= n; i++)
  81. {
  82. x = read(); y = read();
  83. tree.insert(root,1,inf,x,inf,y);//从x到inf区间加y
  84. }
  85. for(int i = 1; i <= m; i++)
  86. {
  87. opt = read(); x = read(); y = read();
  88. if(opt == 1)
  89. {
  90. LL tmp = tree.ask(root,1,inf,x,y);
  91. double ans = (double) tmp / (double)(y-x+1);
  92. printf("%.4lf\n",ans);
  93. }
  94. if(opt == 2)
  95. {
  96. tree.insert(root,1,inf,x,inf,y);
  97. }
  98. }
  99. return 0;
  100. }

P4915 帕秋莉的魔导书(动态开点线段树)的更多相关文章

  1. P4915 帕秋莉的魔导书

    题目链接 题意分析 当前等级为\(x\)的魔法书会对等级在\([x,inf]\)的所有人造成\(y\)的影响 所以除了求平均值之外 就是区间修改区间求和 需要使用动态开点 + 标记永久化 需要注意的是 ...

  2. P4910 帕秋莉的手环

    题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...

  3. [Luogu] P4910 帕秋莉的手环

    题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...

  4. 【Cogs2187】帕秋莉的超级多项式(多项式运算)

    [Cogs2187]帕秋莉的超级多项式(多项式运算) 题面 Cogs 题解 多项式运算模板题 只提供代码了.. #include<iostream> #include<cstdio& ...

  5. cogs 998. [東方S2] 帕秋莉·诺蕾姬

    二次联通门 : cogs 998. [東方S2] 帕秋莉·诺蕾姬 交上去后发现自己没上榜 就想着加点黑科技 把循环展开一下 结果WA了.. 万恶的姆Q /* cogs 998. [東方S2] 帕秋莉· ...

  6. 魔卡少女(cardcaptor)——线段树

    题目 [题目描述] 君君是中山大学的四年级学生.有一天在家不小心开启了放置在爸爸书房中的一本古书.于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地.这时 ...

  7. 【HZOI2015】帕秋莉的超级多项式

    题面 题目分析 超级模板题: 多项式乘法 多项式求逆 多项式开根 多项式求导 多项式求积分 多项式求对数 多项式求自然对数为底的指数函数 多项式快速幂 代码实现 #include<iostrea ...

  8. COGS2187 [HZOI 2015] 帕秋莉的超级多项式

    什么都别说了,咱心态已经炸了... question 题目戳这里的说... 其实就是叫你求下面这个式子的导函数: noteskey 其实是道板子题呢~ 刚好给我们弄个多项式合集的说... 各种板子粘贴 ...

  9. 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解

    矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...

随机推荐

  1. asterisk 传真服务器配置

    摘要: asterisk 可以作为电子传真服务器,进行收发电子传真.但是配置起来,比较麻烦,需要一番折腾.在这儿分享一下电子传真的配置,希望对朋友们有所帮助. 正题: asterisk 如果需要收发电 ...

  2. 攻防世界——Misc新手练习区解题总结<2>(5-8题)

    第五题gif: 下载附件后,解压得到这样一个文件 几经寻找无果后,发现是不是可以将gif中的黑白图片看做二进制的数字,进而进行解密 最后用二进制转文本得到flag 第六题掀桌子: 看起来是16进制的密 ...

  3. 浅析一个lua文件窥slua工作机制

    slua的东西不是几句话能讲得完,这里只说结论不说原因,原因有空写个Little Slua工程来解释,下面注释中有几个关键点:LuaVar系列类:LuaFunction,LuaTable,LuaDel ...

  4. ios 常见性能优化

    1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier 3. 尽可能使Views透明 4. 避免庞大的XIB 5. 不要block主线程 6. 在Image Views中调整图片 ...

  5. 面试【JAVA基础】JVM

    1.内存模型 1.1.堆 堆是所有线程共享的,主要存放对象实例和数组. 新生代和老年代的比例是1:2. 新生代中三个区域的比例是 8 : 1 : 1. 1.1.1.新生代 对象分配在eden区中,当e ...

  6. .net core中使用jwt进行认证

    JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证和信任 ...

  7. Centos 镜像文件下载

    1. Centos 官网 https://www.centos.org 进入下载页面,选择下载的版本即可 不推荐在官网下载,因为官网上提供的下载地址很多是国外网站,下载太慢了 2. 阿里云Centos ...

  8. 面向对象--继承-通过super()来调用父类方法

    super()的使用 问题: class Master(object): def __init__(self): self.kongfu = "古法煎饼果子配方" # 实例变量,属 ...

  9. Dos拒绝服务Sockstress/TearDrop 泪滴攻击(二)

    Sockstress放大攻击原理:攻击者向目标发送一个很小的流量,但是会造成产生的攻击流量是一个巨大的.成百上千倍上万倍流量被放大的一个效果,才适合作为一个拒绝服务攻击效果.(实现攻击者很小的流量打垮 ...

  10. 漏桶、令牌桶限流的Go语言实现

    限流 限流又称为流量控制(流控),通常是指限制到达系统的并发请求数. 我们生活中也会经常遇到限流的场景,比如:某景区限制每日进入景区的游客数量为8万人:沙河地铁站早高峰通过站外排队逐一放行的方式限制同 ...