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. Ubuntu+VMWare 学习中遇到的问题

    1. 虚拟机中Ubuntu分辨率 / 设置分辨率出现Unknown Display VMware中Ubuntu 出现Unknown Display问题解决 1.1 命令无法保存分辨率设置: xrand ...

  2. logback使用配置

    一:logback.xml配置内容如下 <?xml version="1.0" encoding="UTF-8"?> <!-- Copyrig ...

  3. Mac OS 安装mysqlclient 遇到的坑~

    最近在学习Python, 因为Django连接mysql 需要安装mysqlclient, 但Mac安装遇到各种问题,这里记录一下,避免以后再踩坑. 1.   正常情况下,安装mysqlclient ...

  4. C# 10分钟完成百度语音技术(语音识别与合成)——入门篇

    我们已经讲了人脸识别(入门+进阶).图片识别(入门).下面是链接: C# 10分钟完成百度人脸识别——入门篇 C# 30分钟完成百度人脸识别——进阶篇(文末附源码) C# 10分钟完成百度图片提取文字 ...

  5. 【故障公告】发布 .NET Core 版博客站点引起大量 500 错误

    非常抱歉,今天上午的博客站点故障给大家带来了很大的麻烦,请大家谅解.这次故障是我们发布 .NET Core 版博客站点引起的,虽然我们进行了充分的准备,但还是低估了高并发下的复杂问题. 以下是故障背景 ...

  6. python_0基础学习_day02

    第二节 一,while while也称为无限循环.死循环 while 条件: 缩进 循环体 应用领域:音乐播放:单曲循环,列表循环,随机播放(也是有规律的) 登陆界面:…… 数学计算:1~100的和, ...

  7. php cmd命令行 导入 与备份

  8. Django Mysql数据库-聚合查询与分组查询

    一.聚合查询与分组查询(很重要!!!) 聚合查询:aggregate(*args, **kwargs),只对一个组进行聚合 from django.db.models import Avg,Sum,C ...

  9. spring-boot-plus后台快速开发脚手架之代码生成器使用(十)

    spring-boot-plus 代码生成 Generator 代码生成内容 spring-boot-plus在mybatis-plus基础上,新增param/vo等模板 拓展controller/s ...

  10. 实时计算大数据处理的基石-Google Dataflow

    ​ 此文选自Google大神Tyler Akidau的另一篇文章:Streaming 102: The world beyond batch ​ 欢迎回来!如果您错过了我以前的帖子,Streaming ...