請叫我掉分小王子,嘿嘿嘿~
用寬搜,把每個#加入佇列,記錄step就好了~
//暴力真的會超時,www
//不明白自己的輸入輸出**有問題。。就是會wa,換成cin就好了。。
大概有兩種辦法:從前往後算和從後往前算。
首先,行列狀態是不互相影響的,所以可以變成一維的。
如果是從前往後,就需要計算每個人上下左右的步數的字首和,並相互抵消,看看抵消之後會不會出邊界~
如果是從後往前,就是倒著計算,從乙個點開始,乙個人想把這個點通過到處走成乙個盡可能大的區間,另乙個人想盡可能讓點留在區間裡,然後最後如果x落在區間裡,就相當於走不出去,否則就是走得出去。
移走乙個節點上的硬幣,其實就相當於把樹的直徑減少1或者2,當直徑為1的時候,移硬幣的人會輸(因為他沒辦法把硬幣一下子拿完)。所以就~
#include
#define ll long long
using
namespace std;
int a,b,n,l,dis[
200100
],s;
vector<
int> g[
200100];
void
dfs(
int u,
int f)
intmain()
dfs(1,
0);for
(int i=
1;i<=n;i++)if
(dis[i]
>dis[s]
) s=i;
dfs(s,0)
;for
(int i=
1;i<=n;i++
) l=
max(l,dis[i]-1
);if(l %3==
1) cout <<
"second"
"first"
}
和之前某一道題很像哦!
正反求兩遍,從s到各個點的距離,從n到各個點的距離。
然後對於每兩個點i、j,如果
s
−>i的
距離+t
−>j的
距離
s->i的距離+t->j的距離
s−>i的
距離+t
−>j的
距離和s
−>j的
距離+t
−>i的
距離
s->j的距離+t->i的距離
s−>j的
距離+t
−>i的
距離都大於s到t
的最短距
離−
1s到t的最短距離-1
s到t的最短
距離−1
,就可以修建公路!
二分答案+差分~
#include
#define ll long long
using
namespace std;
ll n,r,k,a[
500500
],b[
500500
],o,sum[
500500
],ss[
500500
],ans,x=
9223372036854775807ll
,y,mid,kk;
void
makesum()
intmain()
for(ll i =
1ll;i <= n;i ++
) sum[i]
= a[i]
+sum[i-
1ll]
,x =
min(x,sum[i]);
y = x+k;
while
(x <= y)
ss[i]
= ss[i-1]
+a[i]
+b[i];}
if(kk <
0ll) y = mid-
1ll;
else
} cout << ans << endl;
return0;
}
2019summer系列 第12場
給定乙個真分數p q p q 請你求出它的小數部分都包括0 9中的哪些數字。例如1 2 0.5,只包含數字5 1 3 0.33333 只包含數字3,1 7 0.142857142857 包含數字124578。input 兩個整數p和q,1 p q 1000000 output 從小到大輸出小數部分出...
2019summer系列 第四場
鎕鎕鎕 乙個貪心的小伙。嗯,那麼是需要用貪心了。把卡片按ai排序,取最大的ai所在的卡片,然後後邊的兩兩配對,取bi較大的卡片。注意從區域性到全域性!直接全域性是不可能的!榶榶榶 數論。記所有位的數字的和為s,它的最小非1因子為ans1 記位數為n,那麼n位1等於 10 n 1 9 10 n 1 9...
2019summer系列 第六場
zzy的神奇橫跳真是太神奇啦!btw,好好理解下質因數分解!b a 1k a 2l a 3m an b a1 k a2 l a3 m an b a1k a2l a3m an?所以影響b的個數的,就只是k m l 中,最小的啦!zzy666 include define ll long long us...