牛客小白月賽28 E 線段樹 區間最值下標

2021-10-09 18:03:33 字數 2115 閱讀 9680

題目鏈結

解題報告:

1.

1.1.

由資料範圍可知需離散化

2.

2.2.

直接上線段樹維護最值即可。

對於最值下標的查詢 根據查詢規則確定左右子樹的訪問順序。

**展示:

#include

#define ll long long

#define pii pair

#define all(x) x.begin(),x.end()

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

using

namespace std;

const

int maxn=

2e5+5;

const

int mod=

1e4+7;

inline

intread()

while

(ch >=

'0'&& ch <=

'9')

return s * f;

}inline

void

write

(int x)

struct nodeseg[maxn<<2]

;vector<

int>g;

int a[maxn]

,b[maxn]

,c[maxn]

;void

pushup

(int rt)

void

build

(int l,

int r,

int rt)

int mid=

(l+r)

>>1;

build

(l,mid,rt<<1)

;build

(mid+

1,r,rt<<1|

1);pushup

(rt);}

void

modify

(int pos,

int rt,

int k)

int mid=

(seg[rt]

.l+seg[rt]

.r)>>1;

if(pos<=mid)

modify

(pos,rt<<

1,k)

;else

modify

(pos,rt<<1|

1,k)

;pushup

(rt);}

intgetmax

(int l,

int r,

int rt)

intgetmin

(int l,

int r,

int rt)

intquerymax

(int l,

int r,

int rt,

int k)

}int

querymin

(int l,

int r,

int rt,

int k)

}int

main()

sort

(all

(g))

;for

(int i=

1;i<=n;i++

)build(1

,n,1);

for(

int i=

1;i<=n;i++)if

(a[i]

!=n&&

getmax

(a[i]+1

,n,1

)<=b[a[i]])

}for

(int i=

1;i<=n;i++

)printf

("%d%c"

,b[a[i]

],i==n?

'\n'

:' ');

return0;

}

牛客小白月賽28

計算模意義下的 1 frac 即可。include using namespace std const int mod 1e9 7 int binpow int a,int b return res int inv int n int main return0 以此類推,最終推得規律為 x 3 y ...

牛客小白月賽15 E 線段樹 01揹包

原題位址 沒仔細看題目。因為乙個人只能選一次。這樣的話用線段樹搞一下就可以,求出每個訊號要抹去的最小代價,然後乙個01揹包就可以求出答案啦。includeusing namespace std typedef long long ll const int n 1e5 5 define lson rt...

牛客小白月賽43 E

有數字 1 9,每個數字的個數分別為 cnt1,cnt2,cnt3,cnt9。計算出 滿意的集合 的個數。滿意的集合 定義 選出的數存在一種排列方式,其拼接起來後表示的十進位制整數,能被 3整除,例如集合 包含了 2 個數字 3,1 個數字 6 可以有排列 代表十進位制下的整數 633,能被 3 整...