• 洛谷P3932 浮游大陆的68号岛


    题目背景

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

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

    岛上被浓厚的森林覆盖。

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

    题目描述

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

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

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

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

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

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

    比如储物点ii有xx个东西,要运到储物点jj,代价为

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

    dist就是仓库间的距离。

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

    输入输出格式

    输入格式:

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

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

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

    之后mm行每行三个数x 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 le 1000n,m1000

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

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

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

    题解:

      稍微推一下式子,把绝对值拆开,用线段树维护一下就可以了。

    代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #define MAXN 200100
    #define mod 19260817
    #define ll long long
    using namespace std;
    ll dis[MAXN],v[MAXN];
    struct tree{
        int l,r,sum1,sum2;
    }a[MAXN*4];
    int n,q;
    
    void pushup(int xv){
        a[xv].sum1=a[xv*2].sum1+a[xv*2+1].sum1;
        a[xv].sum2=a[xv*2].sum2+a[xv*2+1].sum2;
        a[xv].sum1%=mod;a[xv].sum2%=mod;
    }
    
    void build(int xv,int l,int r){
        if(l==r){
            a[xv].l=a[xv].r=l;
            a[xv].sum1=v[l];a[xv].sum2=(dis[l]*v[l])%mod;
            return;
        }
        a[xv].l=l,a[xv].r=r;
        int mid=(l+r)/2;
        build(xv*2,l,mid),build(xv*2+1,mid+1,r);
        pushup(xv);
    }
    
    tree query(int xv,int l,int r){
        int L=a[xv].l,R=a[xv].r,mid=(L+R)/2;
        if(L==l&&R==r){
            return a[xv];
        }
        if(r<=mid) return query(xv*2,l,r);
        else if(l>mid) return query(xv*2+1,l,r);
        else{
            tree x=query(xv*2,l,mid),y=query(xv*2+1,mid+1,r),ans;
            ans.sum1=(x.sum1+y.sum1)%mod;
            ans.sum2=(x.sum2+y.sum2)%mod;
            return ans;
        }
    }
    
    int main()
    {
        scanf("%d%d",&n,&q);
        dis[1]=1;
        for(int i=2;i<=n;i++){
            int x;scanf("%d",&x);
            dis[i]=dis[i-1]+x;dis[i]%=mod;
        }
        for(int i=1;i<=n;i++) scanf("%lld",&v[i]),v[i]%=mod;
        build(1,1,n);
        while(q--){
            int k,l,r;scanf("%d%d%d",&k,&l,&r);
            if(l>=k){
                tree x=query(1,l,r);
                ll hh=(dis[k]*x.sum1)%mod;
                ll hhh=((x.sum2-hh)+mod)%mod;
                printf("%lld
    ",hhh);
            }
            else if(r<=k){
                tree x=query(1,l,r);
                printf("%lld
    ",((dis[k]*x.sum1)%mod-x.sum2+mod)%mod);
            }
            else{
                tree x=query(1,l,k),y=query(1,k+1,r);
                ll hh=(dis[k]*x.sum1)%mod-x.sum2,hhh=y.sum2-(dis[k]*y.sum1);
                hh=((hh)%mod+mod)%mod,hhh=((hhh)%mod+mod)%mod;
                printf("%lld
    ",(hh+hhh)%mod);
            }
        }
        return 0;
    }
  • 相关阅读:
    使用RPC的接口创建账户同时购买内存并为其抵押CPU和NET资源
    使用RPC的接口创建账户
    【移动安全基础篇】——21、Android脱壳思路
    插件
    NGUI 优化
    影子
    优化文章索引
    MVC
    《你不常用的c#之XX》
    CMake
  • 原文地址:https://www.cnblogs.com/renjianshige/p/7708368.html
Copyright © 2020-2023  润新知