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 ...
随机推荐
- MySQL5.7运行CPU达百分之400处理方案
用户在使用 MySQL 实例时,会遇到 CPU 使用率过高甚至达到 100% 的情况.本文将介绍造成该状况的常见原因以及解决方法,并通过 CPU 使用率为 100% 的典型场景,来分析引起该状况的原因 ...
- Web容器启动中执行某个Java类
1.监听(Listener) <!-- 配置监听 --> <listener> <listener-class>com.xian.jdbc.GetPropertie ...
- FormLayout and FormData
FormLayout通过为小窗口部件创建四边的Form附加值(attachment)来进行工作,并且把这些Form附加值存储在布局数据中.一个附加值让一个小窗口部件指定的一边粘贴(attach)到父C ...
- 最小化docker镜像
kubernetes离线安装包,仅需三步 如何让镜像尽可能小 很容器想到from scratch, 就是没任何基础镜像 FROM scratch COPY p / ENTRYPOINT [" ...
- JAVA jobs
Java岗位1, SpringMVC, spring, mybaits2, 高并发编程3, mysql或者oracle SQL调优及函数,存储过程,JOB调度
- HTML/CSS:div水平与元素垂直居中(2)
单个div水平居中:设置margin的左右边距为自动 div水平和垂直居中,text-align和vertical-align不起作用,因为标签div没有这两个属性,所以再css中设置这两个值不能居中 ...
- S3 Select for Java 使用记录
背景 后台基本使用 Amazon 的全家桶(EC2.DynamoDB.S3.Step Fuction 等等)构建.现在需要根据访问者的 IP 确定访问者的国家或地区. 已知: 访问者 IP 一个 ip ...
- c# 三步递交模式调用同一个存储过程
主要用于批量的sql操作:第一步创建中间表,第二步多次写数据到中间表,第三步 提交执行 创建三步递交的存储过程: CREATE PROC usp_testsbdj@bz int=0,@name VAR ...
- ansible之数据提取与Juniper实例演示
一.Ansible列表两种表达方式 基于YAML的列表 my_list: - a - b - c - d 基于Json格式的列表 {"my_list":[ "a" ...
- poi使用随笔
HSSFworkbook,XSSFworkbook,SXSSFworkbook区别简述 HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls: XSSFWor ...