HDU - 1754 I Hate It 分块

目前理解的分块与之前相同还未得到升华。再接再厉
h学长 Orz

题意:老师比较喜欢比较学生间的成绩,这个老师就比较无聊了五差别对待,询问[ i , j ]区间内最高成绩是多少分,但是老师还会修改这个分数
给你一个n,m,n个学生的初始成绩,m个操作,询问或者修改某个学生的成绩

  • 预处理
    • 第 i 块的最高成绩
  • 跟新
    • 修改第 i 个学生的成绩,并且暴力循环此块 找出最高成绩并跟新
  • 询问
    • 用一个ans记录最大值,暴力判断完整块的最大值,与不完整块的每一个值,即得出答案
#include<bits/stdc++.h>
using namespace std;

const int maxn = 210000;

int s[maxn],pos[maxn],blo,num[maxn];
int n,m;

char ch[3];

void update(int x,int val){
    s[x]=val;
    num[pos[x]]=0;
    for(int i = (pos[x]-1)*blo+1; i <=min(n,pos[x]*blo); i++){
        num[pos[x]]=max(num[pos[x]],s[i]);
    }
}

int query(int l,int r){
    int ans=0;
    for(int i = pos[l]+1; i <= pos[r]-1; i++)ans=max(ans,num[i]);
    if(pos[l]!=pos[r]){
        for(int i = l; i <= pos[l]*blo; i++)ans=max(ans,s[i]);
        for(int i = (pos[r]-1)*blo+1; i <= r; i++)ans=max(ans,s[i]);
    }
    else for(int i = l; i <=r; i++ )ans=max(ans,s[i]);
    return ans;
}

int main(){
    while(~scanf("%d%d",&n,&m)){
    blo=(int)sqrt(n*1.0);
    for(int i = 1; i <= n; i++){
        scanf("%d",&s[i]),pos[i]=(i-1)/blo+1;
    }
    for(int i = 1; i <= pos[n]; i++){
        num[i]=0;
        for(int j = (i-1)*blo+1; j <= min(n,i*blo); j++){
            num[i]=max(num[i],s[j]);
        }
    }
    while(m--){
        int l,r;
        scanf("%s",ch);
        if(ch[0]=='U'){
            scanf("%d%d",&l,&r);
            update(l,r);
        }
        else if(ch[0]=='Q'){
            scanf("%d%d",&l,&r);
            printf("%d\n",query(l,r));
        }
    }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值