zoukankan      html  css  js  c++  java
  • HDU

    http://acm.hdu.edu.cn/showproblem.php?pid=5806

    题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数。

    题解:题目要求很奇怪,很多头绪但写不出,选择跳过的题,简称想法题。

    首先考虑区间的更新方法:区间左端l不动,右端r滑动,

    滑到有k个数>=m时,此区间符合条件,并且发现右端点再往右滑到底,此条件一直符合(因为若加入的数小于“第K大的数”,则毫无影响。若不然,加入该数会产生一个新的第k大数,保证>=“第K大的数”>=m)

    所以一找到这个数,ans直接加上n-r+1+1;(要+2,因为r又被更新+1了一下,)

    然后更新一次左区间,如果离开区间的数<n,则毫无影响,该区间继续符合条件。若不然,则重新更新右区间,直到再次找到一个>=k的数。

    这样就是基本线性了。   如果r滑倒头后还找不到,那么gg,跳出循环。

    ac代码:

    #define    _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    const int maxn = 2e5 + 5;
    const int mod= 1e9 + 5;
    int a[maxn], x[maxn];
    int main(){
        int n, m, k;
        int t;
        cin >> t;
        while (t--) {
            cin >> n >> m >> k;
            
            for (int i = 1; i <= n; i++) {
                scanf("%d", &a[i]);
            }
            long long ans = 0;
            int l = 1, r = 1, cnt = 0;
            while (1) {
                while(r <= n&&cnt < k) {
                    if (a[r] >= m)cnt++;
                    r++;
                }
                if (cnt < k) break;
                ans += n - r + 2;
                if (a[l] >= m) cnt--;
                l++;
            }
            cout << ans << endl;
        }
    
    
    }
    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    烯烃(olefin) 题解
    二分图的考验 题解
    树上的好题
    [SDOI2013]直径 题解
    [ZJOI2010]数字计数 题解
    神在夏至祭降下了神谕 题解
    洛谷 P4198 楼房重建 题解
    [HAOI2010]软件安装 题解
    [POI2011]ROT-Tree Rotations 题解
    可并堆之左偏树浅谈
  • 原文地址:https://www.cnblogs.com/SuuT/p/8541936.html
Copyright © 2011-2022 走看看