校賽F 比比誰更快 線段樹)

2021-08-20 19:20:43 字數 2396 閱讀 4747

題意:給你乙個字串,各兩個操作:

ch=0,[l,r]降序

ch=1,[l,r]公升序

如果是newer的話,應該會想用暴力,直接對區間sort,但是很明顯是超時的(校賽怎麼會這麼簡單呢!)

很容易想到線段數,對於線段數,我們可以先理清一下知識點,線段樹大概有三種操作:

- 單點更新

- 區間更新

- rmq

顯然這裡要用區間更新的操作。

區間更新有三大操作:

build()建樹

update()更新

query()求和

sum[4*n]儲存線段數節點

但是一般的區間更新的線段數是區間加或者區間減等統一的操作,所以對於區間排序需要對區間查詢模板更改一下。

sum[4*n][26]來儲存線段數節點

setv[4*n]來儲存當前區間覆蓋的字母

cnt[26]表示每個字母在當前區間出現的次數

下面以樣例「abacdabcda」為例進行闡述:

首先是建樹過程:

這一部分計算出sum[4n][26]和setv[4n]的值

其次,對於每乙個查詢,「l,r,ch」

都要用query(int rt,int l,int r,int l,int r,int i)計算[l,r]區間cnt[i]的值。

最後一步,對於每乙個查詢」l,r,ch」

根據ch的值:

做update(int rt,int l,int r,int l,int r,int i)

如果ch=0,對[l,r]降序

做法是:對cnt[i]陣列從25->0 遍歷,若cnt[i]>0,表示這個字元存在,且個數為cnt[i]個

所以要把[l,l+cnt[i]]個位置都要修改為cnt[i]對應的字母,並把l(當前位置後移cnt[i]位)

如果ch=1,對[l,r]公升序

做法相同,只是從[0->25]遍歷。

#include 

#include

#include

#include

#define ls (o<<1)

#define rs (o<<1|1)

#define lson ls,l,m

#define rson rs,m+1,r

using

namespace

std;

typedef

long

long ll;

const

int n = 100005;

const

int sigma = 26;

int sumv[n<<2][sigma], setv[n<<2]; //setv表示當前區間被覆蓋的字母

int cnt[26]; //每個座標在當前區間出現的次數

char str[n];

void pushup(int o)

}void initnode(int o)

void pushdown(int o, int l, int r)

}void build(int o, int l, int r)

setv[o] = -1;

int m = (l+r)/2;

build(lson);

build(rson);

pushup(o);

}int query(int o, int l, int r, int ql, int qr, int val)

void modify(int o, int l, int r, int ql, int qr, int val)

pushdown(o, l, r);

int m = (l+r)/2;

if(ql <= m) modify(lson, ql, qr, val);

if(qr > m) modify(rson, ql, qr, val);

pushup(o);

}void getstr(int o, int l, int r)

pushdown(o, l, r);

int m = (l+r)/2;

getstr(lson);

getstr(rson);

}int n, q;

int main()

}else }}

getstr(1, 1, n); puts("");

}return

0;}

校選拔賽F題

給n個二維點,求兩座標差值為相反數的點對數 include using namespace std typedef unsigned long long ull int ans 0 輸出答案 mapca 定義對映,first是點差值,second是這個點差有多少個點 int main map ite...

XDU校賽F(貪心 優先佇列)

既然代主席叫窩寫題解,窩當然得好好寫辣。原題 思路 其實最主要的問題是在記憶體滿的時候將誰彈出,也就是讓留在記憶體裡面的頁面盡可能得發揮作用。怎麼發揮作用?反正碰到相同頁面的能發揮作用了嘛。對記憶體裡面的所有頁面找里他下乙個相同頁面,刪除的時候當然是刪除下乙個頁面最遠的那個啦。然後貌似不太靠譜?可能...

sdut 3914 校賽 校賽

time limit 1000ms memory limit 65536kb problem description sdut 的校賽是從 2009 年開始的,康納每年看到比賽之後,往往就會喊一聲 ma ji ya ba ku nai 年份的縮寫 比如說 2009 年就會說 ma ji ya ba ...