HUAS 1483 mex 離線 線段樹

2022-05-26 23:51:08 字數 2374 閱讀 4648

實在是太弱了。。。。

考慮離線,從mex[l,r]向mex[l,r+1]轉移,顯然是沒啥東西可以記錄的。。。

從mex[l,r]向mex[l+1,r]轉移,記x=mex[l,r],如果[l+1,r]不出現a[l]的話,那麼mex[l+1,r]=min(mex[l,r],a[l]).

有了這個性質的話,就可以考慮離線了。先預處理一遍to和mex,to[i]表示i的後面下乙個出現a[i]的陣列下標,mex[i]表示mex[1,i]。

把詢問按左端點公升序排序,對於當前的左端點為1的排序,可以直接輸出它的mex值。

當左端點向右移一位的時候,mex[2,j]=min(mex[1,j],a[1]).(j如果暴力修改的話還是會超時的。

很幸運mex陣列是單調非遞減的。那麼我們可以用線段樹把區間[2,j]上的值取個min。用tag思想的話很容易做到logn。

# include # include 

# include

# include

# include

# include

# include

# include

# include

# include

# include

using

namespace

std;

# define lowbit(x) ((x)&(-x))

# define pi

3.1415926535

# define eps 1e-9

# define mod

1000000007

# define inf

1000000000

# define mem(a,b) memset(a,b,

sizeof

(a))

# define for(i,a,n)

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

# define fo(i,a,n)

for(int i=a; ii)

# define bug puts("h

");# define lch p

<<1

,l,mid

# define rch p

<<1|1,mid+1

,r# define mp make_pair

# define pb push_back

typedef pair

pii;

typedef vector

vi;# pragma comment(linker,

"/stack:1024000000,1024000000")

typedef

long

long

ll;int

scan()

void out(int

a)

if(a>=10) out(a/10

); putchar(a%10+'0'

);}const

int n=200005;//

code begin...

struct nodenode[n];

int seg[n<<2], a[n], mex[n], vis[n], to[n], now, tag[n<<2

], ans[n], res;

bool comp(node a, node b)

void init(int p, int l, int

r) seg[p]=mex[l];

}void push_down(int p, int l, int

r) tag[p]=-1;}

void update(int p, int l, int r, int l, int r, int

val)

}void query(int p, int l, int r, intl)}

intmain ()

for(i,

1,n) if (!to[i]) to[i]=n+1

; for(i,

1,q) node[i].l=scan(), node[i].r=scan(), node[i].id=i;

sort(node+1,node+q+1

,comp);

now=1

; init(

1,1,n);

for(i,

1,q)

query(

1,1,n,node[i].r);

ans[node[i].id]=res;

}for(i,

1,q) printf("

%d\n

",ans[i]);

return0;

}

view code

148 合併果子

一道huffman樹問題,貪心在每一次合併堆的時候,都取最小的兩個堆合併。用乙個優先佇列 小頂堆 來存下所有堆的資料,每次取前面兩個合併就可以了。acwing282.石子合併 設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每...

1 4 8 表空間維護

背景資訊 oracle表空間利用率超過80 時,需要擴充套件表空間來保證lbi正常執行。查詢表空間利用率 步驟1 以oracle使用者登入作業系統。步驟2 登入資料庫 sqlplus as sysdba 步驟3 查詢表空間利用率 sql select a.tablespace name,a.used...

148 鍊錶排序

每趟將乙個待排序的關鍵字按照其值的大小將其插入到已經排好的部分有序序列的適當位置上,直到所有待排關鍵字都被插入到有序序列中為止。public void select sort int nums nums j 1 temp 找到插入位置,將temp中暫存的待排關鍵字插入 鍊錶的直接插入排序 如果是陣列...