传送门

考虑每一段对答案的贡献

用每一段的左端点来表示当前这一段,那么区间就变成了[1,n-1]

如果询问区间[l,r],其中一个点的位置为x,则它对答案的贡献为(x-l)*(r-x)*s[x](s[x]为这一段的权值)

化简后得x*s[x]*(l+r-1)-s[x]*(l*r-r)-x*x*s[x]

那么我们就需要维护x*s[x],s[x],x*x*s[x]

其中还需要预处理出来x和x*x

然后就ok了

#include <cstdio>
#include <cstring>
#include <iostream>
#define N 500001
#define LL long long
#define root 1, 1, n - 1
#define ls now << 1, l, mid
#define rs now << 1 | 1, mid + 1, r using namespace std; int n, m;
LL s, xs, xxs, ans1, ans2;
LL x1[N], x2[N], sum1[N], sum2[N], sum3[N], add[N];
//x1表示 x
//x2表示 x^2
//sum1表示 s[x]
//sum2表示 x * s[x]
//sum3表示 x^2 * s[x] inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline void push_down(int now, int l, int r)
{
if(add[now])
{
int mid = (l + r) >> 1;
sum1[now << 1] += 1ll * add[now] * (mid - l + 1);
sum1[now << 1 | 1] += 1ll * add[now] * (r - mid);
sum2[now << 1] += add[now] * x1[now << 1];
sum2[now << 1 | 1] += add[now] * x1[now << 1 | 1];
sum3[now << 1] += add[now] * x2[now << 1];
sum3[now << 1 | 1] += add[now] * x2[now << 1 | 1];
add[now << 1] += add[now];
add[now << 1 | 1] += add[now];
add[now] = 0;
}
} inline void push_up(int now)
{
sum1[now] = sum1[now << 1] + sum1[now << 1 | 1];
sum2[now] = sum2[now << 1] + sum2[now << 1 | 1];
sum3[now] = sum3[now << 1] + sum3[now << 1 | 1];
} inline void update(int now, int l, int r, int x, int y, LL z)
{
if(x <= l && r <= y)
{
add[now] += z;
sum1[now] += 1ll * z * (r - l + 1);
sum2[now] += 1ll * z * x1[now];
sum3[now] += 1ll * z * x2[now];
return;
}
push_down(now, l, r);
int mid = (l + r) >> 1;
if(x <= mid) update(ls, x, y, z);
if(mid < y) update(rs, x, y, z);
push_up(now);
} inline void build(int now, int l, int r)
{
if(l == r)
{
x1[now] += l;
x2[now] += 1ll * l * l;
return;
}
int mid = (l + r) >> 1;
build(ls);
build(rs);
x1[now] = x1[now << 1] + x1[now << 1 | 1];
x2[now] = x2[now << 1] + x2[now << 1 | 1];
} inline void query(int now, int l, int r, int x, int y)
{
if(x <= l && r <= y)
{
s += sum1[now];
xs += sum2[now];
xxs += sum3[now];
return;
}
push_down(now, l, r);
int mid = (l + r) >> 1;
if(x <= mid) query(ls, x, y);
if(mid < y) query(rs, x, y);
} inline LL gcd(LL x, LL y)
{
return !y ? x : gcd(y, x % y);
} int main()
{
LL g, z;
int i, x, y;
char c[10];
n = read();
m = read();
build(root);
while(m--)
{
scanf("%s", c);
if(c[0] == 'C')
{
x = read();
y = read();
z = read();
update(root, x, y - 1, z);
}
else
{
x = read();
y = read();
s = xs = xxs = 0;
query(root, x, y - 1);
ans2 = 1ll * (1 + y - x) * (y - x) / 2;
ans1 = 1ll * xs * (x + y - 1) - s * (1ll * x * y - y) - xxs;
g = gcd(ans1, ans2);
printf("%lld/%lld\n", ans1 / g, ans2 / g);
}
}
return 0;
}

  

一个longlong调了我45min,WNM

[luoguP2221] [HAOI2012]高速公路(线段树)的更多相关文章

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

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

  2. BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )

    对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...

  3. BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1219  Solved: 446[Submit] ...

  4. P2221 [HAOI2012]高速公路(线段树)

    P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ...

  5. BZOJ 2752:[HAOI2012]高速公路(road)(线段树)

    [HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y ...

  6. 【线段树】BZOJ2752: [HAOI2012]高速公路(road)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1621  Solved: 627[Submit] ...

  7. 高速公路 [HAOI2012] [线段树]

    Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个 ...

  8. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 736[Submit][Status][Discuss] Descripti ...

  9. 【bzoj2752】[HAOI2012]高速公路(road) 线段树

    题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...

随机推荐

  1. Android学习总结(三)——IntentService的用法

    一.IntentService的基本概念 IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentServi ...

  2. [习题]输入自己的生日(年/月/日)#2 -- 日历(Calendar)控件的时光跳跃,一次跳回五年、十年前?--TodaysDate属性、VisibleDate属性

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/06/10/calendar_visibledate_birthday_dropdow ...

  3. Servlet和JSP之标签文件学习

    在上一篇文章中介绍了自定义标签的用法,接下来介绍标签文件的用法啦. tag file指令 tag file简介 用tag file的方式,无需编写标签处理类和标签库描述文件,也可以自定义标签.tag ...

  4. es的插件 ik分词器的安装和使用

    今天折腾了一天,在es 5.5.0 上安装ik.一直通过官方给定的命令没用安装成功,决定通过手工是形式进行安装.https://github.com/medcl/elasticsearch-analy ...

  5. Linux之Nginx服务 nfs文件存储 负载均衡

    一.搭建Nginx服务 Nginx 是俄罗斯人编写的十分轻量级的HTTP 服务器,Nginx,它的发音为"engine X",是一个高性能的HTTP和反向代理服务器,同时也是一个I ...

  6. node mocha mochawesome报安装不成功

    1.进行cnpm安装: npm install cnpm -g --registry=https://registry.npm.taobao.org 2.查看cnpm版本 cnpm -v 3.安装mo ...

  7. selenium-元素的定位

    前戏 元素的定位是自动化测试的核心,要想操作一个元素,首先应该识别这个元素.Webdriver 提供了一系列的元素定位方法,常用的有 id,name,class name,link text,part ...

  8. [置顶] IIS应用程序池多工作进程设置及Session共享

    [置顶] IIS应用程序池多工作进程设置及Session共享   在调优iis的时候,朋友分享给我一个特别棒的设置方法步骤,感谢好朋友的分享. IIS应用程序池多工作进程设置及Session共享 1  ...

  9. prototype中的ajax异步加载

    jquery前台处理: var param = {a:a}; $.post("*.do",param,function(data) { var columHtml = " ...

  10. struts2基于注解的action

    使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了. 要使用注解方式,我们必须添加一个额外包:struts2-convention-plu ...