洛谷P4891 序列(勢能線段樹)

2022-03-19 20:28:15 字數 1043 閱讀 7850

洛谷題目傳送門

考場上一眼看出這是個毒瘤線段樹準備槓題,發現實在太難調了,被各路神犇虐哭qwq

考後看到各種優雅的暴力ac。。。。。。寶寶心裡苦qwq

題面裡面是一堆亂七八糟的限制和性質,這時候需要冷靜想想有沒有可利用的地方。蒟蒻一開始往勢能線段樹上面想了想。

定義乙個全局勢能函式,為所有\(c_i的位置個數。注意兩個操作的修改都不會小於原來的數。

乙個是改\(b\),是單點修改,線段樹內跳\(\log\)層,勢能函式至多加\(1\)。

修改b就比較輕鬆,只要找到對應的葉子節點改完後一路回溯即可。

很多事都是說起來容易做起來難,這題也不例外。除錯幾乎花了整個晚上。要注意的細節很多,也只好自己仔細思考了。

時間複雜度\(o(n\log n+q\log^2n)\),上界很鬆。多出來的\(\log\)是區間改a時需要快速冪更新pa造成的。

跑了不到200ms,比什麼樹套樹、分塊還是要好看一點,但是被暴力碾壓也是有點無奈啊~

#include#define rg register

#define r rg int

#define i inline

#define g if(++ip==ie)fread(ip=buf,1,n,stdin)

using namespace std;

typedef long long ll;

const ll n=1<<18,yl=1e9+7;

char buf[n],*ie=buf+n,*ip=ie-1;

int y,a[n];

i int in()

return x;

}i ll qpow(rg ll b,r k)

struct node

i void dn()

}i void build(r s,r e)

i void upda()

i void updb(r s)

i void bound(r s)

};int main()

return 0;

}

洛谷 P1645 序列

炒雞明顯的貪心題,主要就想讓一段區間與另一段裡面重合的數越多越好。於是先按照區間右端排序,然後盡可能的把數都往右靠攏,最後與另一段區間的前面的重合。然後可以用個flag來記錄哪些數被選了什麼的。include includeusing namespace std const int maxn 100...

洛谷 P1631 序列合併

題目描述 有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2個和,求這n 2個和中最小的n個。輸入輸出格式 輸入格式 第一行乙個正整數n 第二行n個整數ai,滿足ai ai 1且ai 10 9 第三行n個整數bi,滿足bi bi 1且bi 10 9.資料規模 對於50 的資料中,滿...

洛谷 P1631 序列合併

有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2個和,求這n 2個和中最小的n個。第一行乙個正整數n 第二行n個整數ai,滿足ai ai 1且ai 10 9 第三行n個整數bi,滿足bi bi 1且bi 10 9.輸出僅一行,包含n個整數,從小到大輸出這n個最小的和,相鄰數字之間...