码迷,mamicode.com
首页 > 编程语言 > 详细

莫对算法/二分查找 FZU 2072 Count

时间:2015-07-16 09:36:31      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

 

题目传送门

 1 /*
 2     题意:问区间内x的出现的次数
 3     莫队算法:用一个cnt记录x的次数就可以了
 4     还有二分查找的方法
 5 */
 6 #include <cstdio>
 7 #include <algorithm>
 8 #include <cmath>
 9 #include <cstring>
10 using namespace std;
11 
12 const int MAXN = 1e5 + 10;
13 const int INF = 0x3f3f3f3f;
14 struct Data
15 {
16     int b, l, r, x;
17     int id;
18 }data[MAXN];
19 int a[MAXN];
20 int cnt[MAXN];
21 int ans[MAXN];
22 int n, q;
23 
24 bool cmp(Data x, Data y)
25 {
26     if (x.b == y.b)    return x.r < y.r;
27     return x.b < y.b;
28 }
29 
30 void Modui(void)
31 {
32     memset (cnt, 0, sizeof (cnt));
33 
34     int l = 1, r = 0;
35     for (int i=1; i<=q; ++i)
36     {
37         while (data[i].l < l)    cnt[a[--l]]++;
38         while (data[i].l > l)    cnt[a[l]]--, l++;
39         while (data[i].r > r)    cnt[a[++r]]++;
40         while (data[i].r < r)    cnt[a[r]]--, r--;
41 
42         ans[data[i].id] = cnt[data[i].x];
43     }
44 
45     for (int i=1; i<=q; ++i)
46     {
47         printf ("%d\n", ans[i]);
48     }
49 }
50 
51 int main(void)        //FZU 2072 Count
52 {
53 //    freopen ("A.in", "r", stdin);
54 
55     while (scanf ("%d%d", &n, &q) == 2)
56     {
57         int block = (int) sqrt (n * 1.0);
58         for (int i=1; i<=n; ++i)    scanf ("%d", &a[i]);
59         for     (int i=1; i<=q; ++i)
60         {
61             scanf ("%d%d%d", &data[i].l, &data[i].r, &data[i].x);
62             data[i].b = data[i].l / block;    data[i].id = i;
63         }
64 
65         sort (data+1, data+1+q, cmp);
66 
67         Modui ();
68     }
69 
70     return 0;
71 }
技术分享
 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <vector>
 6 using namespace std;
 7 
 8 const int MAXN = 1e5 + 10;
 9 const int INF = 0x3f3f3f3f;
10 int a[MAXN];
11 int n, q;
12 vector<int> cnt[MAXN];
13 
14 int cal(int x, int r)
15 {
16     if (!cnt[x].size ())    return 0;
17     int pos = upper_bound (cnt[x].begin (), cnt[x].end (), r) - cnt[x].begin () - 1;
18     return pos;
19 }
20 
21 int main(void)        //FZU 2072 Count
22 {
23 //    freopen ("A.in", "r", stdin);
24 
25     while (scanf ("%d%d", &n, &q) == 2)
26     {
27         for (int i=1; i<=n; ++i)
28         {
29             scanf ("%d", &a[i]);
30         }
31         for (int i=1; i<=n; ++i)    cnt[a[i]].clear ();
32         for (int i=1; i<=n; ++i)    cnt[a[i]].push_back (i);
33 
34         for (int i=1; i<=q; ++i)
35         {
36             int l, r, x;    scanf ("%d%d%d", &l, &r, &x);
37             printf ("%d\n", cal (x, r) - cal (x, l - 1));
38         }
39     }
40 
41     return 0;
42 }
二分查找

 

莫对算法/二分查找 FZU 2072 Count

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4650189.html

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