[SDOI2017]相关分析

思路:

  裸线段树;

  (玄学ac);

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 100005
  4. struct TreeNodeType {
  5. int l,r,mid;
  6. double flagx2,flagy2,flagx3,flagy3,size;
  7. double sumx,sumy,suml,sumxy,sumx2,sumy2,suml2;
  8. bool if_3;
  9. inline void updata2(double posx,double posy)
  10. {
  11. sumx2+=size*posx*posx+*posx*sumx;
  12. sumy2+=size*posy*posy+*posy*sumy;
  13. sumxy+=size*posx*posy+sumx*posy+sumy*posx;
  14. sumx+=size*posx,sumy+=size*posy;
  15. flagx2+=posx,flagy2+=posy;
  16. }
  17. inline void updata3(double posx,double posy)
  18. {
  19. sumxy=size*posx*posy+suml*(posx+posy)+suml2;
  20. sumx2=size*posx*posx+posx**suml+suml2;
  21. sumy2=size*posy*posy+posy**suml+suml2;
  22. sumx=size*posx+suml,sumy=size*posy+suml;
  23. if_3=true,flagx3=posx,flagy3=posy;
  24. flagx2=,flagy2=;
  25. }
  26. };
  27. struct TreeNodeType tree[maxn<<];
  28. int n,m;
  29. double Sumx,Sumy,Sumx2,Sumy2,Sumxy,ai[maxn],bi[maxn];
  30. inline void updata(int now)
  31. {
  32. tree[now].sumx=tree[now<<].sumx+tree[now<<|].sumx;
  33. tree[now].sumy=tree[now<<].sumy+tree[now<<|].sumy;
  34. tree[now].suml=tree[now<<].suml+tree[now<<|].suml;
  35. tree[now].sumxy=tree[now<<].sumxy+tree[now<<|].sumxy;
  36. tree[now].sumx2=tree[now<<].sumx2+tree[now<<|].sumx2;
  37. tree[now].sumy2=tree[now<<].sumy2+tree[now<<|].sumy2;
  38. tree[now].suml2=tree[now<<].suml2+tree[now<<|].suml2;
  39. }
  40. void build(int now,int l,int r)
  41. {
  42. tree[now].l=l,tree[now].r=r,tree[now].size=r-l+;
  43. if(l==r)
  44. {
  45. tree[now].sumx=ai[l],tree[now].sumy=bi[l],tree[now].suml=l;
  46. tree[now].sumxy=ai[l]*bi[l],tree[now].suml2=(double)l*l;
  47. tree[now].sumx2=ai[l]*ai[l],tree[now].sumy2=bi[l]*bi[l];
  48. return;
  49. }
  50. tree[now].mid=l+r>>;
  51. build(now<<,l,tree[now].mid);
  52. build(now<<|,tree[now].mid+,r);
  53. updata(now);
  54. }
  55. inline void pushdown(int now)
  56. {
  57. if(tree[now].if_3)
  58. {
  59. tree[now].if_3=false;
  60. tree[now<<].updata3(tree[now].flagx3,tree[now].flagy3);
  61. tree[now<<|].updata3(tree[now].flagx3,tree[now].flagy3);
  62. }
  63. if(tree[now].flagx2||tree[now].flagy2)
  64. {
  65. tree[now<<].updata2(tree[now].flagx2,tree[now].flagy2);
  66. tree[now<<|].updata2(tree[now].flagx2,tree[now].flagy2);
  67. tree[now].flagx2=,tree[now].flagy2=;
  68. }
  69. }
  70. void operation1(int now,int l,int r)
  71. {
  72. if(tree[now].l>=l&&tree[now].r<=r)
  73. {
  74. Sumx+=tree[now].sumx,Sumy+=tree[now].sumy;
  75. Sumx2+=tree[now].sumx2,Sumy2+=tree[now].sumy2;
  76. Sumxy+=tree[now].sumxy;return;
  77. }
  78. if(tree[now].if_3||tree[now].flagx2||tree[now].flagy2) pushdown(now);
  79. if(l<=tree[now].mid) operation1(now<<,l,r);
  80. if(r>tree[now].mid) operation1(now<<|,l,r);
  81. }
  82. void operation2(int now,int l,int r,double s,double t)
  83. {
  84. if(tree[now].l>=l&&tree[now].r<=r)
  85. {
  86. tree[now].updata2(s,t);
  87. return;
  88. }
  89. if(tree[now].if_3||tree[now].flagx2||tree[now].flagy2) pushdown(now);
  90. if(l<=tree[now].mid) operation2(now<<,l,r,s,t);
  91. if(r>tree[now].mid) operation2(now<<|,l,r,s,t);
  92. updata(now);
  93. }
  94. void operation3(int now,int l,int r,double s,double t)
  95. {
  96. if(tree[now].l>=l&&tree[now].r<=r)
  97. {
  98. tree[now].updata3(s,t);
  99. return;
  100. }
  101. if(tree[now].if_3||tree[now].flagx2||tree[now].flagy2) pushdown(now);
  102. if(l<=tree[now].mid) operation3(now<<,l,r,s,t);
  103. if(r>tree[now].mid) operation3(now<<|,l,r,s,t);
  104. updata(now);
  105. }
  106. int main()
  107. {
  108. scanf("%d%d",&n,&m);
  109. for(int i=;i<=n;i++) scanf("%lf",&ai[i]);
  110. for(int i=;i<=n;i++) scanf("%lf",&bi[i]);
  111. build(,,n);
  112. int op,l,r;double s,t;
  113. while(m--)
  114. {
  115. scanf("%d%d%d",&op,&l,&r);
  116. if(op==)
  117. {
  118. Sumx=,Sumy=,Sumxy=,Sumx2=,Sumy2=;
  119. operation1(,l,r);
  120. double size=r-l+,x_=Sumx/size,y_=Sumy/size;
  121. double a=Sumxy-Sumy*x_-Sumx*y_+y_*x_*size;
  122. double b=Sumx2-*Sumx*x_+x_*x_*size;
  123. printf("%.10lf\n",a/b);
  124. }
  125. if(op==) scanf("%lf%lf",&s,&t),operation2(,l,r,s,t);
  126. if(op==) scanf("%lf%lf",&s,&t),operation3(,l,r,s,t);
  127. }
  128. return ;
  129. }

