題意:告訴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 #includeac8 #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 }
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...