bzoj2752

线段树+概率

今天这道题爆零了,奥妙重重。

其实我们可以把式子化成这样:sigma((i-l+1)*(r-i+1)*ai) 这里r减了1

然后展开,(1-l)*(r+1)*ai+(r+l)*i*ai-i*i*ai

我们发现除了含有i的项其他都可以提到外面,也就是说我们要维护ai,i*ai,i*i*ai三个量。

那么就用线段树维护,打标记时用数列公式即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100010;
int n, m;
struct seg {
    ll tag[N << 2], tree[N << 2][4];
    void pushdown(int x, int l, int r)
    {
        if(!tag[x]) return;
        tag[x << 1] += tag[x];
        tag[x << 1 | 1] += tag[x];
        int mid = (l + r) >> 1;
        tree[x << 1][1] += tag[x] * (ll)(mid - l + 1ll);
        tree[x << 1 | 1][1] += tag[x] * (ll)(r - mid);
        tree[x << 1][2] += tag[x] * (ll)(l + mid) * (ll)(mid - l + 1) / 2ll;
        tree[x << 1 | 1][2] += tag[x] * (ll)(r + mid + 1ll) * (ll)(r - mid) / 2ll;
        tree[x << 1][3] += tag[x] * ((ll)mid * (ll)(mid + 1ll) * (ll)(2ll * mid + 1ll) - (ll)(l - 1ll) * (ll)l * (ll)(2ll * l - 1ll)) / 6ll;
        tree[x << 1 | 1][3] += tag[x] * ((ll)r * (ll)(r + 1ll) * (ll)(2ll * r + 1ll) - (ll)mid * (ll)(mid + 1ll) * (ll)(2ll * mid + 1ll)) / 6ll;
        tag[x]= 0ll;
    }
    void update(int l, int r, int x, int a, int b, ll delta)
    {
        if(l > b || r < a) return;
        if(l >= a && r <= b)
        {
            tag[x] += delta;
            tree[x][1] += (ll)(r - l + 1ll) * delta;
            tree[x][2] += (ll)(l + r) * (ll)(r - l + 1) / 2ll * delta;
            tree[x][3] += ((ll)r * (ll)(r + 1ll) * (2ll * r + 1) - (ll)(l - 1ll) * (ll)l * (ll)(2ll * l - 1ll)) / 6ll * delta;
            return;
        }
        pushdown(x, l, r);
        int mid = (l + r) >> 1;
        update(l, mid, x << 1, a, b, delta);
        update(mid + 1, r , x << 1 | 1, a, b, delta);
        for(int i = 1; i <= 3; ++i)
            tree[x][i] = tree[x << 1][i] + tree[x << 1 | 1][i];
    }
    ll query(int l, int r, int x, int a, int b, int type)
    {
        if(l > b || r < a) return 0ll;
        if(l >= a && r <= b) return tree[x][type];
        pushdown(x, l, r);
        int mid = (l + r) >> 1;
        return (query(l, mid, x << 1, a, b, type) + (query(mid + 1, r, x << 1 | 1, a, b, type)));
    }
} t;
ll gcd(ll a, ll b)
{
    return !b ? a : gcd(b, a % b);
}
int main()
{
//    freopen("c.in", "r", stdin);
//    freopen("c.out", "w", stdout);
    scanf("%d%d", &n, &m);
    --n;
    while(m--)
    {
        char s[10]; int l, r; ll delta; scanf("%s", s);
        if(s[0] == ‘C‘)
        {
            scanf("%d%d%lld", &l , &r, &delta);
            --r;
            t.update(1, n, 1, l, r, delta);
        }
        if(s[0] == ‘Q‘)
        {
            scanf("%d%d", &l, &r);
            --r;
            ll T1 = t.query(1, n, 1, l, r, 1);
            ll T2 = t.query(1, n, 1, l, r, 2);
            ll T3 = t.query(1, n, 1, l, r, 3);
            ll ans = (ll)(1ll - l) * (ll)(r + 1ll) * T1 + (ll)(r + l) * T2 - T3;
            ll T4 = (ll)(r - l + 2ll) * (ll)(r - l + 1ll) / 2ll;
            ll T = gcd(ans, T4);
            printf("%lld/%lld\n", ans / T, T4 / T);
        }
    }
//    fclose(stdin); fclose(stdout);
    return 0;
}

