2023年8月16日提高組T3 旅館

2021-08-07 02:46:12 字數 2350 閱讀 4410

有一間旅館,旅館內有n間排成一排的房間,一開始全為空。現在有m個要求:

1 d表示詢問旅館內是否有連續d間空房間,有的話則輸出最小的乙個r,滿足從r開始連續d間房間均為空,同時會有人入住這d間房。若無法被滿足,則輸出0.

2 l r表示把[l,r]內的房間全部設為空。

第一行兩個整數n,m.

接下來m行,每行描述乙個操作。

對於每乙個1操作,輸出一行表示答案。

【資料規模與約定】

對於30%的資料,n,m<=1000

對於100%的資料,n,m<=50000,d,l,r<=n

by bpm

線段樹區間合併

考慮用llen、rlen、len分別記錄區間左起最長連續0、右起最長連續0、最長連續0,查詢的時候優先查詢左子樹即可。合併的時候分情況討論一下就行了。

心疼基哥500行+程式wa了

#include #include 

#include #include #include #include #define rep(i, st, ed) for (int i = st; i <= ed; i += 1)

#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)

#define erg(i, st) for (int i = ls[st]; i; i = e[i].next)

#define fill(x, t) memset(x, t, sizeof(x))

#define max(x, y) (x)>(y)?(x):(y)

#define min(x, y) (x)<(y)?(x):(y)

#define ll long long

#define db double

#define inf 0x3f3f3f3f

#define n 100001

struct treenodet[n << 2 | 1];

inline int read()

while (ch<='9'&&ch>='0')

return x*v;

}inline void pushdown(int

now) else

if (t[now].lazy == 2)

}inline void pushup(int

now) else

if (t[now

<< 1 | 1].r - t[now

<< 1 | 1].l + 1 == t[now

<< 1 | 1].rlen)else

t[now].len = max(t[now

<< 1].rlen + t[now

<< 1 | 1].llen, max(t[now

<< 1].len, t[now

<< 1 | 1].len));

}inline int query(int

now, int d) else

if (t[now

<< 1].len >= d) else

if (t[now

<< 1].rlen + t[now

<< 1 | 1].llen >= d) else

}inline void modify(int

now, int l, int r)

intmid = (t[now].l + t[now].r) >> 1;

if (r <= mid) else

if (l > mid) else

pushup(now);

}inline void clear(int

now, int l, int r)

intmid = (t[now].l + t[now].r) >> 1;

if (r <= mid) else

if (l > mid) else

pushup(now);

}inline void build(int

now, int l, int r) ;

if (l == r)

intmid = (t[now].l + t[now].r) >> 1;

build(now

<< 1, l, mid);

build(now

<< 1 | 1, mid + 1, r);

}int main(void)

int pos = query(1, d); modify(1, pos, pos + d - 1);

printf("%d\n", pos);

} else

if (opt == 2)

}return 0;

}

2023年8月7日提高組T3 選數

給出n個數a i 現在可以在其中任意選出若干個數,問有多少種選擇方案,使得這幾個數可以分成兩個和相等的集合。第一行是乙個正整數n,第二行每行n個正整數。輸出乙個數,表示方案數。對於30 的資料,n 10.對於100 的資料,n 20,a i 100000000.by bpm 略難每個數字前可以填1 ...

2023年8月10號提高組T3 樹

給你一棵大小為n的有根樹,每個點有點權,要求完成以下操作 v x y把點x的權值變成y e x把有根樹的根變為x q x查詢點x的子樹的最小值 第一行兩個整數n,m,表示點數和運算元。接下來n行,每行兩個數f,v,第i行的兩個數表示i的父親和i的權值,且保證f接下來m行,每行表示乙個操作。對於每個q...

2023年9月16日提高組T2 A

description 為了加快社會主義現代化,建設學校,小明決定給學校裡每台電腦都連上網際網路,方便未來隨時隨地玩耍。他的電腦室很大,有n 臺電腦,但地理位置偏僻,網路訊號很差。一台電腦有網,當且僅當滿足以下至少乙個條件 1 給中國移動交寬頻費,直接連網,花費為a。2 向另外一台有網的電腦,安裝共...