D. Array Collapse

原题链接

请点击这里

这篇题解有一个小前提,那就是我们可以把变成多少种数组看成删掉哪些数

code

#include<bits/stdc++.h>
using namespace std;

#define ll long long

const ll mod = 998244353;
ll a[300005] = {0};
ll n;
ll st[300005][30];
ll id[300005][30];

inline void read(ll &x) {
	x = 0;
	ll flag = 1;
	char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-')flag = -1;
        c = getchar();
    }
	while(c >= '0' && c <= '9') {
		x = (x << 3) + (x << 1) + (c ^ 48);
		c = getchar();
	}
	x *= flag;
}

inline void write(ll x)
{
    if(x < 0){
    	putchar('-');
		x = -x;
	}
    if(x > 9)
		write(x / 10);
    putchar(x % 10 + '0');
}

void init()
{
    for(ll k = 1; (1 << k) <= n; k++)
    {
        for(ll i = 1; i + (1 << k) - 1 <= n; i++)
        {
            if(st[i][k-1] < st[i + (1 << (k-1))][k-1])
            {
                st[i][k] = st[i][k-1];
                id[i][k] = id[i][k-1];
            }
            else
            {
                st[i][k] = st[i + (1 << (k-1))][k-1];
                id[i][k] = id[i + (1 << (k-1))][k-1];
            }
        }
    }
}

ll get(ll l, ll r)
{
    ll ans = l;
    for(ll k = 20; k >= 0; k--)
    {
        if(l + (1 << k) - 1 <= r)
        {
            if(a[ans] > a[id[l][k]])
            {
                ans = id[l][k];
            }
            l += (1 << k);
        }
    }

    return ans;
}

ll solve(ll l, ll r, ll minl, ll minr)
{
    if(l > r) return 1;
    if(l == r)
    {
        if(minl || minr) return 2;
        return 1;
    }

    ll p = get(l, r);

    ll left = solve(l, p - 1, minl, 1);
    ll right = solve(p + 1, r, 1, minr);

    ll ans = (1LL * left * right) % mod;

    if(minl) ans = (ans + right) % mod;
    if(minr) ans = (ans + left) % mod;
    if(minl && minr) ans = (ans - 1 + mod) % mod;

    return ans;
}

int main()
{
    ll t;
    read(t);

    while(t--)
    {
        read(n);

        for(ll i = 1; i <= n; i++)
        {
            read(a[i]);
            st[i][0] = a[i];
            id[i][0] = i;
        }

        init();

        write(solve(1, n, 0, 0));
        putchar('\n');
    }
    return 0;
}

posted @   纯粹的  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示