zoukankan      html  css  js  c++  java
  • CF1366E Two Arrays(思维+数学)

    对于这道题,可以想想对于每个b[i],a[i]中可选的位置的区间在哪,这样只要找到区间,就能知道当前可以选那几个位置断开

    b[1]的开头肯定是1号位,而我们发现如果对后缀求一下后缀的最小值,这样就天然满足题目条件,我们用一个map存一下答案,就能知道b[i]是最小值的区间是哪些

    因为b是单调递增的数学因此可以从头枚举b[i]所在位置,用乘法原理进行计算。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=2e5+10;
    const int mod=998244353;
    int a[N];
    int b[N];
    int suffix[N];
    map<int,int> cnt;
    int main(){
        ios::sync_with_stdio(false);
        int n,m;
        cin>>n>>m;
        int i;
        for(i=1;i<=n;i++)
            cin>>a[i];
        for(i=1;i<=m;i++)
            cin>>b[i];
        suffix[n+1]=0x3f3f3f3f;
        for(i=n;i>=1;i--){
            suffix[i]=min(suffix[i+1],a[i]);
            cnt[suffix[i]]++;
        }
        ll ans=1;
        if(suffix[1]!=b[1]){
            cout<<0<<endl;
        }
        else{
            for(i=2;i<=m;i++){
                ans=ans*cnt[b[i]]%mod;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    scrapy 随机UserAgent
    Scrapy使用中间件捕获Spider抛出的异常
    10.16-arrarylist
    10.15_package_2
    10.14_package_1
    10.13_enum_2
    10.12-enum_1
    10.11-java的接口2
    10.10-3对象和类_动手动脑-java的接口
    10.9-java的封装
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13358133.html
Copyright © 2011-2022 走看看