題目:b. stadium and games
分析:問題可以轉化為下面的等式求解問題:
由於n在10^18範圍內,所以k的範圍是從0到63即可,這樣就可以列舉k,二分m,然後所有符合條件的
就是答案了。
注意這裡資料範圍的處理,不注意的話就會溢位的。
#include #include #include #include using namespace std;typedef long long ll;
ll a[100005];
ll c;
void solve(ll n)
{ ll k;
for(k=0;k<63;k++)
{ll l=1,r=3*1e9;
if(k>=30) r=1000000000000000000>>k;
while(l<=r)
{ll mid=(l+r)>>1;
ll ans=(((ll)1<2*n) r=mid-1;
else if(ans<2*n) l=mid+1;
else
{if(mid&1) a[c++]=mid*((ll)1<>n)
{c=0;
solve(n);
sort(a,a+c);
if(c==0) puts("-1");
else
{for(i=0;i
Codeforces 1119B 貪心二分
不改變原陣列的值,複製乙份,要求1 k連續,則1 mid區間內判斷 子陣列從大到小排序後,每兩個相差不大,比較均勻 i 2 倒著的目的是前大後小 能裝前一定能裝後 盡量裝更多的 累積高度和 跳著累積高度和,如果 h 可增加更多的瓶子,否則高度太多瓶子太多,減小瓶子數量 const int maxn ...
codeforces 321 B 排序 二分
題意 n個人,每個人有money和friendship,求最大的friendship和,要求所選的人money之差小於d 思路 先按money排序,然後掃一遍,兩個指標l,r記錄當前二分範圍,prem記錄當前所選人中最小的money。注意 如果二分找到k,a i m d a k m,當前t就等於a ...
Codeforces325 D 並查集維護連通性
參考 大牛blog 思路 因為是環,所以可以複製一下圖,先判斷一下和他是不是和與他相鄰的8個之一的乙個障礙使得構成了乙個環,環就是乙個連通,用並查集維護即可 如果沒有就ans 然後並把這個點加入。大致意思就是這樣。include include include include include inc...