BZOJ3226 SDOI2008 校門外的區間

2022-05-16 02:36:11 字數 2549 閱讀 2952

【sdoi2008】校門外的區間

time limit: 10 sec

memory limit: 128 mb

description

受校門外的樹這道經典問題的啟發,a君根據基本的離散數學的知識,抽象出5種運算維護集合s(s初始為空)並最終輸出s。現在,請你完成這道校門外的樹之難度增強版——校門外的區間。

5種運算如下:

u t -> s∪t

i t -> s∩t

d t -> s-t

c t -> t-s

s t -> s⊕t

基本集合運算如下:

a∪b

a∩b

a-b

a⊕b (a-b)∪(b-a)

input

輸入共m行。

每行的格式為x t,用乙個空格隔開,x表示運算的種類,t為乙個區間(區間用(a,b), (a,b], [a,b), [a,b]表示)。

output

共一行,即集合s,每個區間後面帶乙個空格。若s為空則輸出"empty set"。

sample input

u [1,5]

d [3,3]

s [2,4]

c (1,5)

i (2,3]

sample output

(2,3)

hint

對於 100% 的資料,0≤a≤b≤65535,1≤m≤70000

標籤:線段樹

假設只有閉區間,對於每個數,標記其為1還是0。

四種運算對應如下(modify為區間修改,reverse為區間取反):

$u a,b => modify(a, b, 1)$

$d a,b => modify(a, b, 0)$

$s a,b => reverse(a, b)$

$c a,b => modify(0, a-1, 0), modify(b+1, n, 0), reverse(a, b)$

$i a,b => modify(0, a-1, 0), modify(b+1, n, 0)$

再考慮加入開區間,開區間看作對應$.5$的閉區間。即將(4, 7)看作[4.5, 6.5]。

為了存$.5$的小數,我們將所有區間均乘2,即(4, 7)變為[9, 13]。

又考慮到有0的區間,因而對於所有區間兩端點再加2,即(4,7)變為[11, 15]。

最後用線段樹維護即可。

對於輸出,$o(nlog(n))$掃一遍,找出每個數是1還是0,然後合併區間,雙指標跑。

本題細節較多,寫的時候得小心。

附上ac**:

#include #include #define n (65536*2+1)

using namespace std;

struct node tr[n*4+500];

void build(int v, int s, int t)

void downtag(int v, int s, int t)

if (~tr[v].tag) tr[v<<1].tag = tr[v<<1|1].tag = tr[v].tag, tr[v<<1].rev = tr[v<<1|1].rev = 0;

tr[v<<1].rev ^= tr[v].rev, tr[v<<1|1].rev ^= tr[v].rev; tr[v].tag = -1, tr[v].rev = 0;

}int query(int v, int s, int t, int p)

void modify(int v, int s, int t, int l, int r, int x)

int mid = s+t>>1;

if (l <= mid) modify(v<<1, s, mid, l, r, x);

if (r >= mid+1) modify(v<<1|1, mid+1, t, l, r, x);

}void reverse(int v, int s, int t, int l, int r)

int mid = s+t>>1;

if (l <= mid) reverse(v<<1, s, mid, l, r);

if (r >= mid+1) reverse(v<<1|1, mid+1, t, l, r);

}int main()

int st = -1, en = -1; bool flag = false;

for (int i = 1; i <= n; i++) else

st = en = -1;

} }if (!flag) printf("empty set");

return 0;

}

Bzoj 2726 SDOI 任務安排

memory limit 131072kb 64bit io format lld llu description 機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工...

BZOJ 3991 SDOI2015 尋寶遊戲

題目大意 給定一棵樹,其中有若干個關鍵點,任意選擇起點,求從起點出發訪問所有關鍵點又回到起點的最小邊權總和,有m個修改操作,每次修改乙個關鍵點。假如沒有修改操作的話,就像乙個簡單的樹形dp,方程如下 f i sigma sigma.觀察一下dp的過程,就是不斷地從前面的點走到後面的點,所以我們可以不...

SDOI2013 BZOJ3203 保護出題人

description input 第一行兩個空格隔開的正整數n和d,分別表示關數和相鄰殭屍間的距離。接下來n行每行兩個空格隔開的正整數,第i 1行為ai和 xi,分別表示相比上一關在殭屍佇列排頭增加血量為ai 點的殭屍,排頭殭屍從距離房子xi公尺處開始接近。output 乙個數,n關植物攻擊力的最...