zoukankan      html  css  js  c++  java
  • [Luogu3932] 浮游大陆的68号岛

    题目背景

    大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg

    浮游大陆的68号岛,位于浮游大陆的边境地带。平时很少有人造访。

    岛上被浓厚的森林覆盖。

    在这座边境地区不起眼的浮游岛上,建立着神秘的”兵器“管理仓库——妖精仓库。

    题目描述

    妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活。

    换用更高尚的说法,是随时准备着为这个无药可救的世界献身。

    然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂漫的生活,自然也无暇考虑什么拯救世界之类的重任。

    有一天小妖精们又在做游戏。这个游戏是这样的。

    妖精仓库的储物点可以看做在一个数轴上。每一个储物点会有一些东西,同时他们之间存在距离。

    每次他们会选出一个小妖精,然后剩下的人找到区间[l,r][l,r][l,r]储物点的所有东西,清点完毕之后问她,把这个区间内所有储物点的东西运到另外一个仓库的代价是多少?

    比如储物点iii有xxx个东西,要运到储物点jjj,代价为

    x×dist(i,j)x imes mathrm{dist}( i , j )x×dist(i,j)

    dist就是仓库间的距离。

    当然啦,由于小妖精们不会算很大的数字,因此您的答案需要对19260817取模。

    输入输出格式

    输入格式:

    第一行两个数表示n,mn,mn,m

    第二行n−1n-1n1个数,第iii个数表示第iii个储物点与第i+1i+1i+1个储物点的距离

    第三行nnn个数,表示每个储物点的东西个数

    之后mmm行每行三个数x l r

    表示查询要把区间[l,r][l,r][l,r]储物点的物品全部运到储物点x的花费

    输出格式:

    对于每个询问输出一个数表示答案

    输入输出样例

    输入样例#1: 复制
    5 5
    2 3 4 5
    1 2 3 4 5
    1 1 5
    3 1 5
    2 3 3
    3 3 3
    1 5 5
    
    输出样例#1: 复制
    125
    72
    9
    0
    70

    说明

    对于30%的数据,n,m≤1000n , m le 1000n,m1000

    对于另外20%的数据,所有储物点间的距离都为1

    对于另外20%的数据,所有储物点的物品数都为1

    对于100%的数据 ,n,m≤200000;ai,bi<=2⋅109 n , m le 200000 ; a_i , b_i <= 2cdot 10^9n,m200000;ai,bi<=2109


    前缀和的应用。

    比如我们要求$x$左边的贡献。

    $large ans=sum|d[x]-d[i]|*a[i]$

    $large =sum d[x]*a[i]-d[i]*a[i]$

    $large =d[x]*sum a[i]-sum d[i]*a[i]$

    $x$右边的同理。

    所以我们可以计算$large sum a[i]$和$large sum d[i]*a[i]$就行了。


    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    #define reg register 
    #define int long long
    inline int read() {
        int res = 0;char ch=getchar();
        while(!isdigit(ch)) ch=getchar();
        while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48), ch=getchar();
        return res;
    }
    #define mod 19260817
    #define N 200005
    int n, m;
    int sigmaA[N], sigmaDa[N];
    int d[N], a[N];
    
    signed main()
    {
        n = read(), m = read();
        for (reg int i = 2 ; i <= n ; i ++) 
        {
            d[i] = read();
            d[i] = (d[i] + d[i-1]) % mod;
        }
        for (reg int i = 1 ; i <= n ; i ++) 
        {
            a[i] = read();
            sigmaA[i] = (sigmaA[i-1] + a[i]) % mod;
            sigmaDa[i] = (sigmaDa[i-1] + d[i] * a[i] % mod) % mod;
        }
        while(m--)
        {
            int x = read(), l = read(), r = read();
            int ans = 0;
            if (x < l) {
                ans = -d[x] * (sigmaA[r] - sigmaA[l-1]) % mod + (sigmaDa[r] - sigmaDa[l-1]);
                printf("%lld
    ", (ans % mod + mod) % mod);
                continue;
            }
            if (x > r)  {
                ans = d[x] * (sigmaA[r] - sigmaA[l-1]) % mod - (sigmaDa[r] - sigmaDa[l-1]);
                printf("%lld
    ", (ans % mod + mod) % mod);
                continue;
            }
            ans = d[x] * (sigmaA[x] - sigmaA[l-1]) % mod - (sigmaDa[x] - sigmaDa[l-1]);
            ans = (ans + (-d[x] * (sigmaA[r] - sigmaA[x]) % mod + (sigmaDa[r] - sigmaDa[x])) % mod) % mod;
            printf("%lld
    ", (ans % mod + mod) % mod);
        }
        return 0;
    }
  • 相关阅读:
    String内置方法
    【练习题】三级城市选择
    【练习题】购物车练习
    【练习题】计算还能活多少年
    【练习题】猜年龄
    【练习题】比大小
    【练习题】打印长方形
    【练习题】格式化打印
    【练习题】奇数偶数打印
    Ansible配置管理工具
  • 原文地址:https://www.cnblogs.com/BriMon/p/9608722.html
Copyright © 2011-2022 走看看