1. 程式人生 > >[2017紀中11-3][ARC069-F]高考是不可能高考的 2-sat+線段樹優化建圖

[2017紀中11-3][ARC069-F]高考是不可能高考的 2-sat+線段樹優化建圖

題面
原題
首先考慮二分答案k,驗證就可以用2-sat。假如要選某一個x[i],那麼x[i]左右距離k的區間內的點都不能選,於是這些點都必須選另一半;y[i]同理。
由於邊數太多,直接建圖是不可接受的,考慮到不能選的點都在一個區間內,於是把所有x[i],y[i]排序,開一棵線段樹,x的位置存y的點編號,y的位置存x的點編號(因為要連另一半嘛),建邊時向線段樹上節點連,線段樹從根往葉子連邊,邊數控制在nlogn級別。
注意因為自己也在自己不可選的區間內,導致自己向自己的另一半連邊,預處理另一半的位置,以這個位置把原來區間分成左右兩半即可。
程式碼:

#include<iostream>
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=10010; const int maxd=40010; int n,num,tim,top,nc,rx[maxn],ry[maxn],g[maxn<<1],dfn[maxd],low[maxd],col[maxd],st[maxd]; bool vis[maxd],vst[maxd]; struct edge { int t; edge *next; }*con[maxd]; struct
node { int d,b; bool operator <(const node &x) const{return d<x.d;} }e[maxn<<1]; void ins(int x,int y) { if(y==0||x==y) return; edge *p=new edge; p->t=y; p->next=con[x]; con[x]=p; } struct tree { int l,r,id; tree *ls,*rs; tree() { ls=rs=NULL; l=r=id=0
; } void update() { id=++num; ins(id,ls->id); ins(id,rs->id); } void build(int lx,int rx) { l=lx;r=rx; if(l==r) { if(e[l].b>n) id=e[l].b-n; else id=e[l].b+n; g[e[l].b]=l; return ; } int mid=(l+r)>>1; (ls=new tree)->build(lx,mid); (rs=new tree)->build(mid+1,rx); update(); } void ade(int bg,int lx,int rx) { if(lx>rx) return; if(l==lx&&r==rx) {ins(bg,id); return;} int mid=(l+r)>>1; if(rx<=mid) ls->ade(bg,lx,rx); else if(lx>mid) rs->ade(bg,lx,rx); else ls->ade(bg,lx,mid),rs->ade(bg,mid+1,rx); } }*xtr; void tarjan(int v) { vis[v]=vst[v]=1; low[v]=dfn[v]=++tim; st[++top]=v; for(edge *p=con[v];p;p=p->next) if(!vis[p->t]) tarjan(p->t),low[v]=min(low[v],low[p->t]); else if(vst[p->t]) low[v]=min(low[v],dfn[p->t]); if(low[v]==dfn[v]) { nc++; while(st[top+1]!=v) {vst[st[top]]=0;col[st[top--]]=nc;} } } bool check(int v) { for(int i=1;i<=2*n;i++) con[i]=NULL; for(int i=1;i<=n;i++) { int Lx,Rx,Ly,Ry; Lx=lower_bound(e+1,e+2*n+1,(node){rx[i]-v+1,0})-e; Rx=upper_bound(e+1,e+2*n+1,(node){rx[i]+v-1,0})-e-1; Ly=lower_bound(e+1,e+2*n+1,(node){ry[i]-v+1,0})-e; Ry=upper_bound(e+1,e+2*n+1,(node){ry[i]+v-1,0})-e-1; if(Lx<=Rx)xtr->ade(i,Lx,g[i]-1),xtr->ade(i,g[i]+1,Rx); if(Ly<=Ry)xtr->ade(i+n,Ly,g[i+n]-1),xtr->ade(i+n,g[i+n]+1,Ry); } memset(vis,0,sizeof(vis)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(col,0,sizeof(col)); tim=top=nc=0; for(int i=1;i<=num;i++) if(!vis[i]) tarjan(i); for(int i=1;i<=n;i++) if(col[i]==col[i+n]) return 0; return 1; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&rx[i],&ry[i]); e[2*i-1].d=rx[i];e[2*i-1].b=i; e[2*i].d=ry[i];e[2*i].b=i+n; } sort(e+1,e+2*n+1); num=2*n; (xtr=new tree)->build(1,2*n); int L=0,R; if(n<=1000) R=1e9; else R=28000; while(L<R) { int mid=(L+R)>>1; if(check(mid)) L=mid+1; else R=mid; } printf("%d",L-1); return 0; }

相關推薦

[201711-3][ARC069-F]高考可能高考2-sat+線段化建

題面 原題 首先考慮二分答案k,驗證就可以用2-sat。假如要選某一個x[i],那麼x[i]左右距離k的區間內的點都不能選,於是這些點都必須選另一半;y[i]同理。 由於邊數太多,直接建圖是不可接受的,考慮到不能選的點都在一個區間內,於是把所有x[i],y

[201710-24]方陣 二維ST表

題面 假的資料。。。考場上被坑成0分。 首先兩個log的二維ST表很好想,st[i][j][k][l]表示以點(i,j)向右2^k,向下2^l的矩形內的答案。 (假設)考慮真的長不超過寬的兩倍,我們可以把它分成兩個以寬為邊長的正方形(當然可能會有部分重疊)

