1594: [Usaco2008 Jan]猜數遊戲
題目大意:N個數排成一列,有q個詢問,每個詢問告訴你區間[l,r]的最小值是多少(這N個數各不相同)。問你這q個詢問有沒有矛盾,有的話從哪裡開始有矛盾
題解:二分答案,現在檢驗前mid個詢問是否有矛盾
Orz並查集神奇做法
我的收穫:並查集強啊
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define MAXN 1100000
using namespace std;
struct Query
{
int L,R,ans;
}querys[MAXN],tmp[MAXN];
bool cmp(Query a,Query b)
{
return a.ans>b.ans;
}
int n,q;
int f[MAXN],stack[MAXN];
int findSet(int x)
{
int top=0;
while(f[x]!=x)
{
stack[++top]=x;
x=f[x];
}
for(int i=1;i<=top;i++) f[stack[i]]=x;
return x;
}
bool check(int pos) //判斷第pos個詢問是否和之前的有矛盾
{
for (int i=1;i<=pos;i++) tmp[i]=querys[i];
sort(tmp+1,tmp+pos+1,cmp);
//printf("-----------\n");
//for(int i=1;i<=pos;i++) printf("%d %d %d\n",tmp[i].L,tmp[i].R,tmp[i].ans);
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1,j=1;i<=pos;i=j+1,j++) //!!!!!!
{
int La,Ra,Lb,Rb; //這段區間的並集區間是[La,Ra],交集區間是[Lb,Rb]
La=Lb=tmp[i].L,Ra=Rb=tmp[i].R; //!!!!!
while(j<pos&&tmp[j+1].ans==tmp[i].ans) //!!!!!!
{
j++;
La=min(La,tmp[j].L); //!!!!我去。。。全都把tmp打成query了
Ra=max(Ra,tmp[j].R); //!!!!
Lb=max(Lb,tmp[j].L); //!!!!
Rb=min(Rb,tmp[j].R); //!!!!
}
if(findSet(Rb)+1<=Lb) return true;
for(int t=Ra,p=findSet(t);p>=La;t=p-1,p=findSet(t)) //!!!!!注意是t=p-1不是t=p,原因可以自己模擬下合併過程,就會發現
f[p]=La-1;
}
return false;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=q;i++) scanf("%d%d%d",&querys[i].L,&querys[i].R,&querys[i].ans);
//check(6);
int lowerBound=1,upperBound=q,ans=-1;
while(lowerBound<=upperBound)
{
int mid=(lowerBound+upperBound)>>1;
if(check(mid))
{
ans=mid;
upperBound=mid-1;
}
else lowerBound=mid+1;
}
if(ans==-1) printf("0\n");
else printf("%d\n",ans);
return 0;
}
相關推薦
1594: [Usaco2008 Jan]猜數遊戲
題目連結 題目大意:N個數排成一列,有q個詢問,每個詢問告訴你區間[l,r]的最小值是多少(這N個數各不相同)。問你這q個詢問有沒有矛盾,有的話從哪裡開始有矛盾 題解:二分答案,現在檢驗前mid個詢
隨機猜數遊戲源代碼
源代碼 輸入 python true num random import div pytho from random import randint num=randint(1,50) a=0 while a==0: print‘請輸入答案‘ answer=
猜數遊戲
問題 是否 match out else return 退出 input main 使用Java編寫完成常見算法的程序,達到熟悉並運用java語言解決基本問題的目的。具體的題目可能在行課過程中會有調整,常見的參考的題目如下。 猜數遊戲,要求: (1)編寫一個方法用於產生1-
Java實驗項目二——猜數遊戲
1-1000 lean style 項目 比較 猜數遊戲 color return ase 1 /* 2 * Description:定義比較類,實現兩個數的比較 3 * 4 * */ 5 6 7 package compare; 8 9
實驗任務5-編寫猜數遊戲
成功 都是 選擇 message png blog random == ane 【程序題目】 編寫猜數遊戲 【程序設計思想】 首先用隨機方法輸出1-100的任意整數,輸入猜的數字,用if else 判斷與隨機數字的大小,輸出判斷的結果,當沒猜對的時候,用do while
【bzoj1594】猜數遊戲
在哪裏 min 依次 vector 包括 eof ron clas logs 1594: [Usaco2008 Jan]猜數遊戲 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 556 Solved: 225 Des
LintCode 662. 猜數遊戲
num ram ati 個數 每次 二分法 ntc api IT 我們正在玩猜數遊戲。 遊戲如下:我從 1 到 n 選擇一個數字。 你需要猜我選擇了哪個號碼。每次你猜錯了,我會告訴你這個數字是高還是低。你調用一個預定義的接口 guess(int num),它會返回 3 個可
LintCode 666. 猜數遊戲 II
等於 檢查 you int mon bsp AS 內容 更新 我們正在玩猜數遊戲, 遊戲內容如下:我在 1到 n 的範圍內選擇一個數作為待猜的數, 你需要來猜這個數,每次你猜錯的時候, 我會告訴你我選擇的這個數是比你說的數要高還是低, 但是, 當你猜這個數為 x 並且猜錯的
[bzoj1594]猜數遊戲
ios ems closed oid void splay down cst mem 主要是怎麽處理矛盾 矛盾的條件有$2$種: 第一種是當把所有相等的$a$都全部找到後,他們並沒有全聯通,所以矛盾,因為沒有兩個是相同的 第二種是在2組$(l,r,a)$,$(l1,r1,a
Python基礎之猜數遊戲
提示 -- value val 數字 隨機數序列 異常處理 例題 執行 例題一:猜數遊戲。在程序中預設一個0~9之間的整數,讓用戶通過鍵盤輸入所猜的數,如果大於預設的數,顯示“遺憾,太大了”;小於預設的數,顯示“遺憾,太小了”,如此循環,直至猜中該數,顯示“預測N次,你猜中
猜數遊戲--MOOC中習題
7-24 猜數字遊戲(15 分) 猜數字遊戲是令遊戲機隨機產生一個100以內的正整數,使用者輸入一個數對其進行猜測,需要你編寫程式自動對其與隨機產生的被猜數進行比較,並提示大了(“Too big”),還是小了(“Too small”),相等表示猜到了。如果猜到,則結束程式。程式還要求統計猜的次數,如
[BJOI2018]雙人猜數遊戲
題解: 徹徹底底的思維題???還是挺難的。。 首先連樣例解釋都沒給。。沒看題解搞了很久 大概就是 一個人要根據另一個人的決策來猜數 可以去看洛谷那篇題解的解釋 然後我們用$f[A/B][i][j][k]$ 表示第i次操作時,$A/B$能否判斷出(j,k) 然後這個挺好dp 另外如果$f[i-
一個猜數遊戲(面試題)
1987年的某一天,《金融時報》上出現了一則奇怪的競猜廣告,邀請銀行家和商人蔘加一個數字競猜比賽,參與者必須在0到100之間選擇一個整數寄回去。誰猜的數字最接近所有數字之和的平均數的三分之二,誰就是贏家。如果猜中數字的人不止一個,那麼就以隨機抽籤的方式選出唯一一個贏家,獎品是
Java 簡單猜數遊戲的設計
隨機函式產生100以內的數,5次機會。 import javax.swing.*; public class Hello{ public static void main(String[] args){ int i = (int)(Math.random()*10
二分猜數遊戲實現 coin1
這題需要在時間限制內贏100次二分猜數遊戲。 記得資料結構課上老師就說過,二分查詢的實現還是很容易錯的。一開始寫的版本總是用光次數猜不對。 網速比較慢的話就得先用其他題的賬戶登上去然後本地連線到900
python猜數遊戲
preinstall=5 #預設數值為5 guess=0 #初始化猜測數字 times=0 #猜數次數 print(" ------猜數字遊戲------
[lintcode] 1556.猜數遊戲 [Hard]
描述 為了進一步宣傳,Lintcode決定策劃一個猜數遊戲。 遊戲開始前,Lintcode會隨機保密地選擇一個不大於n的正整數x 讓玩家來猜,並提供一個長度為n的陣列a,a[i]表示玩家選擇整數i時需要付出的金錢。 每一輪遊戲,玩家可以任意選擇一個整數並付出相應的價錢,如果
猜數遊戲的程式碼和實驗文件中的說明,為了增加程式碼的複用性,將猜數字遊戲封裝為函式GuessSecret(maxtimes),將允許猜數字的最大次數maxtimes作為引數。在呼叫GuessSecret時
from random import * def GuessSecret(maxtimes): n=0; x = 0 secret = randint(0, 100)
WatchKit入門:建立一個簡單的猜數遊戲
轉自:http://www.cocoachina.com/ios/20150202/11087.html 本文由cocoaChina譯者小組成員@TurtleFromMars 翻譯自Appcoda,原作者:julian engel,編者注:再過幾個月Apple Wa
【Python初學】GUI猜數遊戲+打包(生成.exe可執行程式)
Python初學——GUI猜數遊戲 對於像我一樣的Python初學者,做練習總是像學C一樣從命令視窗輸出我們的程式,但是這樣子很無聊,不會變著花樣來。所以我在做Python練習時候,練習了一些有遊戲題目,但都是命令視窗式的遊戲,所以我就想把這種遊戲圖形化出來,