日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

询问

發(fā)布時(shí)間:2024/1/18 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 询问 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Description

有一個(gè)長度為 ?n? n 的正整數(shù)序列,序列中元素兩兩不同且都在 [1109] [ 1 , 10 9 ] 中。
你不知道這個(gè)序列是什么。
現(xiàn)在有 ?Q? Q 個(gè)詢問 lr l , r ,每次詢問序列中區(qū)間 [l,r] [ l , r ] 的最小值,有一個(gè)人回答了這 ?Q? Q 個(gè)問題。
但是他太不靠譜,回答可能會(huì)自相矛盾。
于是我們要求出一個(gè)最小的 ?p? p ,回答的 ?p? p 個(gè)詢問后出現(xiàn)了答案自相矛盾的情況。
如果所有的 ?Q? Q 個(gè)答案是不互相矛盾的,就輸出 0 0

Input

第一行兩個(gè)整數(shù) nQ n,Q。
接下來 ?Q? Q 行,第 ?i? i 行三個(gè)整數(shù) ?liriansi l i , r i , a n s i ,表示第 ?i? i 個(gè)詢問 [liri] [ l i , r i ] ,回答的答案為 ?ansi a n s i

output

按照題目要求輸出一行一個(gè)整數(shù)。

Sample Input

20 4
1 10 7
5 19 7
3 12 8
11 15 12

Sample Output

3

Data Constraint

?n106,m25000,1ansi109 n ≤ 10 6 , m ≤ 25000 , 1 ≤ a n s i ≤ 10 9

Solution

考慮二分答案,接下來判斷前mid個(gè)詢問是否矛盾。
把所有詢問按照答案從大到小排序,把答案相同的那些詢問放在一起,求出區(qū)
間交及區(qū)間并,如果區(qū)間交為空說明序列中有重復(fù)數(shù)字,直接無解;否則我們看
看區(qū)間交是否全被覆蓋,如果全被覆蓋顯然之前的區(qū)間答案錯(cuò)誤產(chǎn)生矛盾,如
果沒全被覆蓋我們就把區(qū)間并(由于區(qū)間交不為空區(qū)間并顯然是一段連續(xù)區(qū)間)
進(jìn)行覆蓋。
正確性在于如果有 l1l2r2l1 l 1 ≤ l 2 ≤ r 2 ≤ l 1 ,那么顯然有 ans2ans1 a n s 2 ≥ a n s 1 ,而如果答案小
的區(qū)間全被覆蓋就相當(dāng)于 ans2<ans1 a n s 2 < a n s 1 。這就產(chǎn)生了矛盾。
那么我們可以用線段樹或并查集的做法,下面就講講并查集。
如果我們將要覆蓋 [lr] [ l , r ] ,那么我們就要使l~r合并到r+1去,所以當(dāng) faii f a i ≠ i
時(shí)就說明該區(qū)域已被覆蓋,并且當(dāng) ?fai=faj? f a i = f a j 時(shí)說明i,j被同一區(qū)域覆蓋。易得最多只合并 ?n? n 次。

Code

var l,r,mid,fax,fay,i,n,t:longint;g,f:array[1..2] of longint;a,b:array[0..30000,1..3] of longint;fa:array[1..1000005] of longint; function get(x:longint):longint; beginif fa[x]=x then exit(x);fa[x]:=get(fa[x]);exit(fa[x]); end; procedure qsort(x,y:longint); var i,j:longint;k:int64; begini:=x;j:=y;k:=b[(i+j) div 2,3];repeatwhile b[i,3]>k do inc(i);while b[j,3]<k do dec(j);if i<=j then beginb[0]:=b[i];b[i]:=b[j];b[j]:=b[0];inc(i);dec(j);end;until i>j;if i<y then qsort(i,y);if j>x then qsort(x,j); end; function min(x,y:longint):longint; begin if x<y then exit(x);exit(y);end; function max(x,y:longint):longint; begin if x>y then exit(x);exit(y);end; function pan(x:longint):boolean; beginfor i:=1 to x do b[i]:=a[i];for i:=1 to n+1 do fa[i]:=i;qsort(1,x);f[1]:=b[1,1];f[2]:=b[1,2];g[1]:=b[1,1];g[2]:=b[1,2];b[x+1,3]:=-1;for i:=2 to x+1 do beginif b[i,3]=b[i-1,3] then beginif (b[i,1]>f[2]) or (b[i,2]<f[1]) then exit(false) elsef[1]:=max(f[1],b[i,1]);f[2]:=min(f[2],b[i,2]);g[1]:=min(g[1],b[i,1]);g[2]:=max(g[2],b[i,2]);continue;end else beginfax:=get(f[1]);fay:=get(f[2]+1);if fax=fay then exit(false);fax:=get(g[1]);fay:=get(g[2]+1);while fax<>fay do beginfa[fax]:=fax+1;fax:=get(fax+1);end;f[1]:=b[i,1];f[2]:=b[i,2];g[1]:=b[i,1];g[2]:=b[i,2];end;end;exit(true); end; begin assign(input,'bales.in');reset(input); assign(output,'bales.out');rewrite(output);readln(n,t);for i:=1 to t doreadln(a[i,1],a[i,2],a[i,3]);l:=1;r:=t;while l<r do beginmid:=(l+r) div 2;if pan(mid) then l:=mid+1 else r:=mid;end;if (l=t) and (pan(l)) then writeln(0) else writeln(l); close(input); close(output); end.

總結(jié)

以上是生活随笔為你收集整理的询问的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。