先对区间左边界排序,在对右边界左二分查找
1 // you can use includes, for example: 2 #include <algorithm> 3 4 // you can write to stdout for debugging purposes, e.g. 5 // cout << "this is a debug message" << endl; 6 class node 7 { 8 public: 9 int left; 10 int right; 11 node(int l,int r):left(l),right(r){} 12 bool operator<(const node &other)const 13 { 14 if(left < other.left) 15 { 16 return true; 17 } 18 else if(left > other.left) 19 { 20 return false; 21 } 22 else 23 { 24 return right<=other.right; 25 } 26 } 27 }; 28 int binary_ser(const vector<node> &v,int s,int e,int target) 29 { 30 while(s <= e) 31 { 32 int mid = s+(e-s)>>1; 33 if(v[mid].left == target) 34 { 35 return mid; 36 } 37 else if(v[mid].left > target) 38 { 39 e = mid-1; 40 } 41 else 42 { 43 s = mid+1; 44 } 45 } 46 return s; 47 } 48 int solution(vector<int> &A) { 49 // write your code in C++11 50 vector<node> v; 51 for(int i = 0 ; i < A.size() ; ++i) 52 { 53 v.push_back(node(i-A[i],i+A[i])); 54 } 55 sort(v.begin(),v.end()); 56 int res = 0; 57 for(int j = 0 ; j < v.size() ; ++j) 58 { 59 int tmp = binary_ser(v,j+1,v.size()-1,v[j].right); 60 res += tmp-j-1; 61 } 62 return res; 63 }