用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 ...