多校2 Longest Subarray 線段樹

2022-05-01 13:54:09 字數 1546 閱讀 4249

題意:給定n c k     和序列ai(1-n)     求最長的區間長度  使得  該區間中所有出現的元素 的個數為0或》=k     所有數字都在1-c的範圍內

題解:畫個圖思路就很清晰了  非常好的線段樹題 

注意維護最值下標的方式 

#includeusing

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define lson l,m,pos<<1

#define rson m+1,r,pos<<1|1

#define pb push_back

#define rep(i,n) for(int i=0;i

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/#define inf 0x3f3f3f3f

const

int n=1e5+5

;int t[n<<2],col[n<<2],x[n<<2

];int

c,k,n,m;

vector

v[n];

void up(int

pos)

void down(int

pos)

}void build(int l,int r,int

pos)

int m=(l+r)>>1

;build(lson);build(rson);up(pos);

}void upsum(int l,int r,int v,int l,int r,int

pos)

int m=(l+r)>>1

;down(pos);

if(l<=m)upsum(l,r,v,lson);

if(r>m)upsum(l,r,v,rson);

up(pos);

}int qsum(int l,int r,int l,int r,int

pos)

int m=(l+r)>>1

;down(pos);

if(l<=m)//

這裡一定要注意細節

if(r>m)return

qsum(l,r,rson);

return0;

}int

c;int

main()

cout

}return0;

}

view code

多校聯訓2

將前 n 個正整數,分成 m 個集合裡,應該是按照第二類斯特林數的類別分的 然後乙個劃分是好的,當且僅當存在 m 的圓排列。然後求好的劃分的數量,我們考慮乙個問題的轉化,我們乙個集合 a 可以向另乙個集合連邊 b 當且僅當,max a min b 容易發現這樣的邊至少是單向的。也就是說,如果我們把所...

2016多校聯賽2

d.題意 給2組資料a和b陣列,每次有2種操作 l,r,x 把a陣列第l個到第r個元素全置為x,l,r 查詢 l,r 之間哪些位置滿足a i b i i l i r 並把這些位置的數量統計 一直想很久,沒想到什麼有效的方案,直到看到題解才明白過來,原來線段樹套平衡樹還有這種情況 裡面其實不是平衡樹,...

2018多校聯合訓練2

打的慘不忍睹,就過了3題 1004 水題,直接輸出yes就過了,solved by lyy include using namespace std define ll long long int n int main return 0 1010 逆序對 min x,y 隊友一開始wa了4發,給了他模...