zoukankan      html  css  js  c++  java
  • BZOJ3809 Gty的二逼妹子序列

    终于做到了BZ上最新的题2333

    这题一看就是。。。莫队,然后查询的时候树状数组。

    结果T了,诶诶诶诶%>_<%,怎么可以这样!

    另寻他法:hzwer的分块

    恩恩,就是把颜色分成n块,然后单次修改O(1),单次查询O(n / sz + 2 * sz)

    sz = sqrt(n / 2)的时候最好(理论上),实际上sz = sqrt(n)一点都不慢。。。。要不要下次试试sz = log(n)

     1 /**************************************************************
     2     Problem: 3809
     3     User: rausen
     4     Language: C++
     5     Result: Accepted
     6     Time:26248 ms
     7     Memory:25428 kb
     8 ****************************************************************/
     9  
    10 #include <cstdio>
    11 #include <cmath>
    12 #include <algorithm>
    13  
    14 using namespace std;
    15 const int N = 100005;
    16 const int M = 1000005;
    17 const int sqrt_N = 500;
    18  
    19 int n, Q, sz;
    20 int a[N];
    21 int B[sqrt_N], w[N], cnt[N];
    22 int ans[M];
    23  
    24 struct data {
    25     int l, r, a, b, W;
    26      
    27     inline bool operator < (const data &x) const {
    28         return w[l] == w[x.l] ? r < x.r : w[l] < w[x.l];
    29     }
    30 } q[M];
    31  
    32 inline int read() {
    33     int x = 0;
    34     char ch = getchar();
    35     while (ch < '0' || '9' < ch)
    36         ch = getchar();
    37     while ('0' <= ch && ch <= '9') {
    38         x = x * 10 + ch - '0';
    39         ch = getchar();
    40     }
    41     return x;
    42 }
    43  
    44 int query(int x, int y) {
    45     int res = 0, i;
    46     if (w[x] == w[y]) {
    47         for (i = x; i <= y; ++i)
    48             if (cnt[i]) ++res;
    49     } else {
    50         for (i = w[x] + 1; i < w[y]; ++i)
    51             res += B[i];
    52         for (i = w[x] * sz; i >= x; --i)
    53             if (cnt[i]) ++res;
    54         for (i = (w[y] - 1) * sz + 1; i <= y; ++i)
    55             if (cnt[i]) ++res;
    56     }
    57     return res;
    58 }
    59  
    60 inline void add(int c, int del) {
    61     if (!cnt[c]) ++B[w[c]];
    62     cnt[c] += del;
    63     if (!cnt[c]) --B[w[c]];
    64 }
    65  
    66 int main() {
    67     int i, l, r;
    68     n = read(), Q = read(), sz = (int) sqrt(n / 2);
    69     for (i = 1; i <= n; ++i)
    70         a[i] = read(), w[i] = (int) (i - 1) / sz + 1;
    71     for (i = 1; i <= Q; ++i) {
    72         q[i].l = read(), q[i].r = read(), q[i].a = read(), q[i].b = read();
    73         q[i].W = i;
    74     }
    75     sort(q + 1, q + Q + 1);
    76      
    77     for (i = l = 1, r = 0; i <= Q; ++i) {
    78         for (; l < q[i].l; ) add(a[l++], -1);
    79         for (; l > q[i].l; ) add(a[--l], 1);
    80         for (; r < q[i].r; ) add(a[++r], 1);
    81         for (; r > q[i].r; ) add(a[r--], -1);
    82         ans[q[i].W] = query(q[i].a, q[i].b);
    83     }
    84     for (i = 1; i <= Q; ++i)
    85         printf("%d
    ", ans[i]);
    86     return 0;
    87 }
    View Code

    (p.s.  rank 2还不错恩,Orz rank 1写的应该不是莫队吧。。。)

    update@2014/12/21 23:13

    哇,rank 1神犇wangyisong1996主动来找蒟蒻玩耍~好开心啊

    神犇说他用了卡!常!数!的莫队,时间竟然只有一半,简直给跪了>_<

    另:sz = log(n)是不行了,T惨了

    为何写了输出优化反倒更慢了= =不科学

    update@2014/12/22 21:51

     结果瞬间变成rank 6了啊啊啊啊啊!你们这群大神!

    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    Python 爬虫
    Web 前端编程运维必备
    Docker 运维高级应用管理
    Python 运维之路
    Linux 运维之路
    8086汇编 中断
    8086汇编 rep 指令
    8086汇编 cmp 指令
    8089汇编 标志寄存器
    8086汇编 call 指令
  • 原文地址:https://www.cnblogs.com/rausen/p/4177248.html
Copyright © 2011-2022 走看看