zoukankan      html  css  js  c++  java
  • luoguP4231_三步必杀_差分

    luoguP4231_三步必杀_差分

    题意:N 个柱子排成一排,一开始每个柱子损伤度为0。接下来勇仪会进行M 次攻击,每次攻击可以用4个参数l,r ,s ,e 来描述:

    表示这次攻击作用范围为第l个到第r 个之间所有的柱子(包含l ,r ),对第一个柱子的伤害为s ,对最后一个柱子的伤害为e

    攻击产生的伤害值是一个等差数列。若l=1 ,r=5 ,s=2 ,e=10 ,则对第1~5个柱子分别产生2,4,6,8,10的伤害。

    鬼族们需要的是所有攻击完成之后每个柱子的损伤度。

    分析:等差数列差分后相当于区间加,再套一个差分可解。

    差分套差分求两遍前缀和就是原数组。注意有几个需要差分的单点修改。

    代码:

    // luogu-judger-enable-o2
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define LL long long
    #define N 10000002
    LL c[N];
    LL n,m;
    void read(LL &x){
        int f=1;x=0;char s=getchar();
        while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}x*=f;    
    }
    int main(){
        read(n),read(m);
        LL l,r,s,t;
        register int i;
        for(i=1;i<=m;i++){
            read(l),read(r),read(s),read(t);
            if(l==r){
                c[l]+=s;c[l+1]-=2*s;c[l+2]+=s;continue;    
            }
            LL d=(t-s)/(r-l);
            c[l]+=s;c[l+1]-=(s-d);c[r+1]-=((r-l)*d+s+d);c[r+2]+=((r-l)*d+s);
        }
        for(i=1;i<=n;i++){
            c[i]+=c[i-1];    
        }
        LL mx=0,sum=0;
        for(i=1;i<=n;i++){
            c[i]+=c[i-1];    
            mx=max(mx,c[i]);
            sum^=c[i];
        }
        printf("%lld %lld",sum,mx);
    }
    
  • 相关阅读:
    Docker基础 ubuntu安装docker
    layui.laytpl 模板引擎用法
    golang 中 strings 包的 Replace 用法介绍笔记
    golang之结构体
    Mysql复习秘籍
    NFS 共享存储
    Rsyncd 同步服务
    企业服务器架构
    基础面试题二
    基础面试题一
  • 原文地址:https://www.cnblogs.com/suika/p/8457101.html
Copyright © 2011-2022 走看看