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

bzoj2743 [HEOI2012]采花

时间:2016-04-18 00:51:45      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

  做法是每个询问先算出询问区间中花的种类减去区间中只有一朵花的花的种类,这两个子问题都不算难,具体看代码吧。询问可以离线处理,用树状数组维护,复杂度O(nlogn)。

  不知道是想的复杂了还是打的太low,运行时间有点久。。

  代码

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<vector>
 4 #define pb push_back
 5 #define mp make_pair
 6 #define fi first
 7 #define sc second
 8 #define lb(x) (x&-x)
 9 #define N 1000010
10 #define P 1000000007
11 using namespace std;
12 int n,c[N],C,m,i,a,j,b,ans[N],e[N];
13 int pos[N],next[N];
14 vector<int> vec[N];
15 vector<pair<int,int> > q[N],vec2[N];
16 void cc(int x,int w)
17 {
18     while (x<=n)
19     {
20         c[x]+=w;
21         x+=lb(x);
22     }
23 }
24 int sum(int x)
25 {
26     int ans=0;
27     while (x)
28     {
29         ans+=c[x];
30         x-=lb(x);
31     }
32     return ans;
33 }
34 int main()
35 {
36     scanf("%d%d%d",&n,&C,&m);
37     for (i=1;i<=n;i++)
38     {
39         scanf("%d",&a);
40         e[i]=a;
41         vec[pos[a]].pb(i);
42         next[pos[a]]=i;
43         pos[a]=i;
44     }
45     for (i=1;i<=C;i++)
46     pos[i]=0;
47     for (i=1;i<=n;i++)
48     {
49         vec2[pos[e[i]]].pb(mp(i,next[i]));
50         pos[e[i]]=i;
51     }
52     
53     for (i=1;i<=m;i++)
54     {
55         scanf("%d%d",&a,&b);
56         q[a].pb(mp(b,i));
57     }
58     for (i=0;i<=n;i++)
59     {
60         if (i)
61         for (j=0;j<q[i].size();j++)
62         ans[q[i][j].sc]=sum(q[i][j].fi)-sum(i-1);
63         for (j=0;j<vec[i].size();j++) cc(vec[i][j],1);
64     }
65     for (i=1;i<=n;i++) c[i]=0;
66     for (i=0;i<vec2[0].size();i++) cc(vec2[0][i].fi,-1);
67     
68     for (i=0;i<=n;i++)
69     {
70         if (i)
71         for (j=0;j<q[i].size();j++)
72         ans[q[i][j].sc]-=sum(q[i][j].fi)-sum(i-1);
73         for (j=0;j<vec2[i].size();j++) 
74         {
75             cc(vec2[i][j].fi,2);
76             if (vec2[i][j].sc)
77             cc(vec2[i][j].sc,-1);
78         }
79     }
80     for (i=1;i<=m;i++)
81     printf("%d\n",ans[i]);
82 }

 

bzoj2743 [HEOI2012]采花

标签:

原文地址:http://www.cnblogs.com/fzmh/p/5402851.html

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