zoukankan      html  css  js  c++  java
  • BZOJ 3781: 小B的询问

    3781: 小B的询问

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 643  Solved: 435
    [Submit][Status][Discuss]

    Description

    小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。

    Input

    第一行,三个整数N、M、K。
    第二行,N个整数,表示小B的序列。
    接下来的M行,每行两个整数L、R。

    Output

    M行,每行一个整数,其中第i行的整数表示第i个询问的答案。
     
     

    Sample Input

    6 4 3
    1 3 2 1 1 3
    1 4
    2 6
    3 5
    5 6

    Sample Output

    6
    9
    5
    2

    HINT

    对于全部的数据,1<=N、M、K<=50000


    Source

     
    [Submit][Status][Discuss]

    莫队算法模板题

     1 #include <bits/stdc++.h>
     2 
     3 #define int long long
     4 
     5 typedef long long longint;
     6 
     7 const int siz = 50000 + 5;
     8 
     9 int n, m, k;
    10 int l, r, s;
    11 int num[siz];
    12 int cnt[siz];
    13 
    14 longint sum = 0;
    15 
    16 struct query {
    17     int l, r, id;
    18     longint  ans;    
    19 }qry[siz];
    20 
    21 inline bool cmp_lr(const query &a, const query &b) {
    22     if (a.l / s != b.l / s)
    23         return a.l < b.l;
    24     else
    25         return a.r < b.r;
    26 }
    27 
    28 inline bool cmp_id(const query &a, const query &b) {
    29     return a.id < b.id;
    30 }
    31 
    32 inline longint sqr(int t) {
    33     return t*t;
    34 }
    35 
    36 inline void remove(int t) {
    37 //    printf("r %d
    ", t);
    38     sum -= sqr(cnt[t]);
    39     sum += sqr(--cnt[t]);
    40 }
    41 
    42 inline void insert(int t) {
    43 //    printf("i %d
    ", t);
    44     sum -= sqr(cnt[t]);
    45     sum += sqr(++cnt[t]);
    46 }
    47 
    48 inline void solve(query &q) {
    49 //    printf("s %d %d
    ", q.l, q.r);
    50     while (l < q.l)remove(num[l++]);
    51     while (l > q.l)insert(num[--l]);
    52     while (r < q.r)insert(num[++r]);
    53     while (r > q.r)remove(num[r--]);
    54     q.ans = sum;
    55 }
    56 
    57 signed main(void) {
    58     scanf("%lld%lld%lld", &n, &m, &k); 
    59     for (int i = 1; i <= n; ++i)
    60         scanf("%lld", num + i);
    61     for (int i = 1; i <= m; ++i) {
    62         qry[i].id = i;
    63         scanf("%lld%lld", 
    64             &qry[i].l,
    65             &qry[i].r);
    66     }
    67     s = sqrt(n); l = 1, r = 0;
    68     std::sort(qry + 1, qry + 1 + m, cmp_lr);
    69     for (int i = 1; i <= m; ++i)solve(qry[i]);
    70     std::sort(qry + 1, qry + 1 + m, cmp_id);
    71     for (int i = 1; i <= m; ++i)
    72         printf("%lld
    ", qry[i].ans);
    73 }

    @Author: YouSiki

  • 相关阅读:
    Git小结---So far.......
    Git命令之:git push
    Git详解之:Git分支
    使用Dom4j解析XML
    crm客户资源显示控制
    crm---本项目的权限控制模式
    在mybatis中,在列表分页查询过程中造成集合属性数据丢失的问题
    在easyui中解决使west和center为1:1,并且拖动窗口时能够自适应变化
    在springmvc中使用requestContextListener获取全部的request对象
    HTML 元素标签语义化及使用场景
  • 原文地址:https://www.cnblogs.com/yousiki/p/6163918.html
Copyright © 2011-2022 走看看