HDU 4768 (二分區間 漲姿勢)

2022-04-05 15:36:10 字數 1287 閱讀 1270

題意:告訴n組a,b,c,按照a + k * c生成等差數列,問這n組數列中哪個數字出現了奇數次以及出現了幾次,題目保證最多隻會出現乙個這種數字。

分析:讀完題並沒有思路,後來知道是二分區間,列舉是哪個數字出現了奇數次,算該數字之前一共有幾個數字,如果是奇數個,說明答案就在[l , mid]中。

ps:之前用二分只是列舉具體要求的數字,原來列舉區間也可以,真的漲姿勢。二分的時候 l = mid + 1,r = mid ;(一開始r = mid + 1,l = mid就無限迴圈,手算並沒有錯啊?很奇怪。。。)

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10 #include

11 #include 12 #include 13 #include 14

using

namespace

std;

15#define ll long long

16#define _cle(m, a) memset(m, a, sizeof(m))

17#define repu(i, a, b) for(int i = a; i < b; i++)

18#define repd(i, a, b) for(ll i = b; i >= a; i--)

19#define sfi(n) scanf("%d", &n)

20#define pfi(n) prllf("%d\n", n)

21#define inf 0x3f3f3f3f3f

22#define n 20010

23ll a[n],b[n],c[n];

24int

n;25 ll judge(ll p)///

p之前已經發了多少張傳單了

2634

return sum%2ll;35}

36int

main()

3747

if(!judge(r))

4852 ll mid =0ll;

53while(l

5461

///求具體有幾張

62 sum =0ll;

63 repu(i,0

,n)64

69 printf("

%i64d %i64d\n

",r,sum);70}

71return0;

72 }

ac

hdu 5875(ST 二分區間)

題意 給乙個序列,有n個數字和m次詢問。每次詢問給乙個區間,問這個區間從l開始一直對l後面的陣列取模,一直到r。分析 乙個較小的數字對乙個較大的數字取模,值不發生改變。所以每次只要找最近的比自己小的數字取模更新答案即可。用rmq維護區間最小值。每次查詢乙個區間就在這個區間內進行二分。如果左區間有比l...

HDU 4417 (二分 區間第k大)

查詢區間 l,r 中有多少數 比給定的 h 小。我們可以這麼想,h 一定會比 區間的第 x 大 第 x 1 小。怎麼確定 x。這是乙個單調的問題,所以二分 區間第 k 大就可以確定了。include include include include using namespace std const ...

二分查詢 二分區間 快速冪(二分冪)

include include using namespace std 二分查詢 初始區間 0,n 1 intbinarysearch int a,int left,int right,int x else return 1 二分 找出元素的區間左閉右開 初始區間 0,n intlower boun...