省隊集訓Round2 DAY3

2021-08-03 01:17:26 字數 2333 閱讀 7898

用splay維護權值有序。每次加入乙個人,貪心的選出前i-1個人中要求最小的vi

−1,判斷能否滿足,如果能滿足就把這vi

−1個人的權值-1,剩下的人不需要他們的支援,那麼都賦值成0,並且把這些點移動到平衡樹中0所在的位置;如果不能滿足就直接在平衡樹中加入乙個-1.

要求每乙個時間每條邊只能有乙個人經過,每個人在到達終點前的任意時刻都不能停止。

那麼我們可以二分乙個最晚的時間mid,然後建mid層結點,每條有向邊x->y從i層的x結點連向i+1層的y結點,容量為1。然後跑最大流如果最後滿流,那麼說明mid可行,繼續減小二分的範圍

#include

#include

#include

#include

#include

#include

#define n 3000003

#define inf 1000000000

using

namespace

std;

int n,m,k,tot;

int point[n],nxt[n],remain[n],v[n],cur[n],last[n],deep[n],num[n];

int x[20000],y[20000];

void add(int x,int y,int z)

int addflow(int s,int t)

now=t;

while (now!=s)

return ans;

}void bfs(int s,int t)

}int isap(int s,int t)

bool pd=false;

for (int i=cur[now];i!=-1;i=nxt[i])

if (remain[i]&&deep[now]==deep[v[i]]+1)

if (!pd)

}return ans;

}bool check(int mid)

int main()

if (ans==n+k+2) printf("-1\n");

else

printf("%d\n",ans-1);

}

省隊集訓Round2 DAY2

首先字首和的變化一定是連續的。那麼對於每個區間,我們找到他最大值和最小值所在的位置,如果k在最小最大值之間,那麼一定可以從最小值最大值位置所構成的區間中得到。那麼根據單調性二分就可以了。每次二分出乙個位置用杜教篩計算一下。對於最大值最小值所在的位置可以打表啊。這道題以前做過乙個靜態的,就是樹在開始的...

省隊集訓Round3 DAY4

講序列分成三部分,大根堆,緩衝區s,小根堆。任意時刻保證mid在緩衝區中,並且盡量保證大根堆和小根堆的大小盡量相等。均攤時間複雜度為o 首先打表發現sg函式的規律。1 p為奇數,從0開始sg值01迴圈 要統計區間的答案其實就是統計區間中sg值為1的數的個數。用線段樹維護區間中偶數 奇數的個數其實就是...

省隊集訓Round3 DAY6

這道題應該是可以通過組合數直接計算的,但是我不會數學證明,所以就用了一種簡單粗暴的方式。an s 2 ic n,i c n n i an s 2 ic n,i 2 101 8 肯定不能直接列舉,如果要計算的話也需要用到lucas定理。觀察發現這題的模數比較小,所以從模數入手。考慮lucas定理。n ...