hdu 3577 Fast Arrangement(线段树区间修改,求区间最小值)
One train can just take k passangers. And each passanger can just buy one ticket from station a to station b. Each train cannot take more passangers any time. The one who buy the ticket earlier which can be sold will always get the ticket.
The first line contains just one number k( 1 ≤ k ≤ 1000 ) and Q( 1 ≤ Q ≤ 100000 )
The following lines, each line contains two integers a and b, ( 1 ≤ a < b ≤ 1000000 ), indicate a query.
Huge Input, scanf recommanded.
Output the case number in the first line.
If the ith query can be satisfied, output i. i starting from 1. output an blank-space after each number.
Output a blank line after each test case.
题意:告诉你一辆车最多可以乘k个人,一共有q个人想要上车。按顺序给出每个人的开始的车站和结束的车站,问你有几个人能上的了车。
这题就是简单的区间修改,先定义所有区间为k,再求一下区间的最小值,如果最小值小于等于0那么就载不下更多人。每次更新区间都将
这个区间的所有值减1,然后更新一下最小值。最后要注意一下的是一个人上下车的时间是左闭右开区间,可以想到要是一个人下车,另一个人上车,这个情况下这个
点的大小还是不变的。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int M = 1e6 + 10;
int a[M] , b[M] , c[M];
struct TnT {
int l , r , min , add;
ll sum;
}T[M << 2];
int k , q;
void push(int p) {
if(T[p].add) {
T[p << 1].sum -= T[p].add * (T[p].r - T[p].l + 1);
T[p << 1].min -= T[p].add;
T[(p << 1) | 1].sum -= T[p].add * (T[p].r - T[p].l + 1);
T[(p << 1) | 1].min -= T[p].add;
T[p << 1].add += T[p].add;
T[(p << 1) | 1].add += T[p].add;
T[p].add = 0;
}
}
void build(int l , int r , int p) {
int mid = (l + r) >> 1;
T[p].l = l , T[p].r = r , T[p].add = 0;
if(T[p].l == T[p].r) {
T[p].sum = k;
T[p].min = k;
return ;
}
build(l , mid , p << 1);
build(mid + 1 , r , (p << 1) | 1);
T[p].sum = T[p << 1].sum + T[(p << 1) | 1].sum;
T[p].min = min(T[p << 1].min , T[(p << 1) | 1].min);
}
void updata(int l , int r , int p , int c) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == l && T[p].r == r) {
T[p].sum -= c * (r - l + 1);
T[p].add += c;
T[p].min -= c;
return ;
}
push(p);
if(mid < l) {
updata(l , r , (p << 1) | 1 , c);
}
else if(mid >= r) {
updata(l , r , p << 1 , c);
}
else {
updata(l , mid , p << 1 , c);
updata(mid + 1 , r , (p << 1) | 1 , c);
}
T[p].sum = T[p << 1].sum + T[(p << 1) | 1].sum;
T[p].min = min(T[p << 1].min , T[(p << 1) | 1].min);
}
int query(int l , int r , int p) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == l && T[p].r == r) {
return T[p].min;
}
push(p);
if(mid < l) {
return query(l , r , (p << 1) | 1);
}
else if(mid >= r) {
return query(l , r , p << 1);
}
else {
return min(query(l , mid , p << 1) , query(mid + 1 , r , (p << 1) | 1));
}
}
int main()
{
int n;
scanf("%d" , &n);
int ans = 0;
while(n--) {
scanf("%d%d" , &k , &q);
ans++;
int MAX = 0;
for(int i = 1 ; i <= q ; i++) {
scanf("%d%d" , &a[i] , &b[i]);
b[i]--;
MAX = max(MAX , max(a[i] , b[i]));
}
build(1 , MAX , 1);
int count = 0;
for(int i = 1 ; i <= q ; i++) {
int re = query(a[i] , b[i] , 1);
if(re <= 0) {
continue;
}
else {
updata(a[i] , b[i] , 1 , 1);
c[count++] = i;
}
}
printf("Case %d:\n" , ans);
for(int i = 0 ; i < count ; i++) {
printf("%d " , c[i]);
}
printf("\n\n");
}
return 0;
}
hdu 3577 Fast Arrangement(线段树区间修改,求区间最小值)的更多相关文章
- HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...
- HDU 3577 Fast Arrangement (线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3577 题意不好理解,给你数字k表示这里车最多同时坐k个人,然后有q个询问,每个询问是每个人的上车和下车 ...
- HDU - 3577 Fast Arrangement 线段树
Fast Arrangement Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU - 1754 I Hate It (线段树点修改求最大值)
题意:有N个学生M条操作,0<N<=200000,0<M<5000,要么查询某区间内学生的最高分,要么更改某学生的成绩. 分析:原理和线段树点修改求和类似. #include& ...
- HDU - 1754 线段树-单点修改+询问区间最大值
这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...
- HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 1754 I Hate It 【线段树单点修改 维护区间最大值】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others ...
- HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1166 敌兵布阵 (线段树单点修改和区间和查询)
Input 第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1 ...
随机推荐
- Linux 常见的常识及常用快捷键方式
1. ,请写出linux系统中常见一级目录的名称及作用. /root : 超级用户的家目录 /home: 普通用户的家目录 /boot: 启动目录,启动相关文件(系统内核启动文件) /de ...
- 【POJ - 3258】River Hopscotch(二分)
River Hopscotch 直接中文 Descriptions 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一块岩石跳到另一块岩石.这项激动人心的活动在一条长长的笔直河道中进行,在起点 ...
- WPF:事件委托对于不同界面间通信的应用
界面1内设定点击事件,生成Path用事件传出public partial class TemplateWindow : Window { internal delegate v ...
- centos7安装mongodb详解
记录一下linux下安装mongodb数据库过程. 安装mongodb #下载linux版本的tar文件# 例如笔者下载的是:mongodb-linux-x86_64-rhel70-3.4.4.tg ...
- SpringBoot第二天
一,SpringBoot 整合 jsp 技术 1,创建项目 2,修改 pom 文件,添加坐标 <project xmlns="http://maven.apache.org/POM/4 ...
- 想成为顶尖 Java 程序员?请先过了下面这些技术问题。
一.数据结构与算法基础 说一下几种常见的排序算法和分别的复杂度. 用Java写一个冒泡排序算法 描述一下链式存储结构. 如何遍历一棵二叉树? 倒排一个LinkedList. 用Java写一个递归遍历目 ...
- Linux启动之旅
引言 某出租房内,某台电脑的电源键被按下,于是开启了一段Linux启动之旅... BIOS 系统启动,首先进入BIOS. ● BIOS 为 Base Input/Output System(基本输入输 ...
- Vue 路由模块化配置
博客地址:https://ainyi.com/77 企业运营后台页面很多,路由如若不区分模块化配置,所有路由挤在同一个文件将不好维护,所以路由的配置也要模块化 分享两个解决方案 -- Vue 路由配置 ...
- Vue创建项目配置
前言 安装VS Code,开始vue的学习及编程,但是总是遇到各种各样的错误,控制台语法错误,格式错误.一股脑的袭来,感觉创建个项目怎么这个麻烦.这里就讲一下vue的安装及创建. 安装环境 当然第一步 ...
- final,权限,引用类型数据
1. final关键字 1.概述 为了避免子类出现随意改写父类的情况,java提供了关键字final,用于修饰不可改变内容 final:不可改变,可以修饰类,方法和变量 类:被修饰的类,不能用于继承 ...