zoukankan      html  css  js  c++  java
  • CF-924C.Riverside Curio(贪心)

    CF传送门

    洛谷传送门


    解题思路

    很显然的结论是,要尽可能多的重复。
    但是也不能每次都重复:
    假设第 i 天 (m_i=4),那么到第i天至少要保证已经有四条线,也就是说前 i-1 天最多重复 i-5 条。
    所以我们用一个单调栈维护一个最长的 (i-m[i]) 上升后缀,这也就求出了每一段区间的重复的条数。
    最后统计答案即可。
    细节还是很多的。

    AC代码

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<queue>
    #include<set>
    #include<map>
    #include<vector>
    #include<iomanip>
    #include<ctime>
    #include<stack>
    using namespace std;
    const int maxn=100005;
    int n,a[maxn],b[maxn],c[maxn],num,res,cnt;
    long long ans;
    stack<int> s;
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++){
        	if(s.empty()){
        		s.push(i);
        		continue;
    		}
    		while((!s.empty())&&(s.top()-a[s.top()]>=i-a[i])) s.pop();
    		s.push(i);
    	}
    	while(!s.empty()){
    		b[++cnt]=s.top();
    		c[cnt]=b[cnt]-a[b[cnt]]-1;
    		s.pop();
    	}
    	res=cnt;
    	for(int i=1;i<=n;i++){
    		if(res>1&&i>b[res]) res--;
    		if(i-num>c[res]) num++;
    		ans=ans+(num-a[i]-1);
    	} 
    	cout<<ans;
        return 0;
    }
    
  • 相关阅读:
    springmvc的文件上传和JWT图形验证码
    POJ 2932 Coneology计算最外层圆个数
    POJ1127 Jack Straws
    求逆序对
    P3809 【模板】后缀排序
    匈牙利算法
    POJ2976 Dropping tests
    字符串哈希
    zkw费用流
    最大流Dinic算法
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/14774972.html
Copyright © 2011-2022 走看看