1. 程式人生 > >1594: [Usaco2008 Jan]猜數遊戲

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時需要付出的金錢。 每一輪遊戲,玩家可以任意選擇一個整數並付出相應的價錢,如果

WatchKit入門:建立一個簡單的遊戲

轉自:http://www.cocoachina.com/ios/20150202/11087.html 本文由cocoaChina譯者小組成員@TurtleFromMars 翻譯自Appcoda,原作者:julian engel,編者注:再過幾個月Apple Wa

【Python初學】GUI遊戲+打包(生成.exe可執行程式)

Python初學——GUI猜數遊戲 對於像我一樣的Python初學者,做練習總是像學C一樣從命令視窗輸出我們的程式,但是這樣子很無聊,不會變著花樣來。所以我在做Python練習時候,練習了一些有遊戲題目,但都是命令視窗式的遊戲,所以我就想把這種遊戲圖形化出來,