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飛到程式中的錯誤,是不能永久遺留的。川普的反對者高喊 川普說回去。是說川普反對移民,讓移民回家去。但是,移民不是美國的錯誤,而是美國的榮耀 正常手續,或者不得不承擔的義務。所以,移民在正常手續下是可以...