https://www.luogu.org/problem/show?pid=3071

题目描述

To earn some extra money, the cows have opened a restaurant in their barn specializing in milkshakes. The restaurant has N seats (1 <= N <= 500,000) in a row. Initially, they are all empty.

Throughout the day, there are M different events that happen in sequence at the restaurant (1 <= M <= 300,000). The two types of events that can happen are:

  1. A party of size p arrives (1 <= p <= N). Bessie wants to seat the party in a contiguous block of p empty seats. If this is possible, she does so in the lowest position possible in the list of seats. If it is impossible, the party is turned away.

  2. A range [a,b] is given (1 <= a <= b <= N), and everybody in that range of seats leaves.

Please help Bessie count the total number of parties that are turned away over the course of the day.

有一排n个座位,m次操作。A操作:将a名客人安置到最左的连续a个空位中,没有则不操作。L操作:[a,b]的客人离开。

求A操作的失败次数。

输入输出格式

输入格式:

  • Line 1: Two space-separated integers, N and M.

  • Lines 2..M+1: Each line describes a single event. It is either a line of the form "A p" (meaning a party of size p arrives) or "L a b" (meaning that all cows in the range [a, b] leave).

输出格式:

  • Line 1: The number of parties that are turned away.

输入输出样例

输入样例#1:

10 4
A 6
L 2 4
A 5
A 2
输出样例#1:

1 

线段树
实践再次证明:数组比结构体要快
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,x,y,opl,opr;
#define N 500001*4
int maxx[N],max_l[N],max_r[N],sum[N],flag[N];
void build(int k,int l,int r)
{
sum[k]=maxx[k]=max_l[k]=max_r[k]=r-l+;
if(l==r) return;
int mid=l+r>>;
build(k<<,l,mid);build((k<<)+,mid+,r);
}
void down(int k)
{
flag[k<<]=flag[(k<<)+]=flag[k];
if(flag[k]==)
maxx[k<<]=max_l[k<<]=max_r[k<<]=maxx[(k<<)+]=max_l[(k<<)+]=max_r[(k<<)+]=;
else
{
maxx[k<<]=max_l[k<<]=max_r[k<<]=sum[k<<];
maxx[(k<<)+]=max_l[(k<<)+]=max_r[(k<<)+]=sum[(k<<)+];
}
flag[k]=;
}
int ask(int k,int l,int r)
{
if(l==r) return l;
if(flag[k]) down(k);
int mid=l+r>>;
if(maxx[k<<]>=x) return ask(k<<,l,mid);
if(max_l[(k<<)+]+max_r[k<<]>=x) return mid-max_r[k<<]+;
return ask((k<<)+,mid+,r);
}
void up(int k)
{
maxx[k]=max(max(maxx[k<<],maxx[(k<<)+]),max_r[k<<]+max_l[(k<<)+]);
if(sum[k<<]==maxx[k<<]) max_l[k]=sum[k<<]+max_l[(k<<)+];
else max_l[k]=max_l[k<<];
if(sum[(k<<)+]==maxx[(k<<)+]) max_r[k]=sum[(k<<)+]+max_r[k<<];
else max_r[k]=max_r[(k<<)+];
}
void change(int k,int f,int l,int r)
{
if(l>=opl&&r<=opr)
{
if(f==)
{
maxx[k]=max_l[k]=max_r[k]=;
flag[k]=;
return;
}
else
{
maxx[k]=max_l[k]=max_r[k]=sum[k];
flag[k]=;
return;
}
}
if(flag[k]) down(k);
int mid=l+r>>;
if(opr<=mid) change(k<<,f,l,mid);
else if(opl>mid) change((k<<)+,f,mid+,r);
else
{
change(k<<,f,l,mid);
change((k<<)+,f,mid+,r);
}
up(k);
}
void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
}
int main()
{
int cnt=;
char p[];
read(n); read(m);
build(,,n);
for(int i=;i<=m;i++)
{
scanf("%s",p);
if(p[]=='A')
{
read(x);
if(maxx[]<x) cnt++;
else
{
opl=ask(,,n);
opr=opl+x-;
change(,,,n);
}
}
else
{
read(opl); read(opr);
change(,,,n);
}
}
printf("%d",cnt);
}

