• BZOJ3236 [Ahoi2013]作业


    昨天晚上做的。。。差错一直查到今天= =

    最后没办法问管理员要了数据才知道原来ans数组开小了233,简直沙茶

    这道题不就是裸的莫队嘛= =|||

    只要用树状数组维护当前的两种个数即可。

      1 /**************************************************************
      2     Problem: 3236
      3     User: rausen
      4     Language: C++
      5     Result: Accepted
      6     Time:79318 ms
      7     Memory:66252 kb
      8 ****************************************************************/
      9  
     10 #include <cstdio>
     11 #include <cmath>
     12 #include <algorithm>
     13  
     14 #define lowbit(x) x & -x
     15 using namespace std;
     16 const int N = 100005;
     17 const int M = 1000005;
     18 const int Maxlen = 37000005;
     19  
     20 int n, size, Q;
     21 int BIT[2][N], cnt[N], pos[N], a[N];
     22 int ans1[M], ans2[M];
     23 int Len, Left;
     24 char buf[Maxlen];
     25  
     26 struct Query {
     27     int l, r, a, b, w;
     28 } q[M];
     29 inline bool operator < (const Query &a, const Query &b) {
     30     return pos[a.l] == pos[b.l] ? a.r < b.r : pos[a.l] < pos[b.l];
     31 }
     32 inline bool cmp_id (const Query &a, const Query &b) {
     33     return a.w < b.w;
     34 }
     35  
     36 inline int read() {
     37     int x = 0;
     38     while (buf[Left] < '0' || '9' < buf[Left])
     39         ++Left;
     40     while ('0' <= buf[Left] && buf[Left] <= '9')
     41         x = x * 10 + buf[Left++] - '0';
     42     return x;
     43 }
     44  
     45 int len = 0, pr[15];
     46 inline void print(int x) {
     47     while (x)
     48         pr[++len] = x % 10, x /= 10;
     49     if (!len) putchar('0');
     50     while (len)
     51         putchar(pr[len--] + '0');
     52 }
     53  
     54 inline void update(int x, int del, int T) {
     55     while (x <= n)
     56         BIT[T][x] += del, x += lowbit(x);
     57 }
     58  
     59 inline int query(int x, int T) {
     60     int res = 0;
     61     while (x)
     62         res += BIT[T][x], x -= lowbit(x);
     63     return res;
     64 }
     65  
     66 inline void update(int x, int del) {
     67     if (!cnt[x])
     68         update(x, 1, 1);
     69     cnt[x] += del;
     70     if (!cnt[x])
     71         update(x, -1, 1);
     72     update(x, del, 0);
     73 }
     74  
     75 int main() {
     76     int i, l, r;
     77     Len = fread(buf, 1, Maxlen, stdin);
     78     buf[Len] = ' ';
     79     n = read(), Q = read();
     80     size = (int) sqrt(n);
     81     for (i = 1; i <= n; ++i)
     82         a[i] = read(), pos[i] = i / size;
     83     for (i = 1; i <= Q; ++i) {
     84         q[i].l = read(), q[i].r = read();
     85         q[i].a = read(), q[i].b = read();
     86         q[i].w = i;
     87     }
     88      
     89     sort(q + 1, q + Q + 1);
     90     for (i = l = 1, r = 0; i <= Q; ++i) {
     91         for (; r < q[i].r; ) update(a[++r], 1);
     92         for (; r > q[i].r; ) update(a[r--], -1);
     93         for (; l < q[i].l; ) update(a[l++], -1);
     94         for (; l > q[i].l; ) update(a[--l], 1);
     95         ans1[q[i].w] = query(q[i].b, 0) - query(q[i].a - 1, 0);
     96         ans2[q[i].w] = query(q[i].b, 1) - query(q[i].a - 1, 1);
     97     }
     98     for (i = 1; i <= Q; ++i) {
     99         print(ans1[i]), putchar(' ');
    100         print(ans2[i]), putchar('
    '), putchar('
    ');
    101     }
    102     return 0;
    103 }
    View Code

    (p.s. 这道题Rank 1的5 sec是怎么做到的= =,蒟蒻可是用了80 sec啊!!!)

    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    Android studio 几个坑,值得注意下。
    Android studio使用技巧,不定期更新。
    Android生猛上手,先写个拨号器。
    Ubuntu11.10安装教程,非虚拟机
    在线编辑器CKEditor,多图上传功能实现
    sql 中的NULL小问题 ,大bug
    工资低的.Net程序员,活该你工资低
    30岁的老龄程序员 ,不学习就会被淘汰
    计算商品税额和商品价格保留小数的时候的坑
    大话设计模式--简单工厂模式
  • 原文地址:https://www.cnblogs.com/rausen/p/4108541.html
Copyright © 2020-2023  润新知