牛客網-F-發電(費馬小定理+線段

連結:https://www.nowcoder.com/acm/contest/136/F 來源:牛客網   時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld 題目描述  

【JZOJ5446】高考可能高考

Description Snuke 喜歡旗子. Snuke 正在將N 個旗子擺在一條線上. 第i 個旗子可以被放在位置xi 或yi 上. Snuke 認為兩個旗子間的最小距離越大越好. 請你求出最大值. Solution 如題,打工是不可能打工的,高

2017/10/01-2017/11/3工作日誌(補)

-type 狀況 響應 準備 自定義 不支持 dia tab 在家 十一在家過得還算舒坦,回來就努力工作了。 10/9 一開始的工作是完善之前的功能,重點是解決一部分IE8下面的兼容問題,學到了以下內容: 1、IE8不支持bootstrap的響應式布局,原因是IE8不能識別

2017.11.3 16:30-17:00Face-to-face communication

power biDo you want to communicate with the BI experts face to face and ask your question directly? Engage with MVP at specialty workshops. You can connect

mysqlint(3)與int(11)有什麽區別嗎?

png 不足 次方 表示 分享 什麽 否則 數據庫 SQ 註意:這裏的M代表的並不是存儲在數據庫中的具體的長度,以前總是會誤以為int(3)只能存儲3個長度的數字,int(11)就會存儲11個長度的數字,這是大錯特錯的。 其實當我們在選擇使用int的類型的時候,不論是i

ng-notadd 0.11.3 釋出,基於 Angular7 和 material2 的後臺解決方案

   新功能: 新增 world. json 檔案 新增散點圖和訪問趨勢條形圖 改變材料的背景顏色樣式 更改 ng-notadd 預設配置 更改路由器連結 在 _ color. sss 中新增第二背景 技術棧 Typescript Angular Mat

[CareerCup] 11.3 Search in Rotated Sorted Array 在旋轉有序矩陣搜索

11.3 Given a sorted array of n integers that has been rotated an unknown number of times, write code to find an element in the array. You may assume that

python編程快速上手之第10章實踐項目參考答案(11.11.3)

name driver ret text rul from url .get right from selenium import webdriver from selenium.webdriver.common.keys import Keys import time

2017 5月11日上午

分享 logs ges com cnblogs mage .com 任務 src 上午的任務是被40個單詞,然後做6道高數大題2017 5月11日上午

windows Visual Studio 2017 編譯 HEVC cmake-3.8.1-win64-x64.msi 下載

color 找到 style des 當前 pen span 分享 自動 ttps://github.com/OpenHEVC/openHEVC 下載一 直接下載源碼(可選)或下載源碼包,我這裏下載的是源碼 打開 Visual Studio () 去 github

(hdu step 7.1.6)最大三角形(凸包的應用——在n個點找到3個點,它們所形成的三角形面積最大)

三角形 struct names com 都在 acm sni 都是 tran 題目:最大三角形Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S

11.3-全棧Java筆記:線程的生命周期

java一個線程對象在它的生命周期內,需要經歷5個狀態。新生狀態(New)用new關鍵字建立一個線程對象後,該線程對象就處於新生狀態。處於新生狀態的線程有自己的內存空間,通過調用start方法進入就緒狀態。就緒狀態(Runnable)處於就緒狀態的線程已經具備了運行條件,但還沒有分配到CPU,處於 “線程就緒

日本IT行業勞動力缺口達22萬 在日中國留學生迎來就業好時機 2017/07/18 11:25:09

不難 溝通能力 cells bsp 獲得 lsp 掌握 div file 作者:倪亞敏  來源:日本新華僑報  發布時間:2017/07/18 11:25:09 據日本政府提供的數據,日本2018年應屆畢業生的“求人倍率”已經達到了1.78倍。換言之,就

Cocos2d-x 3.0 物理碰撞檢測onContactBegin回調函數響應問題

track 後來 which compare mar details egl def trac 好吧,事實上這篇也是暫時冒出來的,近期朋友要做個物理遊戲,曾經做物理還是用box2d,呃。確實要花些功夫才幹搞懂當中的精髓,可是聽講這套引擎又一次封裝了一次。要easy非

【鏈表】2017多校訓練3 HDU 6058 Kanade's sum

iostream ++ 多校 open pos cnblogs names mat play acm.hdu.edu.cn/showproblem.php?pid=6058 【題意】 給定一個排列,計算 【思路】 計算排列A中每個數的貢獻,即對於每個ai,計算有

year:2017 month:8 day:3

執行 創建 類名 堆內存 變量聲明 bsp 容易 根據 變量存儲 2017-08-03 JAVAse 1:靜態變量和成員變量的區別: 所屬不同:靜態變量屬於類,所以也稱為類變量      成員變量屬於對象,也稱為實例變量 內存中位置不同:靜態變量存儲余方法區的靜態區    

dp亂寫3:論dp在在dp(但在dp範疇)內的應用

經典的 exit e30 reset 最大值最小值 二叉樹 錯誤 出口 解答 最近正兒八經的學習了dp,有一些題目非常明顯看出來就是dp了比如說:過河卒、方格取數、導彈攔截、加分二叉樹、炮兵陣地更加明顯的還有:采藥、裝箱問題、過河、金明的預算方案。今天來談談dp的dp在不在

11.3 商標法解讀

沒有 界定 考試 ima 剛才 alt 解讀 -1 提交 就是你哪一天寄出的,在遞送郵件的時候郵電局會給你蓋上郵戳.這個郵戳是能夠證明你什麽時候寄出的東西.那麽我們的評審就以這個日期為準.之所以提出這個郵戳日期,就是為了避免一種情況:就是多人向商標局申請同一個標誌定為它