码迷,mamicode.com
首页 > 其他好文 > 详细

uva11235(Frequent values)(HDU1806)

时间:2014-10-30 20:32:17      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   ar   for   sp   

题目地址:Frequent values

 

题目大意、解题思路:  见白皮书p198.

 

代码:

bubuko.com,布布扣
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <vector>
 6 using namespace std;
 7 const int M=100100;
 8 int a[M];
 9 int val[M],cnt[M];
10 int num[M],left[M],right[M];
11 int d[M][20];
12 int id;
13 void RMQ_init(int A[])
14 {
15     int i,j;
16     for(i=0; i<id; i++)
17         d[i][0]=A[i];
18     for(j=1; (1<<j)<=id; j++)
19         for(i=0; i+(1<<j)-1<id; i++)
20             d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
21 }
22 int RMQ(int L,int R)
23 {
24     int k=0;
25     while((1<<(k+1))<=R-L+1)
26         k++;
27     return max(d[L][k],d[R-(1<<k)+1][k]);
28 }
29 int main()
30 {
31     int n;
32     while(scanf("%d",&n)&&n)
33     {
34         int q;
35         scanf("%d",&q);
36         int i,j;
37         id=0;
38         scanf("%d",&a[1]);
39         val[++id]=a[1];
40         left[id]=1;
41         int xu=1;
42         num[1]=xu;
43         for(i=2; i<=n; i++)
44         {
45             scanf("%d",&a[i]);
46             if (a[i]!=a[i-1])
47             {
48                 val[++id]=a[i];
49                 left[id]=i;
50                 right[id-1]=i-1;
51                 cnt[id-1]=i-left[id-1];
52                 xu++;
53             }
54             num[i]=xu;
55         }
56         right[id]=i-1;
57         cnt[id]=i-left[id];
58         RMQ_init(cnt);
59         int xu1,xu2;
60         int  sum1=0,sum2=0,sum3=0,sum=0;
61         while(q--)
62         {
63             int x,y;
64             scanf("%d%d",&x,&y);
65             xu1=num[x];
66             xu2=num[y];
67             if (xu1!=xu2)
68             {
69                 sum1=right[xu1]-x+1;
70                 sum3=y-left[xu2]+1;
71                 sum=sum1;
72                 if (sum<sum3)
73                     sum=sum3;
74                 if (xu1+1<=xu2-1)
75                 {
76                     sum2=RMQ(xu1+1,xu2-1);
77                     if (sum<sum2)
78                         sum=sum2;
79                 }
80             }
81             else
82             {
83                 sum=y-x+1;
84             }
85             printf("%d\n",sum);
86         }
87     }
88     return 0;
89 }
90 /*
91 10 3
92 -1 -1 1 1 1 1 3 10 10 10
93 2 3
94 1 10
95 5 10
96 0
97 
98 */
View Code

 

uva11235(Frequent values)(HDU1806)

标签:style   blog   http   io   color   os   ar   for   sp   

原文地址:http://www.cnblogs.com/ZhaoPengkinghold/p/4063432.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!