Jzoj5446 高考是不可能高考的

2022-05-09 16:07:12 字數 1718 閱讀 4877

snuke 認為兩個旗子間的最小距離越大越好. 請你求出最大值.

今天這都是些集訓隊作業啊!

這個題本來以為一眼能做結果死磕磕不動

二分答案肯定是要的,問題是怎麼判定解

1.dp肯定不行了

2.資料結構,也不行

3.圖的最大獨立集,比較靠譜但是。。。複雜度**

正解:2sat

考完聽他們說才恍然大悟,我在分析的時候漏掉了乙個條件,重點都放在了"xi,yi只能選乙個"

但是還有乙個條件:「xi,yi必須選乙個」,我把這個重要條件作為判斷二分可行性最後才用了

說說怎麼構圖

我們將所有的xi,yi放入乙個陣列s並排序,我們假設ai=0/1表示si這個位置有沒有放旗子

顯然有兩種邊:

1.若si和sj本來是同乙個同乙個k的xk,yk的話,這兩者只可選擇其一,即ai^aj=1

2.|si-sj|《我們二分的mid,那麼這兩者最多選乙個即ai&aj=0

很明顯,如果直接暴力構圖是過不去的,我們可以考慮以下兩種優化方法:

1.線段樹優化連邊

2.分塊優化連邊

具體思路就是建立一些輔助點,當乙個點x向一片區間s[l,r]連邊的時候不需要每個都連線而是通過輔助點,這樣可以減少邊的總數(類似於中轉站)

當然以上兩種做法都比較複雜,我講一種很簡單而且很快的做法

我們二分答案的時候,我們發現需要將r開得很大(10^9)

而且我們注意到,如果暴力連邊,mid越大,邊的數量就越多,而答案通常不大

所以我們考慮儘量減少r來降低複雜度

這裡我們考慮一種dp的形式

假設這個問題中,xi,yi可以同時取,那麼這個問題就變成了乙個在s上的動態規劃

方程為f[j]=max(f[i]+1)

inline

void adj(int x,int y)

void dfs(int x) else

if(!col[v]) low[x]=min(dfn[v],low[x]);

if(low[x]==dfn[x]) while(stk[top--]!=x);

} }bool gscn(int n)

} g;

struct dt s[n<<1];

int x[n],y[n],p[n<<1],n,m=0,c[n];

inline

bool c1(dt a,dt b)

return l;

}inline

int upperbound(int p,int k)

return l;

}void buildgraph(int x)

}int v[n<<1],f[n<<1];

inline

bool ok(int x)

return f[m]>=n;

}int main();

s[++m]=(dt);

} sort(s+1,s+1+m,c1);

for(int i=1;i<=m;++i)

} int l=0,r=100000000;

for(int m;l1>>1;

if(ok(m)) l=m;

else r=m-1;

} l=0;

for(int m;l1>>1;

buildgraph(m);

if(g.gscn(m<<1)) l=m;

else r=m-1;

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

}

JZOJ5446 高考是不可能高考的

solution 如題,打工是不可能打工的,高考是不可能高考的 看到最小距離最大直接二分答案,考慮怎麼判定。我們先限制一下點對 乙個旗子能放的兩個位置 的關係 後面說怎麼限制 然後把所有位置打散,對映到數軸上,對於乙個位置i ii放置旗子,那麼區間 i mid 1,i mid 1 i mid 1,i...

愛情永遠不可能是天平

愛情永遠不可能是天平。你想在愛情裡幸福就要捨得傷心。愛情原來本就是海浬的沙,只有你用心去呵護它,用淚和心血去滋潤它,讓它沉醉於心才能成為一顆水晶 人的精神有三種境界 駱駝 獅子和嬰兒。第一境界駱駝,忍辱負重,被動地聽命於別人或命運的安排 第二境界獅子,把被動變成主動,由 你應該 到 我要 一切由我主...

bug永久遺留是不可能的

程式中的錯誤,稱為bug。但什麼是bug,大家看法不同,但是debug程式除錯不存在錯誤問題。bug飛到程式中的錯誤,是不能永久遺留的。川普的反對者高喊 川普說回去。是說川普反對移民,讓移民回家去。但是,移民不是美國的錯誤,而是美國的榮耀 正常手續,或者不得不承擔的義務。所以,移民在正常手續下是可以...