• 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 }
  • 相关阅读:
    关于JSON可能出现的错误,待更/todo
    mongoose的安装与使用(书签记录) 2017
    HTTP的学习记录3--HTTPS和HTTP
    HTTP的学习记录(二)头部
    HTTP(一)概述
    LeetCode 455. Assign Cookies
    LeetCode 453. Minimum Moves to Equal Array Elements
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 447. Number of Boomerangs
    LeetCode 416. Partition Equal Subset Sum
  • 原文地址:https://www.cnblogs.com/fzmh/p/5402851.html
Copyright © 2020-2023  润新知