題解 P6587 超超的序列 加強

2022-05-22 16:33:11 字數 1279 閱讀 1556

\(\large\texttt\)

思維題 + 板子題

這道題目蠻有趣的,但坑有點多,在下面會陳述。

不做贅述。

注意出題人十分噁心地沒給 \(x\),\(y\),\(n\) 的關係,請各位注意這點。

看似很難維護,區間操作,但是我們可以利用 \(\texttt\) 的特性來造一棵不同尋常的線段樹。

對於序列上的數的位置 \(i\) ,模 \(2^x\) 後,留下 \(x\) 位字尾,對比所有 \(i\) 模\(2^\) 後留下的字尾,只是增加了第 \(x\) 位( \(0\) 或 \(1\) )。

因此我們可以把序列按這樣構造一棵線段樹,每個節點由父親節點延伸出來,兩個子節點的字尾相同,唯一區別最高位是 \(0\) 或 \(1\)。

???這不就是 \(\texttt\) 嗎 ???

所以,這道題目的本意就是讓你建一棵支援區間修改和查詢的 \(\texttt\) ,按照線段樹1的板子做就好了。

問題解決。

然後我wa了30+發

一定要注意三點:

還有一些細節在**中

#include using namespace std;

#define ls n << 1

#define rs n << 1 | 1

#define int long long

const int n = 5e7;

inline int read()

int a,b,s[n+10],sum[n+10],lazy[n+10],t[n+10];

inline void up(int n)

inline void down(int n)

inline void insert(int n,int k,int p,int q)

if(k&1ll) insert(rs,k>>1ll,p,q-1);

else insert(ls,k>>1ll,p,q-1);

up(n);

}inline void change(int n,int k,int p,int q)

down(n);

if(k&1ll) change(rs,k>>1ll,p,q-1);

else change(ls,k>>1ll,p,q-1);

up(n);

}inline int query(int n,int k,int q)

signed main()

else

}return 0;

}

DIAMOND 超快的蛋白序列比對軟體

相見恨晚,還好遇到了它 今天用blastx將我的轉錄本序列在uniprot蛋白資料庫 700w條序列 中搜尋,80個執行緒,過了1小時大概就分析1000條吧。實在是有點慢,於是我想到之前耳聞的diamond,據說速度非常快,於是我測試了下。沒想到,這工具居然那麼快。根據diamond介紹,它有以下特...

NOIP2013花匠超多方法的題解

原題見洛谷 首先介紹一種我在做題的時候學到的一種空間複雜度為o 1 的解法 首先使用f1,f2分別記錄兩種不同的序列。就是一種為兩邊高中間低和一種為中間高兩邊低的序列。f1,f2的初始值都設成1 我們可以易證選擇了1第一盆其結果一定不會變差 手動滑稽 用x來記錄上一盆,h來記錄當前盆滿足一下幾個條件...

題解洛谷 P2659 美麗的序列

看到題解區基本全是單調棧,我來乙個不同的思路 用並查集來貪心。這是乙個比較經典的 trick,常用來批量處理一條鏈 一棵樹上路徑的最大或最小值問題,大致的思路是按順序列舉每一條邊,並查集維護連通塊來算貢獻。具體到本題,我們可以把數列抽象成一條 n 1 點 n 邊的鏈,i 與 i 1 之間的邊權為 a...