題目鏈結~
problem
求所有大於等於 le
n len
的區間的中位數最大可以是多少
solution
我們二分乙個答案,對於序列中大於的給
1 1
,小於的給 −1
' role="presentation" style="position: relative;">−1−
1。 若存在某一段的值大於等於
0 0
,則說明這個答案成立
這個問題可以用字首和來維護
code
#include
#include
#include
using
namespace
std;
#define n 100010
int n,m,a[n],b[n],sum[n];
inline
bool check(int x)
return0;}
int main()
printf("%d",ans);
return
0;}
problem求 l
' role="presentation" style="position: relative;">ll到
r r
的數字中,乘積在 l1
' role="presentation" style="position: relative;">l1l
1到 r1
r
1之間的數有多少個
solution
記憶化搜尋…細節超多
code
#include
#include
#include
using
namespace
std;
#define ll long long
int s[20];
ll l,r,l1,r1;
mapdp[20][2];
ll dfs(int pos,int lim,int pre,ll sum)
if(!lim) dp[pos][pre][sum]=ans;
return ans;
}ll solve(ll x)
int main()
problem
有一棵
n n
個節點的樹(
1' role="presentation" style="position: relative;">1
1為根),
m m
個守衛,每個可以守護一段路徑。
問對於一次詢問 (v
i,ki
)' role="presentation" style="position: relative;">(vi
,ki)
(vi,
ki), 想找到乙個離根節點最近的 ui
u
i使得 vi
v
i到 ui
u
i這條路徑被大於等於
k k
個守衛守護。輸出 vi
' role="presentation" style="position: relative;">viv
i到 ui
u i距離
solution
由於查詢只會向上不會向下,即 ui
u
i一定是 vi
v
i到根上的一點。
因此我們可以把守衛守護的路徑變成 (x
i,lc
a(xi
,yi)
)、(y
i,lc
a(xi
,yi)
) (xi
,lca
(xi,
yi))
、(yi
,lca
(xi,
yi))
對於每次詢問,(v
i,ui
) (vi
,ui)
,如果有邊(x
i,yi
) (xi
,yi)
(直上直下)能完全覆蓋它,那麼 xi
x
i一定為 vi
v
i子樹, yi
y
i一定為 xi
x
i到根上的一點
因此我們可以求出 df
s dfs
序,所有結果就是 vi
v
i的子數中到符合條件最小的。我們可以二分這個點,判斷是否有至少
k k
條路徑。
這個可以用主席樹來記錄。
此時複雜度為 nl
og2n
' role="presentation" style="position: relative;">nlo
g2nn
log2
n 但其實結果我們只想求深度差。因此主席樹中我們可以記錄深度到為
x x
的有多少條邊
那麼結果就是 vi
' role="presentation" style="position: relative;">viv
i的子數中第
k k
小的code
#include
#include
#include
using
namespace
std;
#define n 200010
int n,m,q,tot=0,num=0,len=0,owo=0,in[n],out[n],h[n],lg[n],fa[n][20],dep[n],root[n],id[n];
struct nodeedge[n<<1];
struct node1tree[n*200];
inline
char gc()
return *s++;
}inline
int read()
while('0'
<=ch && ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}inline
void insert(int x,int y)
void dfs(int x)
for(int i=h[x];i;i=edge[i].next)out[x]=tot;
}inline
int lca(int x,int y)
if(x==y) return x;
for(int i=lg[n];i>=0;i--)
return fa[x][0];
}void add(int &p,int l,int r,int x)
int query(int p,int v,int l,int r,int k)
inline
int solve(int x,int k)
int main()dep[1]=1;dfs(1);
num=0;memset(h,0,sizeof(h));
for(int i=1;i<=m;i++)
for(int i=1;i<=n;i++)
}q=read();
for(int i=1;i<=q;i++)
return
0;}
2020牛客NOIP賽前集訓營 提高組(第四場)
有 f n 2 f 2 f 1 f 2 f 2 f 2 令 g n f n 2 很自然的有 g n 2g 2g g 將遞推式寫成矩陣的形式 a 令 vec n 為 g n,g g t 可以逆推出 vec 0 把 vec 表示成 a n vec 將題目中的 f s sum limits g sum l...
牛客CSP S提高組賽前集訓營2
然後隨便用乙個資料結構維護一下就行了,我寫的線段樹。我們先找出每個環,然後我們先刪連線環的邊,每刪一條就可以多產生乙個聯通塊,在考慮刪環邊,發現從最大的環刪起一定最優 因為你刪的第一條邊得不到任何新的聯通塊 就很容易想到tar jantarjan tarjan 發現你只能寫出80 8080 分,因為...
牛客CSP S提高組賽前集訓營1
比賽鏈結 官方題解 before t1觀察 結論題,t2樹形dp,可以換根或up down,t3正解妙,轉化為圖上問題。題目質量不錯,但資料太水了 一共n個石子堆,每個石子堆有ai個石子,兩人輪流對石子塗色 先手塗紅,後手塗藍 且需要保證當前回合塗的石子顏色不能和它相鄰的兩個同色,誰塗不下去誰輸。一...