兩個分塊題

2022-08-02 11:06:07 字數 2184 閱讀 4983

題目一:給出乙個長為 n 的數列,以及 n個操作,操作涉及區間加法,詢問區間內小於某個值 x的元素個數。

分析  :將數列分成sqrt(n)塊,每塊維護乙個懶惰標記、乙個有序表(vector實現)即可。

操作的時候,先暴力處理左右兩端不完整的塊,再處理中間完整的塊,注意懶惰標記的釋放。

區間加法o(√n),詢問區間內小於某個值 x的元素個數o(√n*log√n)

**:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include

8 #include9 #include10 #include

11 #include12

#define n 100005

13using

namespace

std;

14 typedef long

long

ll;15

inta[n],b[n];

16int mark[505

];17 vectorvt[505

];18

intn,blo;

19void resort(int

x)20

26int

main()

2738

for(int i=1;i<=b[n];i++)

3942

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

4355

if(b[l]!=b[r])

5661}62

else

if(op==1

)63

7273

if(b[l]!=b[r])

7478 printf("

%d\n

",num);79}

80}

81return0;

82 }

題目二:給出乙個長為 n的數列,以及 n個操作,操作涉及單點插入,單點詢問,資料隨機生成。

分析 :將數列分成sqrt(n)塊,每塊維護乙個鍊錶。由於單點插入會使原來的編號發生改變,所以每塊還需維護好該塊的區間(l,r)。

查詢的時候先遍歷找到屬於哪個塊,再在塊中遍歷即可,單次o(√n)。

一直插入操作可能使某個塊過長,這時需要將其切成兩個塊(重構)

**:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include

8 #include9 #include10 #include

11 #include12 #include13

#define n 100005

14using

namespace

std;

15 typedef long

long

ll;16

inta[n];

1718 typedef struct

nodenode;

22 listhead(405

);23

intmain()

2440 p++; 41}

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

4354

int tot=0

;55 list::iterator p2=p->lt.begin();

56while(p2!=p->lt.end())

5759 p2++;

60 tot++;61}

62 p->r+=1

;63 p++;

64for(;p!=head.end();p++)

6568}69

else

if(op==1)70

77int tot=0

;78 list::iterator p2=p->lt.begin();

79while(p2!=p->lt.end())

8082 p2++;

83 tot++;84}

85}868788}

8990

return0;

91 }

兩個邏輯題

近期遇到兩個邏輯題,感覺有點好玩,發上來以作記錄。1 給定9個球,其中乙個質量比其他8個球要輕 或者重 給定乙個天平,問最少幾次可以把這個輕球找出來。2 給定一組大小長短不一的樂高積木,以及乙個天平,如何把這組樂高積木按照重量從輕到重排列出來。第一題,只要把9個球分成3組,兩組先比較,重量輕的一組,...

兩個推理題

一 5位運動員參加了10公尺臺跳水比賽,有人讓他們 比賽結果 a選手說 b第二,我第三 b選手說 我第二,e第四 c選手說 我第一,d第二 d選手說 c最後,我第三 e選手說 我第四,a第一 比賽結束後,每位選手都說對了一半,請程式設計確定比賽的名次。首先的判斷條件為名次,名次為1 5 在通過題目中...

討論兩個演算法題

以下兩個問題假設自ram模型。在該模型下,我們可以在常量時間內執行兩個o log n 位整數的邏輯和算術運算,並且還可以在常量時間內讀取 寫入任何記憶體位址的連續o logn 位。問題一 給定隨機0 1序列b 0,n 1 即對於0 i n 1,b i 0或1。求解以下問題 1.設計資料結構和演算法,...