CSU 1532 JuQueen 线段树 lazy 区间最值

题目链接:点击打开链接

题意:

第一行给出C, n, Q

开始有一个编号[0, C) 的全0序列。

下面Q行操作

status id (询问下标为id的值)

groupchange [l, r] val  把区间[l,r] 每次+1(或-1)val次,当区间中某一个点达到0或n时则操作停止,输出实际+1(或-1)的值

change id val 同上,只是单点操作。

思路:

裸线段树,维护区间最值和加个lazy标记就可以了



#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <vector>

template <class T>
inline bool rd(T &ret) {
	char c; int sgn;
	if(c=getchar(),c==EOF) return 0;
	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
	sgn=(c=='-')?-1:1;
	ret=(c=='-')?0:(c-'0');
	while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
	ret*=sgn;
	return 1;
}
template <class T>
inline void pt(T x) {
    if (x <0) {
        putchar('-');
        x = -x;
    }
    if(x>9) pt(x/10);
    putchar(x%10+'0');
}
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 50500;
const int inf = 1e8;
#define L(x) tree[x].l
#define R(x) tree[x].r
#define Max(x) tree[x].max
#define Min(x) tree[x].min
#define Lazy(x) tree[x].lazy
#define ls (id<<1)
#define rs (id<<1|1)
struct Node{
	int l, r, min, max, lazy;
}tree[N<<4];
void Up(int id){
	Max(id) = max(Max(ls), Max(rs));
	Min(id) = min(Min(ls), Min(rs));
}
void Down(int id){
	if(Lazy(id)){
		Min(ls) += Lazy(id);
		Min(rs) += Lazy(id);
		Max(ls) += Lazy(id);
		Max(rs) += Lazy(id);
		Lazy(ls) += Lazy(id);
		Lazy(rs) += Lazy(id);
		Lazy(id) = 0;
	}
}
void build(int l, int r, int id){
	L(id) = l; R(id) = r;
	Min(id) = Max(id) = 0;
	Lazy(id) = 0;
	if(l == r)return ;
	int mid = (l+r)>>1;
	build(l, mid, ls); build(mid+1, r, rs);
}
void updata(int l, int r, int val, int id){
	if(l == L(id) && R(id) == r){
		Max(id) += val;
		Min(id) += val;
		Lazy(id) += val;
		return ;
	}
	Down(id);
	int mid = (L(id) + R(id))>>1;
	if(r <= mid)
		updata(l, r, val, ls);
	else if(mid < l)
		updata(l, r, val, rs);
	else {
		updata(l, mid, val, ls);
		updata(mid+1, r, val, rs);
	}
	Up(id);
}
int query_max(int l, int r, int id){
	if(l == L(id) && R(id) == r)return Max(id);
	Down(id);
	int mid = (L(id)+R(id))>>1, ans;
	if(r <= mid) ans = query_max(l, r, ls);
	else if(mid < l) ans = query_max(l, r, rs);
	else ans = max(query_max(l, mid, ls), query_max(mid+1, r, rs));
	Up(id);
	return ans;
}
int query_min(int l, int r, int id){
	if(l == L(id) && R(id) == r)return Min(id);
	Down(id);
	int mid = (L(id)+R(id))>>1, ans;
	if(r <= mid) ans = query_min(l, r, ls);
	else if(mid < l) ans = query_min(l, r, rs);
	else ans = min(query_min(l, mid, ls), query_min(mid+1, r, rs));
	Up(id);
	return ans;
}

