P4231 三步必杀

原题链接

题解

本题用形象一点的话来说就是对某个区间内所有的值进行修改,
并且 修改与查询的关系 是 多次修改加最后一次查询
由于 区间内修改的值的斜率一定 所以我们可以这样设
\(k[i]\) 的含义是点 \(i\) 比点 \(i-1\) 多了多少
\(k[i]\) 进行加减操作的含义是 代表点 \(i\) 以后的所有的 \(k\) 都加或减同一个数

\(Code\)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll sum=0;
ll k[10000005]={0};
int main()
{
    ios::sync_with_stdio(false);
    ll n,t;
    cin>>n>>t;
    while(t--)
    {
        ll l,r,s,e;
        cin>>l>>r>>s>>e;
        ll d=(e-s)/(r-l);
        k[l]+=s;
        k[l+1]-=s;
        k[l+1]+=d;
        k[r+1]-=d;
        k[r+1]-=e;
        k[r+2]+=e;
    }

    ll ans1=0,ans2=0;
    for(ll i=1;i<=n;i++)
    {
        k[i]+=k[i-1];
        sum+=k[i];
        ans1^=sum;
        ans2=max(ans2,sum);
    }

    cout<<ans1<<" "<<ans2;
    return 0;
}

posted @ 2024-02-09 18:36  纯粹的  阅读(33)  评论(2)    收藏  举报