• Subsequence(hdu3530)


    Subsequence

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 6141    Accepted Submission(s): 2041


    Problem Description
    There is a sequence of integers. Your task is to find the longest subsequence that satisfies the following condition: the difference between the maximum element and the minimum element of the subsequence is no smaller than m and no larger than k.
     
    Input
    There are multiple test cases.
    For each test case, the first line has three integers, n, m and k. n is the length of the sequence and is in the range [1, 100000]. m and k are in the range [0, 1000000]. The second line has n integers, which are all in the range [0, 1000000].
    Proceed to the end of file.
     
    Output
    For each test case, print the length of the subsequence on a single line.
     
    Sample Input
    5 0 0
    1 1 1 1 1
    5 0 3
    1 2 3 4 5
     
    Sample Output
    5
    4
    思路:优先队列+尺取;
    我们不用去管这个子串中的最大最小的距离是否大于等于m,我们只要保证这个值小于等于k时继续向右端扩展,应为向右端扩展尺取时,当前值是越来越大的。比如当[l,r]满足dis>=m,那么[l,r+s],的dis>=m;所以我们不需要管m。然后就是尺取中,更新最大最小值的问题,这个用优先队列维护下。复杂度N*log(N);
      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<iostream>
      4 #include<string.h>
      5 #include<stdlib.h>
      6 #include<queue>
      7 #include<stack>
      8 using namespace std;
      9 typedef long long LL;
     10 int ask[100005];
     11 int cnt[100005];
     12 struct node1
     13 {
     14     int x;
     15     int id;
     16     bool operator<(const node1 &cx)const
     17     {
     18         if(cx.x == x)
     19             return cx.id<id;
     20         else return cx.x>x;
     21     }
     22 };
     23 struct node2
     24 {
     25     int x;
     26     int id;
     27     bool operator<(const node2 &cx)const
     28     {
     29         if(cx.x == x)
     30             return cx.id<id;
     31         else return cx.x<x;
     32     }
     33 };
     34 priority_queue<node1>que1;
     35 priority_queue<node2>que2;
     36 int main(void)
     37 {
     38     int n,m,k;
     39     while(scanf("%d %d %d",&n,&m,&k)!=EOF)
     40     {
     41         while(!que1.empty())que1.pop();
     42         while(!que2.empty())que2.pop();
     43         int i,j;
     44         for(i = 0; i < n; i++)
     45         {
     46             scanf("%d",&ask[i]);
     47         }
     48         int l = 0;
     49         int r = 0;
     50         int cc = 0;
     51         int ma = ask[0];
     52         int mi = ask[0];
     53         int x = abs(ma-mi);
     54         if(x <= k&&x >= m)cc = 1;
     55         node1 ak;
     56         node2 ap;
     57         ak.x =ask[0];
     58         ak.id = 0;
     59         ap.x = ask[0];
     60         ap.id = 0;
     61         que1.push(ak);
     62         que2.push(ap);
     63         while(l<=r&&r<n)
     64         {
     65             while(x <= k &&r < n-1)
     66             {
     67                 r++;
     68                 int c = abs(ask[r]-ma);
     69                 c = max(abs(ask[r]-mi),c);
     70                 if(c > k)
     71                 {   //printf("%d %d
    ",l,r);
     72                     r--;
     73                     break;
     74                 }
     75                 node1 ac;
     76                 ac.x = ask[r];
     77                 ac.id = r;
     78                 node2 bc;
     79                 bc.x= ask[r];
     80                 bc.id = r;
     81                 que1.push(ac);
     82                 que2.push(bc);
     83                 if(ask[r] > ma)
     84                 {
     85                     ma = ask[r];
     86                 }
     87                 else if(ask[r] < mi)
     88                 {
     89                     mi = ask[r];
     90                 }
     91                 x = abs(ma-mi);//printf("%d
    ",x);
     92             }
     93             if(x >= m)
     94             {
     95                 cc = max(cc,r-l+1);
     96             }
     97             if(ask[l] == ma)
     98             {
     99                 while(!que1.empty())
    100                 {
    101                     node1 acc = que1.top();
    102                     if(acc.id <= l)
    103                     {
    104                         que1.pop();
    105                     }
    106                     else
    107                     {
    108                         ma = acc.x;
    109                         break;
    110                     }
    111                 }
    112             }
    113             if(ask[l]==mi)
    114             {
    115                 while(!que2.empty())
    116                 {
    117                     node2 acc = que2.top();
    118                     if(acc.id <= l)
    119                     {
    120                         que2.pop();
    121                     }
    122                     else
    123                     {
    124                         mi = acc.x;
    125                         break;
    126                     }
    127                 }
    128             }
    129             l++;
    130             if(l == r+1)
    131             {   //printf("%d
    ",r);
    132                 r++;
    133                 node1 akk;
    134                 node2 app;
    135                 akk.x =ask[r];
    136                 akk.id = r;
    137                 app.x = ask[r];
    138                 app.id = r;
    139                 que1.push(akk);
    140                 que2.push(app);
    141                 mi = ask[r];
    142                 ma = ask[r];
    143             }
    144         }
    145         printf("%d
    ",cc);
    146     }
    147     return 0;
    148 }
     
    油!油!you@
  • 相关阅读:
    jQuery知识点小结
    Java并发(二):基础概念
    Java并发(一):基础概念
    Spring AOP初步总结(二)
    pycharm建立软连接
    python中安装pycurl(想要使用Tornado提供的客户端做爬虫 客户端里需要先安装pycurl)
    python2&python3 蛋疼的编码问题
    02-Elasticsearch的核心概念
    python-列表或元组去重
    python-enumerate函数
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5935262.html
Copyright © 2020-2023  润新知