标签:
第一行是一个t表示有t组测试案例
对于每个询问,输出一个整数,表示看到的数字在询问的范围内的数的个数(包括x和y)
1 10 1 2 3 4 5 6 7 8 9 10 3 1 10 2 2 11 12
10 1 0
此题就是搜索, 没什么好说的, 先排序。
接着 进行搜索。 注意的是, 数列里可能没有你找到的数。 此时只能进行模糊搜索, 找该数在数列中 是哪两个数 夹击着它( 不考虑边界情况下 )。 当然,
模糊二分搜索下, 边界搜索也是不正确的, 所以需要进行 边界判断, 矫正。
code:
#include <cstdio> #include <algorithm> #include <iostream> using namespace std; const int all = 100005; int m[ all ]; int bin_find( int, int, int, bool ); int main(void) { int t, n, st, en, d, tmp; //freopen( "E://test.txt", "rw+", stdin ); scanf( "%d", &t ); while( t -- ) { scanf( "%d", &n ); for( int i=1; i <= n; ++ i ){ scanf( "%d", m+i ); } sort( m+1, m+n+1 ); scanf( "%d", &d ); while( d -- ){ scanf( "%d%d", &st, &en ); tmp = st; if( ( en < m[1] || st > m[n] ) ){ st = 0; en = 1; } else{ st = tmp <= m[1] ? 0 : bin_find( 1, n, tmp, true ); en = en >= m[n] ? n+1 : bin_find( 1, n, en, false ); } printf( "%d\n", en-st-1 ); } } return 0; } int bin_find( int l, int r, int num, bool isleft ) { if( r-l <= 1 ){ if( isleft ){ return l; } else{ return r; } } if( isleft ){ if( num == m[l] ){ return l; } } else if( num == m[r] ){ return r; } int mid = (l+r)/2; if( m[mid] == num ){ if( isleft ){ return bin_find( l, mid, num, isleft ); } else{ return bin_find( mid, r, num, isleft ); } } else if( m[mid] < num ){ return bin_find( mid, r, num, isleft ); } else{ return bin_find( l, mid, num, isleft ); } }
标签:
原文地址:http://www.cnblogs.com/seana/p/5325556.html