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. Shell—各种括号的用法

    括号的种类 小括号,圆括号 ( ) 中括号,方括号 [ ] 大括号.花括号 { } 一.单小括号 () 1.另开命令组——小括号中的命令将会新开启一个子shell独立顺序运行,所以括号中的变量不能够被 ...

  2. go语言设计模式之Concurrency workers pool

    worker.go package main import ( "fmt" "strings" ) type WorkerLauncher interface ...

  3. go语言设计模式之Concurrency barrier

    barrier.go package barrier import ( "fmt" "io/ioutil" "net/http" " ...

  4. vmware workstations 虚拟机安装CentOS

    1.下载vmware ,我的版本是从上学时保存网盘的,版本比较低,链接如下: 链接:https://pan.baidu.com/s/19QP0q8xmPWIPn-rziPTvKg 提取码:lvh9 2 ...

  5. LG1345 「USACO5.4」Telecowmunication 最小割

    问题描述 LG1345 题解 点边转化,最小割,完事. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; tem ...

  6. SQL查询--关于查询的练习题

    下面的练习题出自LeetCode:https://leetcode-cn.com/problemset/database/,有兴趣的可以去上面刷刷题 练习题1:超过经理收入的员工  分析: 使用sql ...

  7. thinkphp5.1单模块设置

    thinkphp5.1单模块 1. // 是否支持多模块'app_multi_module' => false, // 自动搜索控制器'controller_auto_search' => ...

  8. Java字符串面试问答

    字符串是使用最广泛的Java的类之一.在这里,我列出了一些重要的Java的字符串面试问答. 这将有助于您全面了解String并解决面试中与String有关的任何问题. Java基础面试问题 Java中 ...

  9. Python的互斥锁与信号量

    并发与锁 a. 多个线程共享数据的时候,如果数据不进行保护,那么可能出现数据不一致现象,使用锁,信号量.条件锁 b. c.互斥锁1. 互斥锁,是使用一把锁把代码保护起来,以牺牲性能换取代码的安全性,那 ...

  10. EventBus 使用/架构/源码分析

    EventBus是针对Android优化的发布-订阅事件总线,简化了Android组件间的通信.EventBus以其简单易懂.优雅.开销小等优点而备受欢迎. github 地址:https://git ...