3 条题解
-
1
#include <bits/stdc++.h> //#define int long long using namespace std; const int N = 100005 , SN = 1005; int n , m , a[ N ]; int b[ N ]; int lenb; int q[ N ] , st[ SN ] , ed[ SN ]; int sum[ SN ] , add[ SN ]; void sortt( int id ) { for( int i = st[ id ] ; i <= ed[ id ] ; i ++ ) b[ i ] = a[ i ]; sort( b + st[ id ] , b + ed[ id ] + 1 ); } void modify( int l , int r , int v ) { int lx = q[ l ] , rx = q[ r ]; if( lx == rx ) { for( int i = l ; i <= r ; i ++ ) a[ i ] += v; sortt( lx ); return; } for( int i = l ; i <= ed[ lx ] ; i ++ ) a[ i ] += v; sortt( lx ); for( int i = lx + 1 ; i <= rx - 1 ; i ++ ) add[ i ] += v; for( int i = st[ rx ] ; i <= r ; i ++ ) a[ i ] += v; sortt( rx ); } int getnum( int id , int x ) { int l = st[ id ] , r = ed[ id ] , mid , ans = l - 1; while( l <= r ) { mid = ( l + r >> 1 ); if( b[ mid ] > x ) r = mid - 1; else ans = mid , l = mid + 1; } return ans - st[ id ] + 1; } int query( int l , int r , int x ) { int lx = q[ l ] , rx = q[ r ] , ans = 0; if( lx == rx ) { for( int i = l ; i <= r ; i ++ ) ans += ( a[ i ] <= x - add[ lx ] ); return ans; } for( int i = l ; i <= ed[ lx ] ; i ++ ) ans += ( a[ i ] <= x - add[ lx ] ); for( int i = lx + 1 ; i <= rx - 1 ; i ++ ) ans += getnum( i , x - add[ i ] ); for( int i = st[ rx ] ; i <= r ; i ++ ) ans += ( a[ i ] <= x - add[ rx ] ); return ans; } void init() { lenb = sqrt( n ); for( int i = 1 ; i <= ( n - 1 ) / lenb + 1 ; i ++ ) { st[ i ] = ( i - 1 ) * lenb + 1; ed[ i ] = min( i * lenb , n ); for( int j = st[ i ] ; j <= ed[ i ] ; j ++ ) q[ j ] = i , sum[ i ] += a[ j ]; sortt( i ); } } signed main() { cin >> n; for( int i = 1 ; i <= n ; i ++ ) scanf( "%d" , a + i ); init(); cin >> m; while( m -- ) { int opt , l , r , x; scanf( "%d%d%d%d" , & opt , & l , & r , & x ); if( opt == 1 ) { modify( l , r , x ); } if( opt == 2 ) { printf( "%d\n" , query( l , r , x ) ); } } return 0; } -
0
#include <bits/stdc++.h> using namespace std; int main() { int n = 10; vector<int> vec(n); for (int i = 0; i < n; i++) vec[i] = rand() % 20 + 1; for (int i = 0; i < n; i++) cout << vec[i] << ", "; cout << endl; sort(vec.begin(), vec.end()); for (int i = 0; i < n; i++) cout << vec[i] << ", "; cout << endl; int x; cin >> x; cout << upper_bound(vec.begin(), vec.end(), x) - vec.begin() << endl; return 0; } -
-1
#include <bits/stdc++.h> //#define int long long using namespace std; const int N = 100005 , SN = 1005;
int n , m , a[ N ]; int b[ N ]; int lenb; int q[ N ] , st[ SN ] , ed[ SN ]; int sum[ SN ] , add[ SN ];
void sortt( int id ) { for( int i = st[ id ] ; i <= ed[ id ] ; i ++ ) b[ i ] = a[ i ]; sort( b + st[ id ] , b + ed[ id ] + 1 ); }
void modify( int l , int r , int v ) { int lx = q[ l ] , rx = q[ r ];
if( lx == rx ) { for( int i = l ; i <= r ; i ++ ) a[ i ] += v; sortt( lx ); return; } for( int i = l ; i <= ed[ lx ] ; i ++ ) a[ i ] += v; sortt( lx ); for( int i = lx + 1 ; i <= rx - 1 ; i ++ ) add[ i ] += v; for( int i = st[ rx ] ; i <= r ; i ++ ) a[ i ] += v; sortt( rx );}
int getnum( int id , int x ) { int l = st[ id ] , r = ed[ id ] , mid , ans = l - 1; while( l <= r ) { mid = ( l + r >> 1 ); if( b[ mid ] > x ) r = mid - 1; else ans = mid , l = mid + 1; }
return ans - st[ id ] + 1;}
int query( int l , int r , int x ) { int lx = q[ l ] , rx = q[ r ] , ans = 0;
if( lx == rx ) { for( int i = l ; i <= r ; i ++ ) ans += ( a[ i ] <= x - add[ lx ] ); return ans; } for( int i = l ; i <= ed[ lx ] ; i ++ ) ans += ( a[ i ] <= x - add[ lx ] ); for( int i = lx + 1 ; i <= rx - 1 ; i ++ ) ans += getnum( i , x - add[ i ] ); for( int i = st[ rx ] ; i <= r ; i ++ ) ans += ( a[ i ] <= x - add[ rx ] ); return ans;}
void init() { lenb = sqrt( n ); for( int i = 1 ; i <= ( n - 1 ) / lenb + 1 ; i ++ ) { st[ i ] = ( i - 1 ) * lenb + 1; ed[ i ] = min( i * lenb , n ); for( int j = st[ i ] ; j <= ed[ i ] ; j ++ ) q[ j ] = i , sum[ i ] += a[ j ]; sortt( i ); } }
signed main() { cin >> n; for( int i = 1 ; i <= n ; i ++ ) scanf( "%d" , a + i ); init();
cin >> m; while( m -- ) { int opt , l , r , x; scanf( "%d%d%d%d" , & opt , & l , & r , & x ); if( opt == 1 ) { modify( l , r , x ); } if( opt == 2 ) { printf( "%d\n" , query( l , r , x ) ); } } return 0;}
- 1
信息
- ID
- 4
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 15
- 已通过
- 2
- 上传者