【pku3657】二分答案+區間染色

來源:互聯網
上載者:User

最近有點懶,很久沒寫總結了,估計今天相當差的狀態跟這有關吧(向總笑而不語)

好了,廢話不多說,還是隨便記記最近做的的題目吧

 

pku 3657:

  很有意思的題,大意是給你若干句形如a,b,c的描述,表示a~b的最小值為c,要你求第一句出現矛盾的話。

  乍一看沒什麼好想法,類比吧,不可能,線段樹吧,判不出,怎麼辦?回過頭想想,為什麼麻煩了,麻煩在了哪裡,依我看,就是麻煩在了"求第一句出現矛盾的話"上,"第一句"會卡死了我們的思路,怎麼解決呢?二分答案!二分的性質很顯然,解會是連續的,而且二分答案之後就可以排序了,此為此題收穫之一,二分答案以獲得更多資訊和更寬鬆的條件

  好了,排完序之後容易想到按c從大到小排序,有如下兩種情況可能產生矛盾:如果一段區間的最小值已知為c1了,那麼<c1的值在這段區間上是不可能出現的了,就相當於拿到值為ci的一堆區間時(注意,可能不止一個),對整段區間中沒有顏色的點染上ci的顏色(哦,不記得說了,先給區間離散化一下),如果最後發現這一段沒染到一個,那麼就矛盾了;題目有要求任意兩個倉庫的存量不能相同,也就是說,對於值同為ci的區間,如果它們的並不是一個整區間的話,顯然會出現矛盾(ci的存量要出現在多個地方)。此為此題收穫之二,細緻的讀題是ac的必要條件。。第二種情況我自己就沒有想到。。

  這個染色的過程用什麼東西來實現?線段樹?麻煩。類比?。。不予評價。這都不是最佳選擇。由於每個點只能被染色一次,那麼並查集就能夠勝任這個過程了。具體方法就是每個點的f[i]記錄當前它被一整段區間所覆蓋的最左邊那個點,這樣,每次給區間染色就可以用並查集做到均攤O(alpha(n))的了。並查集的妙用,此為此題收穫之三

  看這個神奇的資料

  10 3
  1 10 1
  1 1 5
  10 10 4

  輸出3的同學要注意了,普通的離散化不能區分[a,a]U[b,b]和[a,b],那麼我們離散化的時候往[a,b](a+1<b)中插一個點就可以了。離散化時的細節(好像離散化經常要插點啊什麼的),此為此題收穫之四

 

代碼:

program syj; {erfen ans+range covering_using bingcha set}<br />const<br /> maxn=25000+5;<br />var n,q,nn,l,r,mid,i:longint;<br /> x,c,p,f,color:array[0..maxn*4]of longint;<br /> a:array[1..maxn]of longint;<br />procedure sort1(l,r:longint);<br />var i,j,k,z:longint;<br />begin<br /> i:=l;j:=r;k:=x[(l+r) div 2];<br /> repeat<br /> while x[i]<k do inc(i);<br /> while x[j]>k do dec(j);<br /> if i<=j then begin<br /> z:=x[i];x[i]:=x[j];x[j]:=z;<br /> z:=c[i];c[i]:=c[j];c[j]:=z;<br /> inc(i);dec(j);<br /> end;<br /> until i>j;<br /> if l<j then sort1(l,j);<br /> if i<r then sort1(i,r);<br />end;<br />procedure sort2(l,r:longint);<br />var i,j,k,kk,z:longint;<br />begin<br /> i:=l;j:=r;k:=a[c[(l+r) div 2]];kk:=p[c[(l+r) div 2]];<br /> repeat<br /> while (a[c[i]]>k) or (a[c[i]]=k)and(p[c[i]]<kk) do inc(i);<br /> while (a[c[j]]<k) or (a[c[j]]=k)and(p[c[j]]>kk) do dec(j);<br /> if i<=j then begin<br /> z:=c[i];c[i]:=c[j];c[j]:=z;<br /> inc(i);dec(j);<br /> end;<br /> until i>j;<br /> if l<j then sort2(l,j);<br /> if i<r then sort2(i,r);<br />end;<br />function find(x:longint):longint;<br />begin if f[x]<>x then f[x]:=find(f[x]); find:=f[x]; end;<br />function check(kk:longint):boolean;<br />var u,i,j,k,l,r,ii,ll,rr:longint;<br /> ok:boolean;<br />begin<br /> for i:=1 to kk do c[i]:=i;<br /> sort2(1,kk);<br /> for i:=1 to nn do begin f[i]:=i;color[i]:=0; end;<br /> k:=1;<br /> for i:=1 to kk do if (i=kk)or(a[c[i]]<>a[c[i+1]]) then begin<br /> l:=p[c[k]];r:=p[c[k]+q];ll:=l;rr:=r;<br /> for u:=k+1 to i do begin<br /> ii:=c[u];<br /> if p[ii]>ll then ll:=p[ii];<br /> if p[ii+q]<rr then rr:=p[ii+q];<br /> if ll>rr then exit(false);<br /> if p[ii+q]>r then r:=p[ii+q];<br /> end;<br /> j:=find(r);<br /> while j>=l do begin<br /> if color[j]=0 then color[j]:=a[c[i]]; f[j]:=l; j:=find(j-1);<br /> end;<br /> ok:=false;<br /> for ii:=ll to rr do if color[ii]=a[c[i]] then begin ok:=true;break; end;<br /> if not ok then exit(false);<br /> k:=i+1;<br /> end;<br /> check:=true;<br />end;<br />begin<br /> assign(input,'pku3657.in');reset(input);<br /> assign(output,'pku3657.out');rewrite(output);<br /> readln(n,q);<br /> for i:=1 to q do begin<br /> readln(x[i],x[i+q],a[i]);<br /> c[i]:=i;c[i+q]:=i+q;<br /> end;<br /> sort1(1,q*2);<br /> for i:=1 to q*2 do p[c[i]]:=p[c[i-1]]+ord(x[i]<>x[i-1])*(ord(x[i]-x[i-1]>1)+1);<br /> nn:=p[c[q*2]];<br /> l:=1;r:=q;<br /> while l<r do begin<br /> mid:=(l+r+1) div 2;<br /> if check(mid) then l:=mid<br /> else r:=mid-1;<br /> end;<br /> if l=q then l:=0 else inc(l);<br /> writeln(l);<br /> close(input);<br /> close(output);<br />end.</p><p>

 

  並不難的一道題,收穫超乎想象。。順便膜拜下fanhq神牛。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.