八中小火车

文章目录

1.题目
2.分析
3.代码

㈠题目

Description

八中成为一个网红打卡点,学校有C个景点,编号依次为1到C,小火车上共有S个座位,现在lxr收取了多个申请,每个申请包含三个参数,分别用first、last、N表示,first为起点,last为目的地点,N为车票张数。只有在从first到last的区段内,小火车车上都有N个或N个以上的空座位时,lxr才会批准这个申请,现在请问这些申请的通过情况

Input

第一行包含三个用空格隔开的整数C、S、R,C为景点个数,S为小火车上的座位数,R为申请总数。接下来的R行,每行为一个售票申请,用三个由空格隔开的整数first、last、N,first表示起点,last表示目的地站,N为车票站数,其中1<=D<=C , 1<=O<=C, 所有的售票申请按申请的时间从早到晚给出。 1<=C<=60000 , 1<=S<=60000, 1<=R<=60000 保证first<=last

Output

共有R行,每行输出一个“T”或 “N” ,依次输出这些申请是否能被通过

example

input
4 6 4
1 4 2
1 3 2
2 4 3
1 2 3
output
T
T
N
N

㈡分析

一道线段树+lazy标记的题目

㈢代码

#include <bits/stdc++.h>
using namespace std;
int c,s,r,kkk[240010],lazy[240010];
struct a{
	int l1,r1,p1;
}b[240010];
void updata(int p) {//上传标记
	kkk[p]=max(kkk[p*2],kkk[p*2+1]);
}
void push_down(int p) {//下放标记
	if(lazy[p]){
		kkk[p*2]+=lazy[p],lazy[p*2]+=lazy[p];
		kkk[p*2+1]+=lazy[p],lazy[p*2+1]+=lazy[p];
		lazy[p]=0;
	}
}
void q_add(int p,int lk,int rkk,int x,int y,int v){
	if(lk>=x&&rkk<=y) {
		lazy[p]+=v,kkk[p]+=v;
	return;
	}
	int mid=(lk+rkk)/2;
	push_down(p);
	if(mid>=x)q_add(p*2,lk,mid,x,y,v);
	if(mid<y)q_add(p*2+1,mid+1,rkk,x,y,v);
	updata(p);
}
int query(int p,int lkk,int rkkk,int x,int y){
	if(x<=lkk && y>=rkkk)return kkk[p];
	int mid=(lkk+rkkk)/2,Max=0;
	push_down(p);
	if (x<=mid)Max=max(query(p*2,lkk,mid,x,y),Max);
	if (y>mid)Max=max(query(p*2+1,mid+1,rkkk,x,y),Max);
	return Max;
}
int main(){
	scanf("%d%d%d",&c,&s,&r);
	for(int i=1 ; i<=r ; i++){
	scanf("%d%d%d",&b[i].l1,&b[i].r1,&b[i].p1);
	}
	for(int i=1 ; i<=r ; i++){
	if(query(1,1,c,b[i].l1,b[i].r1-1)+b[i].p1<=s){
	q_add(1,1,c,b[i].l1,b[i].r1-1,b[i].p1);
	printf("T\n");
	}
	else printf("N\n");
	}
	return 0;
} 

题库链接:http://forioi.com/contest/problem?id=518&pid=2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值