cdoj1324暴力分块

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
int belong[maxn],l[maxn],r[maxn],block,num,n,q;
ll a[maxn],Max[maxn];
void build(){
    block=sqrt(n);
    num=n/block;if(n%block!=0) num++;
    for(int i=1;i<=num;++i){//num 不要写成n
        l[i]=(i-1)*block+1;r[i]=i*block;
    }
    r[num]=n;//收敛
    for(int i=1;i<=n;++i){
        belong[i]=(i-1)/block+1;
    }
    for(int i=1;i<=n;++i){
        Max[belong[i]]=max(Max[belong[i]],a[i]);
    }
}
void update(int x,int y){//单点更新
    a[x]+=y;
    Max[belong[x]]=max(Max[belong[x]],a[x]);
}
ll ask(int x,int y){
    //变量与数组重名
    ll ans=-1;
    if(belong[x]==belong[y]){
        for(int i=x;i<=y;++i){
            ans=max(ans,a[i]);
        }
        return ans;
    }
    for(int i=x;i<=r[belong[x]];++i){
        ans=max(ans,a[i]);
    }
    for(int i=belong[x]+1;i<belong[y];++i){
        ans=max(ans,Max[i]);
    }
    for(int i=l[belong[y]];i<=y;++i){
        ans=max(ans,a[i]);
    }
    return ans;
}
int main(){
    scanf("%d%d",&n,&q);
    build();
    int i,t,x,y;
    for(i=0;i<q;++i){
        scanf("%d%d%d",&t,&x,&y);
        if(t==1){
            update(x,y);
        }
        else{
            printf("%lld\n",ask(x,y));
        }
    }
    return 0;
}
时间: 2024-10-16 01:59:39

cdoj1324暴力分块的相关文章

bzoj5037 线段树练习4加强版(暴力分块)

求大爷教线段树怎么写啊QAQ 只会写分块...一开始脑抽写成了O(NKlogN)还被CZL大爷嘲讽了一发T T f[i][j]表示在第i块中,模k为j的数有几个,然后每次修改的时候只需要打个标记,查询的时候直接加上标记查就行了 #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; co

BZOJ 3343: 教主的魔法 [分块]【学习笔记】

3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved: 526[Submit][Status][Discuss] Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)

【bzoj5089】最大连续子段和 分块+单调栈

题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A  l  r  x :将 [l,r] 区间内的所有数加上 x : Q  l  r : 询问 [l,r] 区间的最大连续子段和. 其中,一个区间的最大连续子段和指的是:该区间所有子区间的区间和中的最大值(本题中子区间包括空区间,区间和为 0 ). 输入 第一行两个整数 n.m,表示序列的长度以及操作的数目. 之后的 m 行,每行输入一个操作,含义如题目所述.保证操作为  A  l  r  x  或  Q  l  r  之一. 对于 3

loj#6285 数列分块入门 9 ( 回 滚 )

题目 :  链接 :https://loj.ac/problem/6285 题意:给出一个长为 n的数列,以及 n个操作,操作涉及询问区间的最小众数. 思路:虽然这不是一道 回滚莫队题,就是 暴力分块 的题, 但是 还是 可以用回滚莫队 写滴,好像大部分题解都是 暴力分块. #include<bits/stdc++.h> #define LL long long #define ULL unsigned long long #define rep(i,j,k) for(int i=j;i<

CF1293C - NEKO&#39;s Maze Game 分块

一定是两个障碍物组成一对来破坏连通性,每个障碍物可能属于最多3对,然后维护障碍物对数就行.但是懒得讨论,暴力分块过了. 涉及到修改的块暴力重构这个块的连通性.只要左端两个位置和右端两个位置中任意两个可互达就具有连通性. 然后每次询问,就先看每个块的连通性,再看每个块之间是否成功的连接起来. 1 #include <cstdio> 2 #include <cmath> 3 using namespace std; 4 int n,q,m,M,acc[1100],mp[3][11000

【BZOJ 2120】 数颜色

Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干什么了吗? Input 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数.第2行N个整数,分别代表初始画笔排中第i支画笔的颜色.第3行到第2+M行,每行分别代表墨墨会做的一件事情,格

【POJ2352】【树状数组】Stars

Description Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and not to the right of the given star. As

[知识点]莫队大法好

昨天的模拟赛T3是个非常恶心的东东,不过今天获知有人莫队+O3卡常A了== 但是原来OD表示莫队目前没什么用不用学,就没学过,所以昨天无奈不会打 但是今天哼哼,学会了这个新的知识点,而且觉得还是挺好用的啊 毕竟暴力是哪里都能用得上的... 所谓莫队,是一个优雅的暴力 解决的问题就是离线区间询问,好像是无敌的.(然而区间修改我目前还不会,而且区间最值好像也不会,而且区间最值也不用莫队233) 首先我们知道区间[L,R],那么我们一定能暴力求出来[L‘,R'].我们将所有询问存起来,暴力求出来第一个

NOIP2017小结

title: NOIP2017小结 tags: --- Day2 T3 题意十分的简洁,就是需要弄个数据结构去维护一个矩阵中,删除一个位置,然后把这一行左移一个单位,再把最后一列前移一个单位.反正,我一看就觉得是线段树,直接建\(n+1\)个线段树,就可以直接搞了,二看就觉得空间分分钟炸掉.于是就没啥办法了. \(30pts\) 考虑\(30pts\)的数据,暴力模拟就好了. \(50pts\) 然后还有一个\(20pts\)的数据,\(q\)比较小,似乎有一种\(q^2\)的做法,反正我是不会