AC日记——[SDOI2017]相关分析 洛谷 P3707的更多相关文章

  1. AC日记——寻找道路 洛谷 P2296

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  2. AC日记——铺地毯 洛谷 P1003(水水水水水~)

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  3. AC日记——过河卒 洛谷 1002

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  4. AC日记——丢瓶盖 洛谷 P1316

    题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入输出 ...

  5. AC日记——滑动窗口 洛谷 P1886

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  6. AC日记——挤牛奶 洛谷 P1204

    题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开 ...

  7. AC日记——导弹拦截 洛谷 P1020 (dp+模拟)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  8. AC日记——信息传递 洛谷 P2661 (tarjan求环)

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  9. AC日记——积木大赛 洛谷 P1969

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

随机推荐

  1. PC蓝牙通信C#代码实现

    PC蓝牙通信C#代码实现 这篇文章主要为大家详细介绍了PC蓝牙通信C#代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了C#实现PC蓝牙通信代码,供大家参考,具体内容如下 ...

  2. js正则表达式,判断字符串是否以数字组结尾,并取出结尾的数字

    js正则表达式,判断字符串是否以数字组结尾,并取出结尾的数字 <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  3. C/C++中二维数组和指针关系分析

    在C/c++中,数组和指针有着密切的关系,有很多地方说数组就是指针式错误的一种说法.这两者是不同的数据结构.其实,在C/c++中没有所谓的二维数组,书面表达就是数组的数组.我猜想是为了表述方便才叫它二 ...

  4. 【题解】Weird journey Codeforces 788B 欧拉路

    传送门:http://codeforces.com/contest/788/problem/B 好题!好题! 首先图不连通的时候肯定答案是0,我们下面讨论图联通的情况 首先考虑,如果我们每条边都经过两 ...

  5. Ubuntu 15.04 编译UE4 for Linux版

    源 起 Unreal Engine 4 是全球最先进的Realtime Illumination & Physical 引擎: 长期以来,UE4都只有Windows版和Mac版,今年终于向Li ...

  6. 【20151105noip膜你赛】bzoj3652 bzoj3653

    题目仿佛在讽刺我... 第一题: 题解: 考虑枚举区间右端点,维护所以左到当前的 and 和 or .注意 and 每次变化至少有一个二进制位从1变 0,or 每次至少有一个位从0变 1,所以最多有l ...

  7. bzoj 2762: [JLOI2011]不等式组——树状数组

    旺汪与旺喵最近在做一些不等式的练习.这些不等式都是形如ax+b>c 的一元不等式.当然,解这些不等式对旺汪来说太简单了,所以旺喵想挑战旺汪.旺喵给出一组一元不等式,并给出一个数值 .旺汪需要回答 ...

  8. 爬虫--requests讲解

    什么是requests? Requests是用Python语言编写,基于urllib,采用Apache2 Licensed 开源协议的HTTP库.它比urllib更加方便,可以节约我们大量的工作,完全 ...

  9. System V共享内存介绍

    (一)简单概念 共享内存作为一种进程间通信的方式,其相较于其他进程间通信方式而言最大的优点就是数据传输速率快.其内部实现的方式采用了Linux进程地址空间中的mmap文件映射区,将文件内容直接映射到各 ...

  10. Iptables基础整理

    Iptables基础框架