• 洛谷P1531 I Hate It题解


    题目背景

    很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。

    题目描述

    不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩

    输入格式

    第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。学生ID编号分别从1编到N。第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。当C为'U'的时候,表示这是一条更新操作,如果当前A学生的成绩低于B,则把ID为A的学生的成绩更改为B,否则不改动。

    输出格式

    对于每一次询问操作,在一行里面输出最高成绩

    输入输出样例

    输入 #1 复制

    5 6

    1 2 3 4 5

    Q 1 5

    U 3 6

    Q 3 4

    Q 4 5

    U 2 9

    Q 1 5

    输出 #1 复制

    5

    6

    5

    9

    解析:

    单点修改,区间查询。

    明显的线段树。

    #include <cstdio>
    #include <cmath>
    #include <iostream>
    #include <cstdlib>
    #include <vector>
    #include <map>
    #include <cstring>
    #include <queue>
    #include <stack>
    #include <algorithm>
    #define re register
    #define Max 400100
    #define gc getchar
    #define lson x<<1
    #define rson x<<1|1
    int max(int a, int b) {return a > b ? a : b;}
    struct HATE {
    	int l, r, max;
    }t[Max << 1];
    int m, n, pts[Max >> 1];
    void up(int x) {t[x].max = max(t[lson].max, t[rson].max);}
    void build(int l, int r, int x) {
    	t[x].l = l; t[x].r = r;
    	if(l == r) {
    		t[x].max = pts[l];
    		return ;
    	}
    	int mid = l + r >> 1;
    	build(l, mid, lson); build(mid+1, r, rson);
    	up(x);
    }
    void data(int f, int x, int k) {
    	if(t[x].l == f && t[x].r == f) {
    		if(t[x].max < k) t[x].max = k;
    		return ;
    	}
    	int mid = t[x].l + t[x].r >> 1;
    	if(f <= mid) data(f,lson,k);
    	if(f > mid) data(f,rson,k);
    	up(x);
    }
    int Ask(int l, int r, int x) {
    	if(t[x].l >= l && t[x].r <= r)
    		return t[x].max;
    	int mid = t[x].l + t[x].r >> 1;
    	int ans = - 9999999;
    	if(l <= mid) ans = max(ans, Ask(l,r,lson));
    	if(r > mid) ans = max(ans, Ask(l,r,rson));
    	return ans;
    }
    int main() {
    	scanf("%d%d",&n,&m);
    	for(re int i = 1; i <= n; ++ i) scanf("%d", &pts[i]);
    	build(1, n, 1); int l, r; char opt;
    	for(re int i = 1; i <= m; ++ i) {
    		std :: cin >> opt;
    		scanf("%d %d",&l,&r);
    		if(opt == 'U') data(l,1,r);
    		else printf("%d
    ",Ask(l,r,1));
    	}
    	return 0;
    }
    
  • 相关阅读:
    [python]OS文件系统
    [phyton]文件的简单读写练习
    [Python]字典的简单用法
    Cocos2d-x学习笔记(十五)之 绘制图形
    Cocos2d-x学习笔记(十四)之 拖动渐隐效果类CCMotionStreak
    Cocos2d-x学习笔记(十三)之 容器类
    Cocos2d-x学习笔记(十二)之 文本渲染类
    Cocos2d-x学习笔记(十一)之 菜单类CCMenu
    Cocos2d-x学习笔记(十)之 控件类CCControl
    Cocos2d-x学习笔记(九)之 摄像机类CCCamera
  • 原文地址:https://www.cnblogs.com/ypay/p/11622333.html
Copyright © 2020-2023  润新知