【模板】分块

两个操作,1是询问[l,r]颜色的数量,2是交换p,p+1位置的颜色.

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n, m, a[600][50010], b[300010], block, l[600], r[600], pos[300010], cnt, vis[300010];
bool flag = true;

void update(int cur)
{
    int t = b[cur], t2 = b[cur + 1];
    swap(b[cur], b[cur + 1]);
    int p1 = pos[cur], p2 = pos[cur + 1];
    a[p1][t]--;
    a[p2][t]++;
    a[p1][t2]++;
    a[p2][t2]--;
}

int query(int ll, int rr, int c)
{
    int L = pos[ll], R = pos[rr], res = 0;
    if (L >= R - 1)
    {
        for (int i = ll; i <= rr; i++)
            if (b[i] == c)
                res++;
        return res;
    }
    for (int i = L + 1; i <= R - 1; i++)
        res += a[i][c];
    for (int i = ll; i <= r[L]; i++)
        if (b[i] == c)
            res++;
    for (int i = l[R]; i <= rr; i++)
        if (b[i] == c)
            res++;
    return res;
}

int main()
{
    scanf("%d%d", &n, &m);
    block = sqrt(n);
    for (int i = 1; i <= n; i++)
        pos[i] = (i - 1) / block + 1;
    cnt = (n - 1) / block + 1;
    for (int i = 1; i <= cnt; i++)
        l[i] = r[i - 1] + 1, r[i] = min(block * i, n);
    for (int i = 1; i <= n; i++)
    {
        int t;
        scanf("%d", &t);
        a[pos[i]][t]++;
        b[i] = t;
    }
        while (m--)
        {
            int op, l, r, c;
            scanf("%d", &op);
            if (op == 1)
            {
                scanf("%d%d%d", &l, &r, &c);
                printf("%d\n", query(l, r, c));
            }
            else
            {
                scanf("%d", &c);
                update(c);
            }
        }

    return 0;
}
时间: 2024-08-30 14:16:06

【模板】分块的相关文章

模板 分块

分块模板 单点加 区间求和 时间复杂度 Q * sqrt(N) 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 #define LL long long 4 #define eps 1e-9 5 using namespace std ; 6 7 const int N = 100011 ; 8 int n,Q,size,cnt,pos,x ; 9 LL ans ; 10 int a[N] ;

洛谷1558 色板游戏 线段树

我先立个Flag 我,这几天,要过1W道线段树题. 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:1. "C A B C" 指在A到 B 号方格中涂上颜色 C.2. "P A B" 指老师的提问:A到 B号方格中有几种颜色.学校的颜料盒中一共有 T 种颜料.为简便起见,我

vue学习之插槽

插槽 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性. 个人理解:我感觉插槽就是父组件控制插槽的内容.他是用什么标签展示的,以及他要展示的内容.子组件来控制插槽插入的位置. 插槽的分类:插槽分为三种.匿名插槽,具名插槽,还有作用域插槽 匿名插槽:也就是默认插槽.把父组件中的内容默认插入到子组件的中<slot></slot>只的位置. 下面是展示在页面中的效果 具名插槽: 具名插

分块算法及模板

此文为博主原创,转载时请通知博主,并把原文链接放在正文醒目位置. 简要介绍 分块算法就是把一串数据分割成几块数据的算法,其实是对暴力的一种优化. 通常在分块时,每块的大小为√n.但最后一块的大小也可能小于√n,只能用暴力来算. 通过把对单个数据的操作转化为对几个块的数据的操作,能够节省时间,提高运算效率. 分块算法在处理大范围的修改.查询问题时有很大优势. 分块算法代码 1 /*此代码主要模仿了钟皓曦大佬的分块算法*/ 2 #include<iostream> 3 #include<cs

Luogu 2801 教主的魔法 | 分块模板题

Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; typedef long long ll; #define space putchar(' ')

教主的魔法(分块模板)

教主的魔法(luogu) Description 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高) CYZ.光哥和ZJQ等人不信教主的邪,于是他们有

luogu1903 【模板】分块/带修改莫队(数颜色)

莫队算法模板 推荐阅读这篇博客 #include <algorithm> #include <iostream> #include <cstdio> #include <cmath> using namespace std; int n, m, bse, blc[10005], a[10005], qCnt, cCnt, qwq[10005], ans=0; int cnt[10005]; char ss[5]; struct Query{ int xxx,

Luogu 1494 - 小Z的袜子 - [莫队算法模板题][分块]

题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜

整除分块模板

这里大概讲解一下整除分块的原理和效果. 比如我们要求某个i的区间中,n/i的和是多少,但是其实你会发现,在一些连续的区间中,n/i是相等的,而整除分块的目的,便是按照n进行分块 使得可以跳过这些n/i是相等的这些区间,使得复杂度将到根号n for (int l=1,r;l<=n;l=r+1){ r=n/(n/l); // printf("%d ",r); } 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/10600035.html