#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 最下層的公民即葉子節點的公民是平民,平民...