首页 > 编程语言 > 详细

Codeforces Round #531 (Div. 3) E. Monotonic Renumeration (构造)

时间:2020-09-05 23:19:19      阅读:46      评论:0      收藏:0      [点我收藏+]

技术分享图片

  • 题意:给出一个长度为\(n\)的序列\(a\),根据\(a\)构造一个序列\(b\),要求:

    ? 1.\(b_{1}=0\)

    ? 2.对于\(i,j(i\le i,j \le n)\),若\(a_{i}=a_{j}\),则\(b_{i}=b_{j}\)

    ? 3.对于\(i\in [1,n-1]\),有\(b_{i+1}=b_{i}\)\(b_{i+1}=b_{i}+1\)

    求有多少可能的\(b\),答案对\(998244353\)取模.

  • 题解:由第二个条件能知道,对于所有\(a_{i}=a_{j}\)相交的区间,区间内的所有元素都必须相等,因为如果这个区间内某个元素\(b_{i+1}=b_{i}+1\),那么对于第二个条件\(b_{i}=b_{j}\)也就不满足了,这样的话,因为第一个区间的值只能为\(0\),假设不相交的区间个数为\(m\),那么答案就是\(2^m-1\).我们反着遍历,记录每个数能达到的最远位置,然后再正着遍历,维护当前区间的右边界,如果达到右边界了,就更新答案.记得忽略掉最后一个区间,而不能全部遍历后再\(/2\),因为要对答案取模,会出现问题.

  • 代码:

    int n;
    int a[N];
    map<int,int> pos;
    int last[N];
     
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        n=read();
        for(int i=1;i<=n;++i){
            a[i]=read();
        }
        for(int i=n;i>=1;--i){
            if(!pos.count(a[i])){
                pos[a[i]]=i;
            }
            last[i]=pos[a[i]];
        }
        ll res=1;
        int mx=0;
        for(int i=1;i<n;++i){
            mx=max(mx,last[i]);
            if(mx==i) res=(2*res)%mod;
        }
     
        printf("%lld\n",res);
     
        return 0;
    }
    

Codeforces Round #531 (Div. 3) E. Monotonic Renumeration (构造)

原文:https://www.cnblogs.com/lr599909928/p/13619139.html

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