码迷,mamicode.com
首页 > 其他好文 > 详细

三步必杀

时间:2019-10-04 13:34:07      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:freopen   using   get   std   分数   style   i++   temp   include   

Solution

Step 1

考试的时候SB想到了异或……

首先复杂度肯定是线性,否则无法满足。

Step 2

区间操作,考虑转为差分,变成单点操作。

那么如果 s=e ,就是普通的差分

如果不是,也就是差分数组每次加上同一个数,考虑维护差分数组的差分数组。

每次加上公差,最后统计。

修改 O(1) ,统计 O(N) ,可以承受

Step 3

#include<bits/stdc++.h>
using namespace std;
long long sum[10000005],d[10000005];
template <typename T>void read(T &x){
    int f=1;x=0;char c=getchar();
    for(;!isdigit(c);c=getchar())if(c==-)f=!f;
    for(; isdigit(c);c=getchar()) x=x*10+c-0;
    x*=f;
}
int n,m,l,r;
long long s,e,a[10000005];
int main(){
//  freopen("sequence.in","r",stdin);
//  freopen("sequence.out","w",stdout);
    read(n);read(m);
    while(m--){
        read(l);read(r);read(s);read(e);
        long long gc=(e-s)/(r-l);
        d[l+1]+=gc;d[r+1]-=gc;//差分数组的差分数组,从第二项到末项加上公差
        sum[l]+=s;sum[r+1]-=e;//差分数组本身两端进行修改
    }
    for(int i=1;i<=n;i++)
     sum[i]+=(d[i]+=d[i-1]);//统计差分数组
    long long ans=0,tmp=0,mx=0;
    for(int i=1;i<=n;i++)ans^=(tmp+=sum[i]),mx=max(mx,tmp);//统计原数组
    printf("%lld %lld",ans,mx);
    return 0;
}

 

三步必杀

标签:freopen   using   get   std   分数   style   i++   temp   include   

原文地址:https://www.cnblogs.com/coder-cjh/p/11621759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!