NC19858戰爭 war 並查集 二分

2021-10-09 03:26:35 字數 2379 閱讀 2722

#nc19858戰爭(war)

如果後面的人和前面的人矛盾那麼後面的人一定說謊了,輸出他的位置。否則如果沒有說謊輸出k+1

k+1k+

1二分長度,因為如果二分的區間[l,mid]有人說謊那麼[r,mid]就不用判斷了。但是如果[l,mid]沒有人說謊,那麼我們就要將mid擴大繼續尋找說謊的人。仔細想想就是二分。在某個位置前面是沒有說謊的,但是後面一定就會有說話的,二分這個位置。

我們先將結構體按num

numnu

m從大到小排序,然後我們列舉每一種情況。

為什麼呢?因為我取了l

ll的max

maxma

x,和r

rr取了min

minmi

n。如果有不相交的區間那麼這兩個是l

>

rl>r

l>r的。

我們只要排除每種不可能的情況就可以了。

首先不可能的是,num

numnu

m相等但區間有兩兩不相交的

其次是,在某一段區間裡有更小的區間(此時的前者num

numnu

m是大於後者num

numnu

m的,按排序後的情況列舉)

比如說[1−

16]

[1-16]

[1−16]

最小值是20

2020

,[ 5−

10]

[5-10]

[5−10]

最小值是15

1515

,這種情況是不可能的(l

>fi

nd(r

)l>find(r)

l>fi

nd(r

)判斷)。

#include

#define inf 0x3f3f3f3f

#define dof 0x7f7f7f7f

#define endl '\n'

#define mem(a, b) memset(a, b, sizeof(a))

#define debug(case, x) cout << case << " : " << x << endl

#define open freopen("ii.txt", "r", stdin)

#define close freopen("oo.txt", "w", stdout)

#define io \

ios::sync_with_stdio(false); \

cin.tie(0); \

cout.tie(0)

#define pb push_back

using

namespace std;

//#define int long long

#define lson rt << 1

#define rson rt << 1 | 1

typedef

long

long ll;

typedef pair<

int,

int> pii;

typedef pair<

long

long

,long

long

> pii;

const

int maxn =

1e6+10;

inline

intread()

int x =0;

while

(ch >=

'0'&& ch <=

'9') x =

(x <<3)

+(x <<1)

+ ch -

'0', ch =

getchar()

;return x * f;

}struct node

} node[maxn]

,t[maxn]

;int n,m;

int fa[maxn]

;int

find

(int x)

bool

check

(int k)

for(

int i=

1; i<=k;)if

(l>r||l>

find

(r))

return

true

;while

(l<=r)

i=j;

}return

false;}

intmain()

printf

("%d\n"

,res)

;}

JLOI2015 戰爭排程 war

一開始看這題,毫無頭緒 不過發現n十分的小,最多只有10,想一想暴搜加優化。先試著打了打暴搜,從上往下列舉狀態,然後搜尋到子節點的時候,再統計答案,每個父節點的答案是兩個子節點答案的和,dfs x,y,z 表示當前搜到的點二進位制狀態為x,從根節點到底層打仗的狀態為y,然後此時要打仗的人有z個。然後...

Jzoj P3896 戰爭遊戲

n nn個點,m mm條無向邊,保證任意兩點間都連通。問對於這n nn個點而言,分別作為任意兩點間所有路徑的必經點的次數有多少次。必經點,假如a ba b a b的所有路徑都存在經過點c cc,則稱c cc為必經點 n 5 104 m 1 05 n 5 10 4,m 10 5 n 5 10 4,m ...

JLOI2015 戰爭排程

記憶體限制 256 mib 時間限制 1000 ms 標準輸入輸出 題目型別 傳統 評測方式 文字比較 臉哥最近來到了乙個神奇的王國,王國裡的公民每個公民有兩個下屬或者沒有下屬,這種關係剛好組成乙個 n 層的完全二叉樹。公民 i 的下屬是 2i 和 2i 1 最下層的公民即葉子節點的公民是平民,平民...