https://www.luogu.org/problem/P3071

AC代码:

https://www.luogu.org/blog/user33426/solution-p3071

莫名其妙RE:

#include<cstdio>
#include<iostream> using namespace std;
#define MAX 500005
#define lson o<<1
#define rson o<<1|1 int n,m,ans,cnt;
int addv[MAX];
struct node{
int lm, rm, xm;
//从左到右的最大空位置的数
//从右到左的
//整个的
}tr[MAX<<2]; inline int max(int x,int y) {
return x>y?x:y;
} void push_up(int o, int l, int r) {
tr[o].xm = max(max(tr[lson].xm , tr[rson].xm ), tr[lson].rm + tr[rson].lm );
int mid = (l+r)>>1;
if(tr[lson].xm == mid-l+1) tr[o].lm = tr[lson].xm + tr[rson].lm ;
else tr[o].lm = tr[lson].lm ;
if(tr[rson].xm == r-mid) tr[o].rm = tr[rson].xm + tr[lson].rm ;
else tr[o].rm = tr[rson].rm ;
}
void build(int o, int l, int r) {
if(l == r) {
tr[o].lm = tr[o].rm = tr[o].xm = 1;
return ;
}
int mid = (l+r)>>1;
build(lson, l, mid);
build(rson, mid+1, r);
push_up(o, l, r);
} void pushtag(int o) {
tr[o].lm = tr[o].rm = tr[o].xm = 0;
addv[o] = 1;
}
void push_down(int o, int l, int r) {
if(addv[o] == 0) return ;
int mid = (l+r)>>1;
tr[lson].lm = tr[lson].rm = tr[lson].xm = addv[o]>0 ? 0 : (mid-l+1); //-1为离开
tr[rson].lm = tr[rson].rm = tr[rson].xm = addv[o]>0 ? 0 : (r-mid); //1为坐下
addv[lson] = addv[rson] = addv[o];
addv[o] = 0;
return ;
} void insert(int o, int l, int r, int a, int op) {//op=1表示前a个改为1,即前a个坐下, op=2表示后a个改为1
// printf("%d %d %d %d %d", o, l, r, a, op);
// printf("\n");
if(a == 0) return ;
if(r-l+1 == a) {pushtag(o); return ;}
int mid = (l+r)>>1;
push_down(o, l, r);
if(op == 1) {
if(tr[lson].xm >= a) insert(lson, l, mid, a, 1);
else if(tr[lson].rm + tr[rson].lm >= a) {
insert(rson, mid+1, r, a-tr[lson].rm , 1); //这个顺序太莫名其妙了....
insert(lson, l, mid+1, tr[lson].rm , 2);//因为是从前往后,所以lson肯定是坐下tr[lson].r个
}
else insert(rson, mid+1, r, a, 1);//
} else {
if(tr[rson].xm >= a) insert(rson, mid+1, r, a, 2);
else if(tr[lson].rm + tr[rson].lm >= a){
insert(lson, l, mid, a-tr[rson].lm , 2);
insert(rson, mid+1, r, tr[rson].lm , 1);
}
else insert(lson, l, mid, a, 2);
}
push_up(o, l, r);
} void del(int o, int l, int r, int ql, int qr) {
if(qr<l||r<ql) return;
if(ql <= l && r <= qr) {
tr[o].lm = tr[o].rm = tr[o].xm = (r-l+1);
addv[o] = -1;
return ;
}
int mid = (l+r)>>1;
push_down(o, l, r);
del(lson, l, mid, ql, qr);
del(rson, mid+1, r, ql, qr);
push_up(o,l,r);
} int main() {
scanf("%d%d",&n,&m);
build(1, 1, n);
// int tmp;
// scanf("%d",&tmp);
// printf("o : %d, %d", tmp, tr[tmp].lm);
char cmd;
while(m--) {
cin>>cmd;
if(cmd == 'A') {
int a;
scanf("%d",&a);
if(tr[1].xm < a) ans++;
else insert(1, 1, n, a, 1);
} else {
int x, y;
scanf("%d%d",&x, &y);
del(1, 1, n, x, y);
}
}
printf("%d",ans);
}

luoguP3071 [USACO13JAN]座位Seating的更多相关文章

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

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

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

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

  3. [USACO13JAN] Seating

    https://www.luogu.org/problem/show?pid=3071 题目描述 To earn some extra money, the cows have opened a re ...

  4. 【vijos】1286 座位安排(状压dp)

    https://vijos.org/p/1286 这题好神不会捉... 首先我们知道所有情况有C(n*m, k)种,这个好搞.但是两两不相邻这个有点难搞.. 原来是状压dp..sigh. 设状态f[i ...

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

  6. CSU 1997: Seating Arrangement【构造】

    1997: Seating Arrangement Description Mr. Teacher老师班上一共有n个同学,编号为1到n. 在上课的时候Mr. Teacher要求同学们从左至右按1, 2 ...

  7. Seating Arrangement

    1997: Seating Arrangement Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 543     Solved:  ...

  8. 团体程序设计天梯赛-练习集L2-010. 排座位

    L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...

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

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

随机推荐

  1. 【转载】Java中的多线程超详细的总结

    引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...

  2. Python—图形界面开发

    https://blog.csdn.net/kun_dl/category_7418837.html https://www.runoob.com/python/python-gui-tkinter. ...

  3. Redis安装和基本操作

    Redis 简介Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 是属于非关系型数据库1.数据比模型较简单2.需要灵活性更强的IT系统3.对数据库性能 ...

  4. React中条件渲染

    17==> 条件渲染 state初始化一般写在构造器当中 CharShop.js如下 import React, { Component } from "react"; ex ...

  5. acwing 2 零一背包问题

    地址 https://www.acwing.com/problem/content/description/2/ 题目描述有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品 ...

  6. [学习笔记] Manacher与PAM

    \(1\) Manacher 挺短,背是挺好背的 Manacher用于求回文串长度.思想大概就是: 1.加入字符集之外的识别字符(比如#)分隔开原来相邻的字母,这样所有的回文串都变成了以某个字符为中心 ...

  7. PHP递归函数return返回null的问题

    前段时间在写递归函数的时候碰到个问题,返回值一直为null,这里记录一下. 写个小例子: /** * @param $i * @return mixed */ function recursion($ ...

  8. linux学习之Ubuntu

    查看自己的ubuntu版本,输入以下命令(我的都是在root用户下的,在普通用户要使用sudo)第一行的lsb是因为没有安装LSB,安装之后就不会出现这个东西.LSB(Linux Standards ...

  9. Java8 Stream新特性详解及实战

    Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...

  10. 打开excel打印时报“不能使用对象链接和嵌入”

    解决思路: 1.以WIN + R 打开命令行, 在命令行中输入dcomcnfg,打开组件服务. 2.在组件服务窗口中,点击到[控制根节点]->[组件服务]->[计算机]->[我的电脑 ...