int C, n, q;
struct Q{
	char op;
	int l, r, x;
	void put(){printf("  (%c, %d, %d, %d)\n", op, l, r, x);}
}o[50500];
char s[20];
vector<int>G;
void input(){
	G.clear();
	for(int i = 0; i < q; i++)
	{
		scanf("%s", s);
		o[i].op = s[0];
		if(s[0] == 's')rd(o[i].l);
		else if(s[0] == 'g'){
			rd(o[i].l); rd(o[i].r); rd(o[i].x);
			G.push_back(o[i].r);
		}
		else {
			o[i].op = 'g';
			rd(o[i].l); rd(o[i].x);
			o[i].r = o[i].l;
		}
		G.push_back(o[i].l);
  	}
  	sort(G.begin(), G.end());
  	G.erase(unique(G.begin(), G.end()), G.end());
  	for(int i = 0; i < q; i++){
  		o[i].l = lower_bound(G.begin(), G.end(), o[i].l) - G.begin()+1;
  		if(o[i].op == 'g')
  			o[i].r = lower_bound(G.begin(), G.end(), o[i].r) - G.begin()+1;
  	}
  //	for(int i = 0; i < q; i++)o[i].put();
}
int main(){
	int T;
    while(~scanf("%d%d%d", &C, &n, &q)){
   // 	printf("---%d,%d,%d\n", C, n, q);
    	input();
	  	build(1, (int)G.size(), 1);
	  	int l, r, x, tmp; char c;
	  	for(int i = 0; i < q; i++){
			c = o[i].op; l = o[i].l; r = o[i].r; x = o[i].x;
	  		if(c == 's')
				pt(query_min(l, l, 1));
			else if(c == 'g')
			{
				if(x == 0){puts("0");continue;}
				else if(x > 0){
					tmp = query_max(l, r, 1);
		//			printf("max:%d\n", tmp);
					x = min(x, n - tmp);
				}
				else {
					tmp = query_min(l, r, 1);
		//			printf("min:%d\n", tmp);
					x = max(x, -tmp);
				}
				updata(l, r, x, 1);
				pt(x);
			}
	  		putchar('\n');
	  	}
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CSU飞跃手册2019是一个以服务学生发展为宗旨的学生服务项目,帮助学生实现个人成长和职业发展目标。飞跃手册提供了诸如成功学、职业规划、就业技巧以及个人发展等方面的指导,帮助学生掌握自我认知、提升职场竞争力并构建良好的人脉关系。 飞跃手册2019包括三个模块。第一个模块着重讲解如何探索自我,明确职业目标和规划职业道路。这些关键的步骤帮助学生发现自己的职业特长和兴趣爱好,从而为个人职业发展做出决策和规划。 第二个模块提供了职业发展过程中的必备技能,如招聘面试技巧、简历写作、职场沟通、决策和问题解决能力,以及管理和领导力等。这些技能帮助学生在职场中不断学习和成长,并展示自己的优势。 第三个模块则介绍如何利用社会资源和人脉关系来推动个人职业发展。它包括了网络管理、人脉建立、社交礼仪和社会责任等方面的指导。 总之,CSU飞跃手册2019是一份应对职场挑战和工作生涯的指南, 帮助学生建立自己的职业目标并实现自我发展。它讲解了个人成长、职场技能、人脉力量和社会责任等方面的内容,为学生的成功创造了一个强有力的支撑体系。 ### 回答2: CSU飞跃手册2019是一本由中国海洋大学控制科学与工程学院发行的指导学生爆炸性训练和实习的手册。该手册将学生分为不同职业兴趣组,并提供了具体的介绍、岗位培训以及实习就业方案。 该手册还包括了部分参考书目、学术论文和个人成长方向的建议,在实习期间指导学生更好地发展个人能力和提高自己的竞争力。除此之外,该手册还有一些校内外的实践活动介绍和经验分享。这些活动涵盖了多个不同领域,包括科技、创业、环保和社会公益等。 该手册还提供了一些面试技巧和求职指南,帮助学生更好地应对就业市场的挑战。此外,该手册还鼓励学生通过网络平台和社会实践等多种途径积累人脉资源,增强自己的社交和交际技巧。 总的来说,CSU飞跃手册2019为学生提供了一个全面的指导工具,帮助他们更好地理解职业规划,提高个人素质,扩展职业视野并实现自我价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值