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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~