zoukankan      html  css  js  c++  java
  • LOJ 6278 数列分块入门 2

    嗯...

    题目链接:https://loj.ac/problem/6278

    这道题只要加上一个update函数即可,用一个vector来记录当前的元素,分三种情况:

    1.在l的块中:直接暴力枚举

    2.在r的块中:直接暴力枚举

    3.在整块中:二分答案

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<vector>
     4 #include<algorithm>
     5 #include<cmath>
     6 
     7 using namespace std;
     8 
     9 const int maxn = 100010;
    10 const int N = 505;
    11 
    12 int block, num;
    13 int L[N], R[N], add[N];
    14 int a[maxn], belong[maxn];
    15 vector<int> vc[N];
    16 
    17 inline void build(int n){
    18     block = sqrt(n);
    19     num = ceil(n * 1.0 / block);
    20     for(int i = 1; i <= n; i++){
    21         belong[i] = (i - 1) / block + 1;
    22         vc[belong[i]].push_back(a[i]);
    23     }
    24     for(int i = 1; i <= num; i++){
    25         L[i] = (i - 1) * block + 1;
    26         R[i] = i * block;
    27         sort(vc[i].begin(), vc[i].end());
    28     }
    29     R[num] = n;
    30 }
    31 
    32 inline void update(int pos){
    33     vc[pos].clear();
    34     for(int i = L[pos]; i <= R[pos]; i++) vc[pos].push_back(a[i]);
    35     sort(vc[pos].begin(), vc[pos].end());
    36 }
    37 
    38 inline void modify(int l, int r, int c){
    39     for(int i = l; i <= min(r, R[belong[l]]); i++) a[i] += c;
    40     update(belong[l]);
    41     if(belong[l] != belong[r]){
    42         for(int i = L[belong[r]]; i <= r; i++) a[i] += c;
    43         update(belong[r]);
    44     }
    45     for(int i = belong[l] + 1; i < belong[r]; i++) add[i] += c;
    46 }
    47 
    48 inline int query(int l, int r, int c){
    49     int ans = 0;
    50     for(int i = l; i <= min(r, R[belong[l]]); i++)
    51         if(a[i] + add[belong[i]] < c) ans++;
    52     if(belong[l] != belong[r]){
    53         for(int i = L[belong[r]]; i <= r; i++)
    54             if(a[i] + add[belong[i]] < c) ans++;
    55     }
    56     for(int i = belong[l] + 1; i < belong[r]; i++)
    57         ans += lower_bound(vc[i].begin(), vc[i].end(), c - add[i]) - vc[i].begin();
    58     return ans;
    59 }
    60 
    61 int main(){
    62     int n;
    63     scanf("%d", &n);
    64     for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    65     build(n);
    66     for(int i = 1; i <= n; i++){
    67         int opt, l, r, c;
    68         scanf("%d%d%d%d", &opt, &l, &r, &c);
    69         if(opt == 0) modify(l, r, c);
    70         else printf("%d
    ", query(l, r, c * c));
    71     }
    72     return 0;
    73 }
    AC代码
  • 相关阅读:
    OpenCV---直方图反向投影
    OpenCV---直方图的应用(均衡化和图像比较)
    ASP.NET WEB SERVICE 创建、部署与使用
    DataSet和DataTable有用的方法
    黑客网站
    局域网中工作组和域之间的差别
    索引使用原则(精)
    C# Web Service 初级教学
    Extjs下拉多选框
    如何在UltraEdit中高亮显示PB代码
  • 原文地址:https://www.cnblogs.com/New-ljx/p/12008278.html
Copyright © 2011-2022 走看看