[USACO13JAN] Seating的更多相关文章

  1. 洛谷 P3071 [USACO13JAN]座位Seating(线段树)

    P3071 [USACO13JAN]座位Seating 题目链接 思路: 一开始把题给读错了浪费了好多时间呜呜呜. 因为第二个撤离操作是区间修改,所以我们可以想到用线段树来做.对于第一个操作,我们只需 ...

  2. luoguP3071 [USACO13JAN]座位Seating

    https://www.luogu.org/problem/P3071 AC代码: https://www.luogu.org/blog/user33426/solution-p3071 莫名其妙RE ...

  3. 洛谷 P3071 [USACO13JAN]座位Seating-线段树区间合并(判断找,只需要最大前缀和最大后缀)+分治+贪心

    P3071 [USACO13JAN]座位Seating 题目描述 To earn some extra money, the cows have opened a restaurant in thei ...

  4. Co-prime Array&&Seating On Bus(两道水题)

     Co-prime Array Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Su ...

  5. [luogu P2205] [USACO13JAN]画栅栏Painting the Fence

    [luogu P2205] [USACO13JAN]画栅栏Painting the Fence 题目描述 Farmer John has devised a brilliant method to p ...

  6. Educational Codeforces Round 11 B. Seating On Bus 水题

    B. Seating On Bus 题目连接: http://www.codeforces.com/contest/660/problem/B Description Consider 2n rows ...

  7. Educational Codeforces Round 11B. Seating On Bus 模拟

    地址:http://codeforces.com/contest/660/problem/B 题目: B. Seating On Bus time limit per test 1 second me ...

  8. 洛谷P2202 [USACO13JAN]方块重叠Square Overlap

    P2202 [USACO13JAN]方块重叠Square Overlap 题目描述 Farmer John is planning to build N (2 <= N <= 50,000 ...

  9. 洛谷P3068 [USACO13JAN]派对邀请函Party Invitations

    P3068 [USACO13JAN]派对邀请函Party Invitations 题目描述 Farmer John is throwing a party and wants to invite so ...

随机推荐

  1. 【CJOJ2484】【Luogu2805】最小函数值(函数最小值)

    题面 Description 有n个函数,分别为F1,F2,...,Fn.定义 Fi(x)=Aix2+Bix+Ci(x∈N∗)Fi(x)=Aix2+Bix+Ci(x∈N∗) .给定这些Ai.Bi和Ci ...

  2. [BZOJ1041] [HAOI2008] 圆上的整点 (数学)

    Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...

  3. error:安装手电筒程序后在打开程序后报错:你的camera flashlight正在被其他程序占据

    Q:没打开权限 A:设置里面,把这个app的camera权限打开就行了

  4. JAVA线程sleep和wait方法区别

    一. sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁.由于没有释放对象锁,所以不能 ...

  5. jquery pjax 用法总结

    以前我们点击a链接的时候总是会刷新整个页面并跳转到新页面,中间可以很明显的看到短暂的白屏.pjax就很好的解决了这问题. pjax的原理很简单,就是发送一个ajax请求,获取html代码,再把相关代码 ...

  6. php后台开源框架

    1,OneBase 官网首页:https://onebase.org 后台演示:https://demo.onebase.org/admin.php 接口演示:https://demo.onebase ...

  7. 优先级队列用法详解(priority_queue)

    由于优先级队列的内部数据结构为 堆,所以这里先介绍堆的一些操作. 堆的一些函数操作在algorithm头文件中 //在[first, last)范围内构造最大堆,first,last 可以是vecto ...

  8. Mecanim之IK动画

    序言:IK动画全名是Inverse Kinematics 意思是逆向动力学,就是子骨骼节点带动父骨骼节点运动. 比如体操运动员,只靠手来带动身体各个部位的移动.手就是子骨骼,身体就是它的父骨骼,这时运 ...

  9. AngularJs的resource服务与Rest服务交互

    前言以后补: * 在使用resource服务返回的资源对象后具有与后台数据交互的五大接口:save query delete remove get 五种默认行为: { "get": ...

  10. 笔记:Spring Cloud Feign Ribbon 配置

    由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...