zoukankan      html  css  js  c++  java
  • bzoj2743 [HEOI2012]采花

      做法是每个询问先算出询问区间中花的种类减去区间中只有一朵花的花的种类,这两个子问题都不算难,具体看代码吧。询问可以离线处理,用树状数组维护,复杂度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
    ",ans[i]);
    82 }
  • 相关阅读:
    锻炼意志力
    iOS 函数积累
    iOS8新特性 计算 cell 的高度
    iOS 国际化支持 设置
    CALayer 方法属性整理
    好的 blog 整理
    xcode7 打包上传至 app store
    ios 适配 (字体 以及 控件)
    iOS 适配设计与切图
    iOS app 切图
  • 原文地址:https://www.cnblogs.com/fzmh/p/5402851.html
Copyright © 2011-2022 走看看