題目一:給出乙個長為 n 的數列,以及 n個操作,操作涉及區間加法,詢問區間內小於某個值 x的元素個數。
分析 :將數列分成sqrt(n)塊,每塊維護乙個懶惰標記、乙個有序表(vector實現)即可。
操作的時候,先暴力處理左右兩端不完整的塊,再處理中間完整的塊,注意懶惰標記的釋放。
區間加法o(√n),詢問區間內小於某個值 x的元素個數o(√n*log√n)
**:
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #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 #include8 #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.設計資料結構和演算法,...