• 浮游大陆的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

    1 对于输入的x、l、r满足$x leq l$

    这种情况的答案$ans=(mul_{r}-mul_{l-1})-(sum_{r}-sum_{l-1})dis_i$

    2 对于输入的x、l、r满足$r leq x$

    很显然这种情况的$ans=sum_{r}-sum_{l-1})dis_i-(mul_{r}-mul_{l-1})$

    3 需要注意的就是$l leq x leq r$的这种情况

    对于区间内x之前的部分,有$ans=(sum_{x-1}-sum_{l-1})dis_x-(mul_{x-1}-mul_{l-1})$

    对于区间内x之后的部分,有$ans=(mul_{r}-mul_{x})-(sum_{r}-sum_{x})dis_{x}$

    然后我们把两个ans加起来就是这种情况的答案

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int Mod=19260817;
     7 long long ans,s[200005],w[200005],x[200005],n,m;
     8 int main()
     9 {int i,j,l,r,p;
    10 long long d;
    11     cin>>n>>m;
    12     for (i=1;i<=n-1;i++)
    13     {
    14      scanf("%lld",&d);
    15      x[i+1]=x[i]+d;
    16      x[i+1]%=Mod;
    17     }
    18     for (i=1;i<=n;i++)
    19     {
    20      scanf("%lld",&w[i]);
    21      s[i]=s[i-1]+w[i]*x[i];
    22      s[i]%=Mod;
    23     }
    24     for (i=1;i<=n;i++)
    25     w[i]+=w[i-1],w[i]%=Mod;
    26     while (m--)
    27     {
    28         scanf("%d%d%d",&p,&l,&r);
    29         if (p<=l)
    30         {
    31             ans=(s[r]-s[l-1]+Mod)%Mod;
    32             ans=(ans-x[p]*((w[r]-w[l-1]+Mod)%Mod)%Mod+Mod)%Mod;
    33             printf("%lld
    ",ans%Mod);    
    34         }
    35         else if (p>=r)
    36         {
    37             ans=x[p]*((w[r]-w[l-1]+Mod)%Mod)%Mod;
    38             ans=(ans-(s[r]-s[l-1]+Mod)%Mod+Mod)%Mod;
    39             printf("%lld
    ",ans%Mod);
    40         }
    41         else 
    42         {
    43             ans=(s[r]-s[p]+Mod)%Mod; 
    44             ans=(ans-x[p]*((w[r]-w[p]+Mod)%Mod)%Mod+Mod)%Mod;
    45             ans=(ans+x[p]*((w[p]-w[l-1]+Mod)%Mod)%Mod)%Mod;
    46             ans=(ans-((s[p]-s[l-1]+Mod)%Mod)%Mod+Mod)%Mod;
    47             printf("%lld
    ",ans%Mod);
    48         }
    49     }
    50 }
  • 相关阅读:
    13-02 Java 数组高级算法,Arrays类
    从0移植uboot (二) _uboot启动流程分析
    Linux input子系统编程、分析与模板
    跟着内核学框架-从misc子系统到3+2+1设备识别驱动框架
    Linux驱动技术(八) _并发控制技术
    Linux驱动技术(七) _内核定时器与延迟工作
    Linux驱动技术(六) _内核中断
    Linux驱动技术(五) _设备阻塞/非阻塞读写
    Linux驱动技术(四) _异步通知技术
    Linux驱动技术(三) _DMA编程
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/7706264.html
Copyright © 2020-2023  润新知