題解 NOI2017整數 線段樹

2022-06-01 09:21:07 字數 2631 閱讀 8749

在人類智慧型的山巔,有著一台字長為10485761048576位(此數字與解題無關)的超級計算機,著名理論計算機科

學家p博士正用它進行各種研究。不幸的是,這天颱風切斷了電力系統,超級計算機

無法工作,而 p 博士明天就要交實驗結果了,只好求助於學過oi的你. . . . . .

p 博士將他的計算任務抽象為對乙個整數的操作。

具體來說,有乙個整數xx,一開始為00。

接下來有nn個操作,每個操作都是以下兩種型別中的一種:

保證在任何時候,x\geqslant 0x⩾0。

輸入格式:

輸入的第一行包含四個正整數n,t_1,t_2,t_3n,t1​,t2​,t3​,nn的含義見題目描述,t_1t1​,t_2t2​,t_3t3​的具體含義見子任務。

接下來nn行,每行給出乙個操作,具體格式和含義見題目描述。

同一行輸入的相鄰兩個元素之間,用恰好乙個空格隔開。

輸出格式:

對於每個詢問操作,輸出一行,表示該詢問的答案(00或11)。對於加法操作,沒有任何輸出。

輸入樣例#1: 複製

10 3 1 2

1 100 0

1 2333 0

1 -233 0

2 52 7

2 15

1 5 15

2 15

1 -1 12

2 15

輸出樣例#1: 複製

010

10

在所有測試點中,1\leqslant t_1 \leqslant 3, 1 \leqslant t_2 \leqslant 4, 1 \leqslant t_3 \leqslant 21⩽t1​⩽3,1⩽t2​⩽4,1⩽t3​⩽2。不同的 t_1, t_2, t_3t1​,t2​,t3​對應的特殊限制如下:

本題共 25 個測試點,每個測試點 4 分。各個測試點的資料範圍如下:

我們可以把二進位制整數每30位壓在乙個int裡面,然後進行加的操作時就是找到連續1後面的第乙個0,再區間把1改成0,把第乙個0改成1,

可以用區間or和區間and找出0,1的位置,並且可用線段樹維護

(慶祝通過noip2018第三題)

#include

2#define n 1000005 

3using

namespace

std;

4const

int inf=(1

<<30)-1;

5const

int m=1000000;

6struct

nodetree[n*4];

9int n,t,a,b,res,op,x,pos,loc;

10void

read

()15

void

add(int p,int l,int r,int v) 20

void

pushdown

(int p,int l,int r,int mid)

26int

query_ans

(int p,int l,int r,int x) 36

intfind0

(int p,int l,int r,int x)

else

46        res=find0(p<<1|1,mid+1,r,x);

47return res; 

48}49

intfind1

(int p,int l,int r,int x)

else

59        res=find1(p<<1|1,mid+1,r,x);

60return res;

61}62

void

modify

(int p,int l,int r,int x,int y,int v)

67int mid=l+r >> 1;

68if (l>r||l>y||rreturn;

69    pushdown(p,l,r,mid);

70if (x<=mid) modify(p<<1,l,mid,x,y,v);

71if (y>mid) modify(p<<1|1,mid+1,r,x,y,v);

72    tree[p].and=tree[p<<1].and&tree[p<<1|1].and;

73    tree[p].or=tree[p<<1].or|tree[p<<1|1].or;

74}75

76void

inc(int num,int pos)

else

85        modify(1,0,m,pos,pos,res);

86}87

void

dec(int num,int pos)

else

96        modify(1,0,m,pos,pos,res);

97}98

void

solve

() else 

112        } else 

117    }

118}

119signed

main() 

noi2017 整數 線段樹or模擬

orzyyb 題目大意 你需要維護乙個有 3 times 10 7 個二進位制位的數,有一種修改方式和一種詢問方式 對這個數加上 a times2 b 其中 a 10 9 b 3 times 10 7 保證需要維護的這個數始終非負 詢問這個數第k個二進位制位的值 總共有 10 6 次詢問 修改操作 ...

noi2017 整數 線段樹or模擬

orzyyb 題目大意 你需要維護乙個有 3 times 10 7 個二進位制位的數,有一種修改方式和一種詢問方式 對這個數加上 a times2 b 其中 a 10 9 b 3 times 10 7 保證需要維護的這個數始終非負 詢問這個數第k個二進位制位的值 總共有 10 6 次詢問 修改操作 ...

NOI2017模擬4 2 查詢 線段樹

給出若干條線段,用 x1,y1 x2,y2 表示其兩端點座標,現在要求支援兩種操作 0 x1 y1 x2 y2 表示加入一條新的線段,x1,y1 x2,y2 1 x0 詢問所有線段中,x座標在x0處的最高點的y座標是什麼,如果對應位置沒有線段,則輸出0。o nlog 2n 的 include inc...