[原创题] count 分段Hash

题意

  

实现

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <map>
using namespace std;

#define F(i, a, b) for (register int i = (a); i <= (b); i++)

const int N = 300000;

int n, m, a[N];
int M; map<int, int> h;

inline int rd(void) {
    int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == ‘-‘) f = -1;
    int x = 0; for (; isdigit(c); c = getchar()) x = x*10+c-‘0‘; return x*f;
}

inline void Modify(int x, int w, int d) { for (x += M; x > 0; x >>= 1) h[x][w] += d; }
inline void Query(int L, int R, int w) {
    int sum = 0;
    for (L = L-1+M, R = R+1+M; L^R^1; L >>= 1, R >>= 1) {
        if (!(L&1)) sum += h[L^1].count(w) ? h[L^1][w] : 0;
        if (R&1) sum += h[R^1].count(w) ? h[R^1][w] : 0;
    }
    return sum;
}

int main(void) {
    #ifndef ONLINE_JUDGE
        freopen("count.in", "r", stdin);
        freopen("count.out", "w", stdout);
    #endif
    n = rd(), m = rd();
    for (M = 1; M < n+2; M <<= 1);
    F(i, 1, n)
        Modify(i, a[i] = rd(), 1);
    F(i, 1, m) {
        int k = rd();
        if (k == 1) {
            int x = rd(), w = rd();
            Modify(x, a[x], -1);
            Modify(x, a[x] = w, 1);
        }
        else {
            int l = rd(), r = rd(), w = rd();
            printf("%d\n", Query(l, r, w));
        }
    }
    return 0;
}
时间: 2024-10-13 20:28:14

[原创题] count 分段Hash的相关文章

LeetCode 第 204 题 (Count Primes)

LeetCode 第 204 题 (Count Primes) Description: Count the number of prime numbers less than a non-negative number, n. 计算小于 N 的素数的个数.这道题目比较简单.但是想提高计算效率与需要费点脑筋. 判断一个数字 n 是不是素数的简单方法是 用 n 去除 2,3,4,-,n?1,如果都不能整除就说明这个数是素数. 按照这个思路可以写个简单的函数. bool isPrime(int n)

[原创题] 阶乘取模 分段打表

题意 计算 $n! \mod {10 ^ 9 + 7}$ . $n \le {10 ^ 9}$ . 实现 prework.cpp 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cctype> 5 6 const int D = 1000000; 7 const int M = (int)1e9+7; 8 9 int main(void) { 10 for (

LeetCode算法题-Count Binary Substrings(Java实现)

这是悦乐书的第293次更新,第311篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第161题(顺位题号是696).给定一个字符串s,计算具有相同数字0和1的非空且连续子串的数量,并且这些子串中的所有0和所有1都是连续的.重复出现的子串也计算在内.例如: 输入:"00110011" 输出:6 说明:有6个子串具有相同数量的连续1和0:"0011","01","1100","10"

【算法】LeetCode算法题-Count And Say

这是悦乐书的第153次更新,第155篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第12题(顺位题号是38).count-and-say序列是整数序列,前五个术语如下: 1 11 21 1211 111221 1被读作"一个一"或者11.第二项的值是第一项的读法. 11被读作"两个一"或者21.第三项的值是第二项的读法. 21被读作"一个二,两个一"或者1211.第四项的值是第三项的读法. 给定整数n,其中1≤n≤3

poj 2002(好题 链式hash+已知正方形两点求另外两点)

Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 18493   Accepted: 7124 Description A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angles. It is also a polygon such that rotating abou

2017.8.7 联考水题 Passward kmp/hash 字符串

你来到了一个庙前,庙牌上有一个仅包含小写字母的字符串 s. 传说打开庙门的密码是这个字符串的一个子串 t,并且 t 既是 s 的前缀又是 s 的后缀并且还在 s 的中间位置出现过一次. 如果存在这样的串,请你输出这个串,如有多个满足条件的串,输出最长的那一个. 如果不存在这样的串,输出"Just a legend"(去掉引号). 输入格式: 仅一行,字符串 s. 输出格式: 如题所述 样例输入 fixprefixsuffix 样例输出: fix 数据范围: 对于 60%的数据, s 的

leetcode第38题-Count and Say

The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, 111221, ... 1 is read off as "one 1" or 11. 11 is read off as "two 1s" or 21. 21 is read off as "one 2, then one 1" or 1211. Given

leetcode_38题——Count and Say(string,迭代计数)

Count and Say Total Accepted: 39135 Total Submissions: 154215My Submissions Question Solution The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ... 1 is read off as "one 1" or 11.11 is read off

2014牡丹江网络预选赛I题(字符串hash+简单DP)zoj3817

Chinese Knot Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Chinese knot is a decorative handicraft that began as a form of Chinese folk artifact in the Tang and Song Dynasty in China. It was later popularized in the Ming. Alice