时间: 2024-08-15 19:16:15

bzoj2752的相关文章

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

[BZOJ2752][HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用.高速路刚建成时所有的路段都是免费的.政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政

bzoj-2752 高速公路 road

题意: 给出一个n个结点,n-1条边的链,边权初始为0: m次操作,操作有两种: 1. C:区间[l,r]的边权加上或减去一个数: 2. Q:查询区间随机取不相同两点之间的期望长度: 题解: 区间加减之类的东西显然是线段树的应用,恰巧这道题就在链上: 主要这题还是维护第二问的东西: 区间[l,r]的选路方式共有(r-l+1)*(r-l)/2这些种,那么只要求出所有路径总长度就好了: 对每一条路x来考虑的话,这条路被选的条件是同时选了左面的点和右面的点: 假设这条路的权值是val[x],那么这条路

BZOJ2752: [HAOI2012]高速公路(road)

2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][Status] Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行

bzoj2752 高速公路

列式子: 如果把从i号收费站到i+1号收费站之间路段编号设为i. 假如查询l号收费站到r号收费站之间的期望值. $ Ans_{l,r} = \sum\limits_{i=l}^{r-1} v_i \times (r-i) \times (i-l+1) $ $ = \sum\limits_{i=l}^{r-1} v_i \times (r \times i - r \times l + r - i^2 + i \times l - i) $ $ = \sum\limits_{i=l}^{r-1}

【BZOJ2752】【线段树】高速公路

Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用.高速路刚建成时所有的路段都是免费的. 政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价. 无聊的小A同学总喜欢研究一些稀奇古怪的问题

HAOI2012高速公路bzoj2752 (线段树,数学)

题目大意: 给定一个长度为n的链,一共m次操作 对于每次操作 \(C\ l\ r\ x\)表示将第l个点到第r个点之间的所有道路的权值增加v \(Q\ l\ r\)在第l个到第r个点里等概率随机取出两个不同的点a和b,那么从a行驶到b将期望花费多少费用呢 QwQ我们可以考虑将期望分为分子和分母两部分 首先考虑分母,分母就是在\(r-l+1\)个点中选两个点的方案数,也就是\({r-l+1}\choose 2\) 而分子就是总权值了 对于一个在\([l,r]\)的点\(i\)来说 它会被计算\((

屯题计划

感觉lxt一天到晚就是在浪啊浪, 毫无斗志, 颓废得不得了, 每天看小说玩手机到三四点然后整个人都是乱七八糟的. 不行不行我要振作起来了! 从最开始学语言到现在都快两年过去了 T T , 代码能力还是渣成这样简直不能看 T T 觉得应该学学zj爷们屯题. 加油! (题目是直接从劼很久以前的几篇屯题计划里边搬过来的我之前做过的题就删掉了 [BZOJ1822][JSOI2010]Frozen Nova 冷冻波 很水的网络流加计算几何, 然而计算几何部分非常莫名奇妙, 题目应该是判断一个圆是否与一个线

挖坑贴——2014年结束前要做的题目们

2014/10/26: BZOJ2752 [HAOI2012]高速公路(road)  --线段树,操作太烦了的说... BZOJ1020 [SHOI2008]安全的航线flight  --二逼计算几何T T BZOJ1013 [JSOI2008]球形空间产生器sphere  --貌似是高斯消元? BZOJ1033 [ZJOI2008]杀蚂蚁antbuster  --大家程序都写了300行+我去><

【LCT】BZOJ3091 城市旅行

3091: 城市旅行 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1927  Solved: 631[Submit][Status][Discuss] Description Input Output Sample Input 4 5 1 3 2 5 1 2 1 3 2 4 4 2 4 1 2 4 2 3 4 3 1 4 1 4 1 4 Sample Output 16/3 6/1 HINT 对于所有数据满足 1<=N<=50,000 1&l