专栏文章
[CF2163C] Monopati 题解
CF2163C题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min0on4i
- 此快照首次捕获于
- 2025/12/01 18:39 3 个月前
- 此快照最后确认于
- 2025/12/01 18:39 3 个月前
一条 的路径形如先在第一行走一个前缀,然后往下走一格,然后在第二行走一个后缀。
枚举往下走一格的位置 ,则可以通过预处理前后缀最大最小值得到一个限制 ,表示能够走出 时 需要满足 ,即 需要包含 。
于是得到 对这样的区间 ,现在需要统计有多少个区间 至少包含其中一个 。
枚举 ,维护当前满足 的 中, 的最小值 ,则 合法,当且仅当 ,于是这个 的贡献即为 。
把 挂在 上,从大到小枚举 ,每次把 上面挂的点算入 中,可以做到 。
code
CPP#include<bits/stdc++.h>
#define pb emplace_back
#define pob pop_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
const ll maxn=1000007,ee=1e18,p=998244353;
ll n,a[2][maxn],mx[2][maxn],mn[2][maxn],val[maxn],ans;
int main(void){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
ll T=1; cin>>T;
for(;T--;){
cin>>n,ans=0;
for(ll i=1;i<=n;i++) cin>>a[0][i];
for(ll i=1;i<=n;i++) cin>>a[1][i];
mx[0][0]=-ee,mn[0][0]=ee;
for(ll i=1;i<=n;i++){
mx[0][i]=max(mx[0][i-1],a[0][i]);
mn[0][i]=min(mn[0][i-1],a[0][i]);
}
mx[1][n+1]=-ee,mn[1][n+1]=ee;
for(ll i=n;i>=1;i--){
mx[1][i]=max(mx[1][i+1],a[1][i]);
mn[1][i]=min(mn[1][i+1],a[1][i]);
}
for(ll i=1;i<=2*n;i++) val[i]=2*n+1;
for(ll i=1,L,R;i<=n;i++){
L=min(mn[0][i],mn[1][i]);
R=max(mx[0][i],mx[1][i]);
val[L]=min(val[L],R);
}
for(ll i=2*n,cur=2*n+1;i>=1;i--){
cur=min(cur,val[i]);
ans+=2*n-cur+1;
}
cout<<ans<<"\n";
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...