1 条题解

  • 0
    @ 2021-10-26 12:16:56

    题意

    已知一条链,每个节点 ii 与节点 i+1i+1 之间有一条边。

    每个点有一个点权 aia_i,(1ain)(1\le a_i\le n)

    定义 f(l,r)f(l,r) 表示只保留点权为 [l,r][l,r] 的点,其余点全部删去,所得到的图的联通块个数。

    l=1nr=lnf(l,r)\sum_{l=1}^{n} \sum_{r=l}^{n} f(l,r)

    题解

    考虑分解总和,进行分开求解。

    对于一组 l,rl,r ,如果有一个 ii 满足 ai[l,r]a_i\in [l,r]ai1[l,r]a_{i-1}\notin [l,r],那么联通块个数加一。

    所以枚举每个 ii 统计答案即可,时间复杂度 O(n)O(n)

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+5;
    int n,a[N];
    long long ans;
    int main(){
    	std::ios::sync_with_stdio(false);
    	cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=1;i<=n;i++){
    		if(a[i]>a[i-1])ans+=1ll*(a[i]-a[i-1])*(n-a[i]+1);
    		else ans+=1ll*a[i]*(a[i-1]-a[i]);
    	}
    	cout<<ans;
    }
    
    • 1

    信息

    ID
    2051
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    6
    已通过
    2
    上传者