题目链接

  这题……我从一开始就想歪了qwq。

  为了缅怀逝去的一小时我就把我的30分暴力思路放上来。

  首先我们观察枚举的区间。假设我们要枚举的范围是1~5之间的四条路,为了方便我们把它们叫做abcd。

  那么观察我们枚举的区间。

  a  ab  abc  abcd  b  bc  bcd  c  cd  d

  观察有一些区间是可以合起来的。

  然后观察a出现4次,b出现6次,c出现6次,d出现4次。

  是有一定规律的qwq

  然后就$\frac{nm}{2}的复杂度搞搞  就三十分

  正确思路是,观察一条路选不选上(设这条路左点x):左区间在(l,x),右区间在(x+1,r)

  这些区间会把这条路选上。

  于是这条路选上的次数就等于(x-l+1)(r-x)s[x]

  化简得到x*s[x]、s[x]、x^2*s[x]三种可以用线段树维护的东西

  然后线段树搞

  

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cctype>
  4. #include<algorithm>
  5. #include<cstdlib>
  6. #define left (rt<<1)
  7. #define right (rt<<1|1)
  8. #define mid ((l+r)>>1)
  9. #define lson l,mid,left
  10. #define rson mid+1,r,right
  11. inline long long read(){
  12. long long num=,f=;
  13. char ch=getchar();
  14. while(!isdigit(ch)){
  15. if(ch=='-') f=-;
  16. ch=getchar();
  17. }
  18. while(isdigit(ch)){
  19. num=num*+ch-'';
  20. ch=getchar();
  21. }
  22. return num*f;
  23. }
  24.  
  25. long long gcd(long long a,long long b){ return b==?a:gcd(b,a%b); }
  26.  
  27. long long sum[];
  28. long long mul[];
  29. long long tree[];
  30. long long sree[];
  31. long long mree[];
  32. long long tag[];
  33.  
  34. inline void pushup(int rt){
  35. tree[rt]=tree[left]+tree[right];
  36. sree[rt]=sree[left]+sree[right];
  37. mree[rt]=mree[left]+mree[right];
  38. }
  39.  
  40. void pushdown(int rt,int l,int r){
  41. if(tag[rt]==) return;
  42. tag[left]+=tag[rt];
  43. tag[right]+=tag[rt];
  44. tree[left]+=tag[rt]*((r-l+)-((r-l+)>>));
  45. tree[right]+=tag[rt]*((r-l+)>>);
  46. sree[left]+=tag[rt]*(sum[mid]-sum[l-]);
  47. sree[right]+=tag[rt]*(sum[r]-sum[mid]);
  48. mree[left]+=tag[rt]*(mul[mid]-mul[l-]);
  49. mree[right]+=tag[rt]*(mul[r]-mul[mid]);
  50. tag[rt]=;
  51. }
  52.  
  53. void update(int from,int to,long long num,int l,int r,int rt){
  54. if(from<=l&&to>=r){
  55. tag[rt]+=num;
  56. tree[rt]+=num*(r-l+);
  57. sree[rt]+=num*(sum[r]-sum[l-]);
  58. mree[rt]+=num*(mul[r]-mul[l-]);
  59. return;
  60. }
  61. pushdown(rt,l,r);
  62. if(from<=mid) update(from,to,num,lson);
  63. if(to>mid) update(from,to,num,rson);
  64. pushup(rt);
  65. }
  66.  
  67. struct Ans{
  68. long long x,y,z;
  69. void clear(){x=y=z=;}
  70. Ans operator +(const Ans a){
  71. Ans ans=(Ans){x+a.x,y+a.y,z+a.z};
  72. return ans;
  73. }
  74. };
  75.  
  76. Ans query(int from,int to,int l,int r,int rt){
  77. if(from<=l&&to>=r) return(Ans){tree[rt],sree[rt],mree[rt]};
  78. pushdown(rt,l,r);
  79. Ans opt; opt.clear();
  80. if(from<=mid) opt=query(from,to,lson);
  81. if(to>mid) opt=opt+query(from,to,rson);
  82. return opt;
  83. }
  84.  
  85. int main(){
  86. int n=read(),m=read();
  87. for(int i=;i<=n;++i){
  88. sum[i]=sum[i-]+i;
  89. mul[i]=mul[i-]+1LL*i*i;
  90. }
  91. for(int i=;i<=m;++i){
  92. char ch[];
  93. scanf("%s",ch);int x=read(),y=read();
  94. if(ch[]=='C'){
  95. long long z=read();
  96. update(x,y-,z,,n-,);
  97. }
  98. else{
  99. Ans now=query(x,y-,,n-,);
  100. long long ans=;
  101. ans+=now.y*(long long)(x+y-);
  102. ans+=now.x*(long long)(1LL*y-1LL*x*y);
  103. ans-=now.z;
  104. long long len=y-x+;
  105. long long cnt=len*(len-)/;
  106. long long gc=gcd(ans,cnt);
  107. ans/=gc; cnt/=gc;
  108. printf("%lld/%lld\n",ans,cnt);
  109. }
  110. }
  111. return ;
  112. }

