Problem - 1151E - Codeforces
题意:
思路:
我们要统计区间数量,有两个思考方向
一个是枚举右端点r,然后计算左端点l的贡献
还有一个就是,更换枚举对象
这道题是后者
因为答案是连通块数量
连通块数量=点数-边数
对于点和边我们去单独计算贡献
对于每个点,它包含在区间的条件是ai在[l,r]范围内,因此贡献为ai*(N-ai+1)
对于每条边,它包含在区间的条件是ai和ai-1都在[l,r]范围内,贡献为min(a[i],a[i-1])*(N-max(a[i],a[i-1])+1)
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=1e5+10;
const int mxe=1e5+10;
const int mxv=1e5+10;
const int mod=1e9+7;
const int Inf=1e18;
int N;
int a[mxn];
void solve(){
cin>>N;
int ans1=0,ans2=0;
for(int i=1;i<=N;i++){
cin>>a[i];
ans1+=a[i]*(N-a[i]+1);
}
for(int i=2;i<=N;i++){
ans2+=min(a[i],a[i-1])*(N-max(a[i],a[i-1])+1);
}
cout<<ans1-ans2<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}