首页 > 其他 > 详细

【思维】单调栈+dp——2020 联想杯 G

时间:2020-05-30 22:53:41      阅读:65      评论:0      收藏:0      [点我收藏+]
/*
用一个递增单调栈维护b[1..i-1]
将bi更新进单调栈,栈顶第二个元素+1 到bi区间的最小值都改成bi,然后求个和就行 
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define mod 998244353
#define N 10000007

ll n,p,x,y,z,b[N],ans[N],sum[N];
ll getnxt(int i){
    return (x*ans[i]%p+b[i]*y%p+z)%p;
}

int main(){
    cin>>n>>p>>x>>y>>z>>b[1];
    ans[1]=b[1];sum[1]=b[1];
    
    stack<int>stk; 
    stk.push(1);
    for(int i=2;i<=n;i++){
        b[i]=getnxt(i-1);
        while(stk.size()>0 && b[stk.top()]>=b[i])
            stk.pop();
        int L;
        if(stk.size())L=stk.top();
        else L=0;
        stk.push(i);
        sum[i]=(sum[L]+b[i]*(i-L)%mod)%mod;
        ans[i]=(ans[i-1]+sum[i])%mod;
    }
    ll anss=0;
    for(int i=1;i<=n;i++)anss^=ans[i];
    cout<<anss<<\n;
}

 

【思维】单调栈+dp——2020 联想杯 G

原文:https://www.cnblogs.com/zsben991126/p/12995118.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!