2019CCPC哈爾濱A題 差分約束系統 二分

2021-10-03 05:10:26 字數 2161 閱讀 5847

題目大意:

有n≤3e3個格仔,你可以任意給每個格仔染色,但是要滿足m≤3e3限制條件,限制條件有兩種型別:

1. 區間[l,r]中被染色的格仔數量不少於k。

2. 區間[l,r]外被染色的格仔數量不少於k。

在滿足所有限制條件下求染色格仔數量的最小值。

題解:算作是差分約束+二分的板子題,比賽時還不知道差分約束是什麼,當時一點思路都沒有,賽後看了大牛們的講解才理解,其實就是把一些不等式問題轉換成最短路或者最長路,不懂得可以看看這篇文章:

寫的是真的好,裡面講的一道例題就和這個題差不多。

首先因為染色格仔的數量是越多越好,即滿足遞增的,那麼我們就可以二分列舉染色格仔的總數量mid

我們很容易能寫出以下不等式(注意那些隱藏條件,因為差分約束正確的前提是滿足所有條件):

然後我們分別建圖判斷是否存在0-n的最短路就行了。

trick:這個題有點卡常,用spfa時需要剪枝一下,實測僅用slf優化也可以過,不過有個更牛皮的優化,具體內容參考**

**實現:

#pragma gcc optimize(2)

#include#include#include#include#include#include#include#include#include#include#include#define pi atan(1.0)*4

#define e 2.718281828

#define rp(i,s,t) for (register int i = (s); i <= (t); i++)

#define rp(i,t,s) for (register int i = (t); i >= (s); i--)

#define ll long long

#define ull unsigned long long

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

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define pii pair#define mp make_pair

#define pb push_back

#define debug printf("ac\n");

using namespace std;

inline int read()

while(c>='0'&&c<='9')

return a*b;

}const int inf = 0x3f3f3f3f;

const int n = 3e3+7;

struct edgee[n*10];

int head[n],edgecnt,dis[n];

dequeq;

int cnt[n],inq[n];//常規的spfa所需的陣列

int n,m1,m2,t;

inline void addedge(int u,int v,int w,int flag);

head[u]=edgecnt;

}inline void add(int delta)

}int spfa(int delta)

q.push_back(0);

inq[0]=1;

while(!q.empty())

//大力剪枝,如果有乙個點的最短路為負,則必定存在負環

//因為 i->i-1 有一條權值為0的邊,而且是從0為起點走的,那麼就可以通過走序號不斷減1的邊回到0,這樣就形成了乙個負環

if(dis[now]<0)

for(int i=head[now];i;i=e[i].nxt)

while(m2--)

rp(i,1,n)

//s(n)-s(0)==mid => s(n)-s(0)>=mid and s(n)-s(0)<=mid

//s(n)-s(0)>=mid => s(0)-s(n)<=-mid

addedge(0,n,0,1);

addedge(n,0,0,2);

int l=0,r=n,ans=-1;

while(l<=r)

else l=mid+1;

}printf("%d\n",ans);

}return 0;

}

2019ccpc哈爾濱補題

因為每個字串只能取乙個,剛開始是覺得全部列舉也不會超,後來想想列舉也要用深搜,所以就先記錄擁有各個字元的串,然後深搜 include using namespace std const int maxn 2e6 10 int t char s maxn vector int v 10 bool vi...

2019CCPC哈爾濱站 E題 O n

在此貼另外乙個簡單題 吃糖果 如果ac上面乙個題目之後,發現兩個吃的方法其實一模一樣,但是又來了乙個問題,因為這個題目資料很大,卡 o nlogn 則我們如何 o n 求出現次數最多的數。在此貼另外乙個簡單題 2456.mode 過了上面乙個題目你會發現,這個是求出現次數 n 1 2的數,但是如果我...

2019CCPC廈門遊記

距離上次2018ccpc吉林打鐵一年有餘,這次的廈門也是我們team拿到的第一塊區域賽牌子,寫一篇部落格留念一下qaq。作為弱校的菜雞隊,我們提前兩天就來到廈門,不得不說剛到廈門的兩天還是很快樂的,住宿的地方三人間沒有了,老闆大度的換成了一人間 標間,開心 day1 跑到鼓浪嶼玩,和兩個憨憨的隊友壓...