zoukankan      html  css  js  c++  java
  • 分块大法吼2

    莫对大法,O(nsqrt(n))解决无修改的区间询问问题;

    czy的后宫3

    【题目描述】

    上次czy在机房妥善安排了他的后宫之后,他发现可以将他的妹子分为c种,他经常会考虑这样一个问题:在[l,r]的妹子中间,能挑选出多少不同类型的妹子呢?

    注意:由于czy非常丧尸,所以他要求在所挑选的妹子类型在[l,r]中出现次数为正偶数,你懂得。

    问题简述:n个数,m次询问,每次问[l,r]区间有多少个数恰好出现正偶数次

    【输入格式】

    第一行3个整数,表示n,c,m

    第二行n个数,每个数Ai在[1,c]之间,表示一个Ai类型的妹子

    接下来m行,每行两个整数l,r,表示询问[l,r]这个区间的答案

    【输出格式】

    有m行,表示第i次询问的答案

      

    【样例输入】

    5 5 3

    1 1 2 2 3

    1 5

    3 4

    2 3

    【样例输出】

    2

    1

    0

    【数据范围】

    共有10组测试数据

    1-4组n,m=500,2000,5000,10000,c=1000

    5-7组n,m=20000,30000,40000,c=10000

    8-10组n,m=50000,80000,100000,c=100000

    数据保证随机生成

     这个模板差不多吧:

      1 #include<stdio.h>

     2 #include<algorithm>
     3 #include<string.h>
     4 #include<math.h>
     5 #include<string>
     6 #include<iostream>
     7 using namespace std;
     8 typedef long long ll;
     9 
    10 #define N 1000002
    11 int n,m,c,block;
    12 int a[N],pos[N];
    13 int tmp[N];
    14 struct data
    15 {
    16     int l,r,ans,id;
    17 }q[N];
    18 int cmp(data a,data b)
    19 {
    20     if (pos[a.l]==pos[b.l]) return a.r<b.r;
    21     return pos[a.l]<pos[b.l];
    22 }
    23 int cmpid(data a,data b)
    24 {
    25     return a.id<b.id;
    26 }
    27 void solve()
    28 {
    29     int l=0,r=0;
    30     int ans=0;
    31     for (int i=1;i<=m;i++)
    32     {
    33         while (r<q[i].r)
    34         {
    35             r++;
    36             tmp[a[r]]++;
    37             if (tmp[a[r]]%2==0) ans++;
    38             if (tmp[a[r]]%2==1&&tmp[a[r]]!=1) ans--;
    39         }
    40 
    41         while (l>q[i].l)
    42         {
    43             l--;
    44             tmp[a[l]]++;
    45             if (tmp[a[l]]%2==0) ans++;
    46             if (tmp[a[l]]%2==1&&tmp[a[l]]!=1) ans--;
    47         }
    48 
    49         while (l<q[i].l)
    50         {
    51 
    52             tmp[a[l]]--;
    53             if (tmp[a[l]]%2==1) ans--;
    54             if (tmp[a[l]]%2==0&&tmp[a[l]]!=0) ans++;
    55             l++;
    56         }
    57 
    58         while (r>q[i].r)
    59         {
    60             tmp[a[r]]--;
    61             if (tmp[a[r]]%2==2) ans--;
    62             if (tmp[a[r]]%2==0&&tmp[a[r]]!=0) ans++;
    63             r--;
    64         }
    65         q[i].ans=ans;
    66     }
    67 }
    68 
    69 int main()
    70 {
    71    scanf("%d%d%d",&n,&c,&m);
    72    block=sqrt(n);
    73    for (int i=1;i<=n;i++) pos[i]=(i-1)/block+1;
    74    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    75    for (int i=1;i<=m;i++)
    76    scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
    77 
    78    sort(q+1,q+m+1,cmp);
    79    solve();
    80    sort(q+1,q+m+1,cmpid);
    81    for (int i=1;i<=m;i++)
    82    printf("%d ",q[i].ans);
    83    return 0;
    84 }
  • 相关阅读:
    想算法无头绪,咋办?
    使用R语言分析股价波动
    cmd控制台 wrapper | OpenSCManager failed
    Ubuntu使用vi命令时,不能正常编辑文件,使用方向键时老是出现很多字母解决方案
    Ubuntu su命令 Authentication failure的解决办法
    Springboot2.x整合RabbitMQ
    RabbitMQ 笔记
    Ubuntu安装RabbitMQ
    使用xshell连接ubuntu
    Java 泛型
  • 原文地址:https://www.cnblogs.com/forgot93/p/4782662.html
Copyright © 2011-2022 走看看