題目鏈結
解題報告:
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 整...