【Luogu】P2221高速公路(线段树乱搞)的更多相关文章

  1. [bzoj1067][SCOI2007]降雨量——线段树+乱搞

    题目大意 传送门 题解 我国古代有一句俗话. 骗分出奇迹,乱搞最神奇! 这句话在这道题上得到了鲜明的体现. 我的方法就是魔改版线段树,乱搞搞一下,首先借鉴了黄学长的建树方法,直接用一个节点维护年份的区 ...

  2. 洛谷P5211 [ZJOI2017]字符串(线段树+乱搞)

    题面 传送门 题解 为什么大佬们全都是乱搞的--莫非这就是传说中的暴力能进队,乱搞能AC-- 似乎有位大佬能有纯暴力+玄学优化\(AC\)(不算上\(uoj\)的\(Hack\)数据的话--这要是放到 ...

  3. JZYZOJ1527 [haoi2012]高速公路 线段树 期望

    http://172.20.6.3/Problem_Show.asp?id=1527 日常线段树的pushdown写挂,果然每次写都想得不全面,以后要注意啊……求期望部分也不熟练,和平均数搞混也是or ...

  4. Luogu P1471 方差 线段树

    那是上上周...也是重构了四遍...后来GG了...今天又拾起,搞了搞终于过了... 好吧就是个线段树,公式懒得推了https://www.cnblogs.com/Jackpei/p/10693561 ...

  5. [Luogu] 可持久化线段树 1(主席树)

    https://www.luogu.org/problemnew/show/P3834 #include<cstdio> #include<iostream> #include ...

  6. Luogu P5280 [ZJOI2019]线段树

    送我退役的神题,但不得不说是ZJOIDay1最可做的一题了 先说一下考场的ZZ想法以及出来后YY的优化版吧 首先发现每次操作其实就是统计出增加的节点个数(原来的不会消失) 所以我们只要统计出线段树上每 ...

  7. luogu 1712 区间(线段树+尺取法)

    题意:给出n个区间,求选择一些区间,使得一个点被覆盖的次数超过m次,最小的花费.花费指的是选择的区间中最大长度减去最小长度. 坐标值这么大,n比较小,显然需要离散化,需要一个技巧,把区间转化为半开半闭 ...

  8. Luogu P3960 列队 线段树

    题面 线段树入门题. 我们考虑线段树来维护这个矩阵. 首先我们先定n+1棵线段树前n棵维护每行前m-1个同学中没有离队过的同学,还有一棵维护第m列中没有离队过的同学.再定n+1棵线段树前n棵线段树维护 ...

  9. 【BZOJ-4523】路由表 Trie树 + 乱搞

    4523: [Cqoi2016]路由表 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 155  Solved: 98[Submit][Status][ ...

随机推荐

  1. Python-OpenCV——Image inverting

    通常我们将读入的彩色图转化成灰度图,需要将灰度图反转得到掩码,如何正确快速的得到某个图像的反转图呢? 首先看一种看似很正确的写法,对其中每个像素进行如下处理: img[x,y] = abs(img[x ...

  2. cityspace

    类别的网址:https://blog.csdn.net/u010069760/article/details/77847595 r,g,b:  250 170 160 parking   244 35 ...

  3. Feign-手动创建FeignClient

    前言 在<Feign-请求不同注册中心的服务>中,提到,如果需要请求不同注册中心的服务,可以设置@FeignClient的url属性. 这种做法有个缺点,需要服务消费者,配置各个环境的ur ...

  4. FastText算法

    转载自: https://www.cnblogs.com/huangyc/p/9768872.html 0. 目录 1. 前言 2. FastText原理 2.1 模型架构 2.2 层次SoftMax ...

  5. untiy3d action管理机制的编写

    使用unity3d对于一些可视化强迫者来说,是一个不错的选择,但unity3d没有cocos2d的action管理机制,比如cocos2dx的CCMoveTo,CCScale等action,所以笔者通 ...

  6. 理解JS闭包的几个小实验

    学了JavaScript有一段时间了,但是对闭包还是不太理解,于是怀着心中的疑问做了几个小实验,终于有点明白了. 首先看一下MDN上的定义:闭包是函数和声明该函数的词法环境的组合. 简单来说,闭包是一 ...

  7. 转 救命的教程 anaconda下载安装包网络错误的解决办法

    折腾了一天,终于找到了这个解决办法 https://blog.csdn.net/sinat_29315697/article/details/80516498

  8. java解析多层嵌套json字符串

    java分别解析下面两个json字符串 package jansonDemo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjso ...

  9. OAuth认证协议中的HMACSHA1加密算法

    <?php function hmacsha1($key,$data) { $blocksize=64; $hashfunc='sha1'; if (strlen($key)>$block ...

  10. POJ:1094-Sorting It All Out(拓扑排序经典题型)

    Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Description An ascending sorted sequence ...