1 #include <iostream> 2 #include <algorithm> 3 #include <cmath> 4 using namespace std; 5 typedef long long LL; 6 const int N = 1010; 7 LL A[N]; 8 LL B[N]; 9 LL so_A[N * N]; 10 LL n,m,L,R; 11 int t = 0; 12 LL check1(LL num){ 13 LL l = 0,r = t - 1; 14 while(l < r){ 15 LL mid = (l + r) >> 1; 16 if(so_A[mid] >= num)r = mid; 17 else l = mid + 1; 18 } 19 if(so_A[r] < num)return -1; 20 //cout << "11 " << r << " 11" << endl; 21 return r; 22 } 23 LL check2(LL num){ 24 LL l = 0,r = t - 1; 25 while(l < r){ 26 LL mid = (l + r + 1) >> 1; 27 if(so_A[mid] <= num)l = mid; 28 else r = mid - 1; 29 } 30 //cout << "22 " << r << " 22" << endl; 31 if(so_A[r] > num)return -1; 32 return r; 33 } 34 int main(){ 35 cin >> n >> m >> L >> R; 36 for(int i = 1;i <= n;i ++)cin >> A[i]; 37 for(int i = 1;i <= m;i ++)cin >> B[i]; 38 for(int i = 1;i <= n;i ++){ 39 A[i] += A[i - 1]; 40 //cout << A[i] << endl; 41 } 42 for(int i = 1;i <= m;i ++){ 43 B[i] += B[i - 1]; 44 } 45 for(int i = 1;i <= n;i ++){ 46 for(int j = i;j <= n;j ++){ 47 so_A[t ++] = A[j] - A[i - 1]; 48 } 49 } 50 sort(so_A,so_A + t); 51 LL ans = 0; 52 for(int i = 1;i <= m;i ++){ 53 for(int j = i;j <= m;j ++){ 54 LL x = B[j] - B[i - 1]; 55 LL l = L / x; 56 LL r = R / x; 57 LL t1,t2; 58 if(l * x == L)t1 = l; 59 else t1 = l + 1; 60 t2 = r; 61 //cout << t1 << " " << t2 << endl; 62 LL d1 = check1(t1); 63 LL d2 = check2(t2); 64 if(d2 == -1)continue; 65 if(d1 == -1)continue; 66 ans += (d2 - d1 + 1); 67 } 68 } 69 cout << ans << endl; 70 return 0; 71 }
知道是二分查找后,开始做题,然后一直wa,此次经历告诉我,二分题边界一定要找好,调自闭了...