Problem Description
Chinese always have the railway tickets problem because of its' huge amount of passangers and stations. Now goverment need you to develop a new tickets query system.
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.
 
Input
The input contains servel test cases. The first line is the case number. In each test case:
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
For each test case, output three lines:
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(线段树区间修改,求区间最小值)的更多相关文章

  1. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...

  2. HDU 3577 Fast Arrangement (线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3577 题意不好理解,给你数字k表示这里车最多同时坐k个人,然后有q个询问,每个询问是每个人的上车和下车 ...

  3. HDU - 3577 Fast Arrangement 线段树

    Fast Arrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. HDU - 1754 I Hate It (线段树点修改求最大值)

    题意:有N个学生M条操作,0<N<=200000,0<M<5000,要么查询某区间内学生的最高分,要么更改某学生的成绩. 分析:原理和线段树点修改求和类似. #include& ...

  5. HDU - 1754 线段树-单点修改+询问区间最大值

    这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...

  6. 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 ...

  7. HDU 1754 I Hate It 【线段树单点修改 维护区间最大值】

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others ...

  8. HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. HDU 1166 敌兵布阵 (线段树单点修改和区间和查询)

    Input 第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1 ...

随机推荐

  1. git之coding.net的使用

    先在Coding上创建个项目     现在是这样,我本地有个项目Project(/Users/huang/Desktop/Project),我想把它上传到刚创建的项目里,以后就用git代码托管.可我之 ...

  2. Docker最简单入门之(一)——介绍和配置Docker

    0. 前言 最近学完了Dokcer,特别记录一下,算是对自己学习成果的一个总结.以便自己能够更好的理解Docker.粗略估计了一下,我大概会分成4个部分,只记录一下常用的操作,至于一些比较难的操作或者 ...

  3. Kafka基本知识入门(一)

    1. 基础知识 有关RabbitMQ,RocketMQ,Kafka的区别这个网上很多,了解一下区别性能,分清什么场景使用.分布式环境下的消息中间件Kafka做的比较不错,在分布式环境下使用频繁,我也不 ...

  4. 转载 | Sublime text3 实用快捷键整理

    实用快捷键 Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件Ctrl+Shift+ ...

  5. Mermaid

    graph TD; A-->B; A-->C; B-->D; C-->D;

  6. 如何成为PHP程序员?

    当今,互联网的蓬勃发展,移动互联网的火热,以及国家提出的“互联网+”.这些趋势可以让我们明显的感觉到互联网的重要,不可替代.网站也是大家最早接触,最早认识的一种新事物.谈到网站,无非最长脸的莫过于PH ...

  7. 常见Http协议状态码

    收集常见的http协议状态码,供查阅!包括中文和英文对照. 中文版 1**:请求收到,继续处理 2**:操作成功收到,分析.接受 3**:完成此请求必须进一步处理 4**:请求包含一个错误语法或不能完 ...

  8. pythonday02基础与运算符

    今日概要 1.循环 2.字符串格式化 3.运算符 4.编码 if的嵌套 score = input('请输入成绩') score_int = int(score) if score_int >= ...

  9. let 、const 、var、function声明关键字的新理解

    今天在群里看到大佬们讨论let .const 的提升问题,有个大佬问  三种声明都在什么阶段提升?  什么阶段?这个真不清楚,以前是只知道let.const存在死区,没有变量提升,一下子就懵了 后经手 ...

  10. 为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】

    每篇一句 胡适:多谈些问题,少聊些主义 前言 Spring MVC和MyBatis作为当下最为流行的两个框架,大家平时开发中都在用.如果你往深了一步去思考,你应该会有这样的疑问: 在使用Spring ...