日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu4768 非常规的二分

發布時間:2025/6/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4768 非常规的二分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? n個社團給同學發傳單,同學一共有1--2^31這么多,每個社團有三個數A ,B ,C ,只有
滿足 A ,A + C ,A + C + C ...A + KC <= B 的學生才能得到傳單,問你誰收到的傳單數是奇數,題目保證給的測試數據要么沒有奇數的,要么只有一個是奇數個傳單.

思路:

? ? ?"題目保證給的測試數據要么沒有奇數的,要么只有一個是奇數個傳單." ,這句非常關鍵,我們二分枚舉1--2^31,對于mid,算出0--mid一共發出去tmp張傳單,如果tmp是偶數那么奇數的那個人一定不會在前面,因為只有一個奇數,其他的都是偶數,奇數 + 偶數 = 奇數,偶數+ 偶數 = 偶數,所以可以根據當前的數是不是偶數就能斷定奇數的那個人在不在mid前面.對于不存在的這個判定,我是前直接跑出所有的個數,也就是求出范圍INF以前的所有,如果偶數那么就不存在,否則就二分找,找到后在枚舉這個找到的人有多少個傳單,輸出來就行了.這個只是用二分的特性去節省時間,和以往的二分不同,因為他不是在單調函數上查找的.所以這個我感覺是一個非常規的二分.


#include<stdio.h>#define N 20000 + 100 typedef struct {__int64 A ,B ,C; }NODE;NODE node[N];__int64 minn(__int64 x ,__int64 y) {return x < y ? x : y; }__int64 solve(__int64 mid ,int n) {__int64 sum = 0;for(int i = 1 ;i <= n ;i ++){if(mid >= node[i].A){sum += ((minn(mid ,node[i].B) - node[i].A) / node[i].C + 1);}}return sum; }int main () {int n ,i;__int64 INF = 1;for(__int64 ii = 1 ;ii <= 31 ;ii ++)INF *= 2;while(~scanf("%d" ,&n)){for(i = 1 ;i <= n ;i ++)scanf("%I64d %I64d %I64d" ,&node[i].A ,&node[i].B ,&node[i].C); __int64 tmp = solve(INF ,n);if(tmp % 2 == 0){puts("DC Qiang is unhappy.");continue;} __int64 low ,up ,mid;low = 0 ,up = INF;__int64 ans_id = -1;while(low <= up){mid = (low + up) / 2;tmp = solve(mid ,n);//printf("%I64d******\n" ,tmp); if(tmp % 2){up = mid - 1;ans_id = mid;}else {low = mid + 1;}}__int64 ans_sum = 0;for(i = 1 ;i <= n ;i ++){if(ans_id <= node[i].B && (ans_id - node[i].A) % node[i].C == 0 && ans_id >= node[i].A)ans_sum ++;}printf("%I64d %I64d\n" ,ans_id ,ans_sum);}return 0; }



總結

以上是生活随笔為你收集整理的hdu4768 非常规的二分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。