BestCoder 33 簡要題解

2021-06-29 03:49:07 字數 2010 閱讀 8244

真是傷心。。。這場比賽我兩個題在20min中全部做完,全部因為忘了特判導致fst,我是sb。。。

最水的題,純比手速,結果我為了搶時間忘記特判,最後fst掉了。。。

要特判的情況就是輸出的答案為0的情況。。。

#include 

#include

#include

#include

#include

#define maxn 500

using

namespace

std;

char s[maxn];

int ans[maxn],ss[maxn];

int main()

for(int i=1;i<=len;i++)

ans[i]=(ans[i]+ss[i])%b;

}int tmp=maxn-1;

while(!ans[tmp]&&tmp>=1) tmp--;

if(!tmp) printf("0"); //坑爆了!!!

for(int i=tmp;i>=1;i--)

printf("\n");

}return

0;}

還是特判,

n>

1 時最終答案為2n

−2,n=1

時顯然答案為1。。。

但是僅僅這些還不夠,由於題目中所有數的範圍在1e18範圍內,做乘法時可能爆long long,因此要用快速加,然後如果n=

1,p=

1 時答案為0,顯然n=

1 時只輸出

1 是錯的,要輸出1 mod p

#include 

#include

#include

using

namespace

std;

typedef

long

long

int ll;

ll mul(ll a,ll b,ll p)

return ans;

}ll fastpow(ll base,ll pow,ll p)

return ans;

}int main()

ll ans=fastpow(2,n,p);

ans=(ans-2+p)%p;

printf("%i64d\n",ans);

}return

0;}

標準做法是dp。。。不是很好想。。。。

這裡我用的做法是參考別人的一種非常巧妙的二分+深搜。我們可以先按照每個題目最早可以開始做的時刻(li

−ti)公升序排序,顯然所有題目權值之和

當然,這樣的爆搜有很多可以剪枝的地方,我們可以預處理出排序後的題目權值的字首和,如果在搜尋過程中發現,如果1~當前題都做出來,仍然做不到w分,那麼說明當前的dfs狀態顯然是無解的,直接退出。

#include 

#include

#include

#include

#include

#define maxn 100

using

namespace

std;

typedef

long

long

int ll;

struct prob

probs[maxn];

ll sum[maxn];

int n,w;

bool cmp(prob a,prob b)

bool dfs(int x,int t,ll solved) //zuo le x ti,shi jian yong le time,zuo chu le solved fen

int main()

while(lowerbound<=upperbound)

else lowerbound=mid+1;

}printf("%d\n",ans);

}return

0;}

BestCoder 31 簡要題解

zhw神犇出題就是強啊。john 在 x 軸上擁有 n個點,他們的座標分別為 x i 0 i 0,1,2,n 1 他想知道有多少對 b 滿足 x b x a k a。題解 對於每個點,二分它右邊離他最遠 但是又在距離 k 內的點,然後加到答案裡,這樣做複雜度是nl ogn的,由於pretest太水,...

題解 CF1485 簡要題解

奇怪的難度。當 b 2 的時候再操作,操作次數是一定的。因此 b 的變化量很小,暴力列舉。考慮哪個數不同,然後不同後可以選擇的區間是什麼。會發現中間夾著的區間選兩遍,旁邊的選一遍。做字首和好了。簡單轉化發現一定要滿足 a k b 1 k。列舉 b 貢獻式帶有乙個 min 找到其分割點,前一部分直接求...

走迷宮 簡要題解

走迷宮,帶起點終點 有傳送門,傳送門個數不超過 26 個 不會 我們可以考慮把每個點能到的點連邊 二維壓到一維,常見 trick 於是我們有乙個很顯然的想法 點到傳送門連 0 權值的邊 但是這樣是錯的,因為我們經過傳送門必須得進去 紅色是邊,藍色是最短路 於是如果乙個點能到傳送門,我們就直接把傳送門...