当前位置:编程学习 > C/C++ >>

HDU 3333 树状数组+离线处理

这道题和HDU3874完全一样。

HDU3874解题报告


当然只是数据加强了而已。

唯一的区别就是每个值是10^9,所以要离散化,直接STL搞之,然后下面处理的过程就和3874完全一样了。

注意中间值超int就可以了。

最近这种题特别多,看来得多加强这方面的练习了。

 

#include <iostream>   
#include <cstdio>   
#include <algorithm>   
#include <string>   
#include <cmath>   
#include <cstring>   
#include <queue>   
#include <set>   
#include <vector>   
#include <stack>   
#include <map>   
#include <iomanip>   
#define PI acos(-1.0)   
#define Max 2505   
#define inf 1<<28   
#define LL(x) ( x << 1 )   
#define RR(x) ( x << 1 | 1 )   
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )   
#define ll __int64   
#define mem(a,b) memset(a,b,sizeof(a))   
#define mp(a,b) make_pair(a,b)   
#define PII pair<int,int>   
using namespace std;  
  
  
inline void RD(int &ret) {  
    char c;  
    do {  
        c = getchar();  
    } while(c < '0' || c > '9') ;  
    ret = c - '0';  
    while((c=getchar()) >= '0' && c <= '9')  
        ret = ret * 10 + ( c - '0' );  
}  
#define N 30005   
int a[N] ;  
int b[N] ;  
int pos[N] ;  
int n ;  
int vis[N] ;  
struct kdq{  
    int s , e , id ;  
}Q[N * 10] ;  
bool cmp(const kdq&a ,const kdq&b){  
    if(a.e == b.e)return a.s < b.s ;  
    return a.e < b.e ;  
}  
ll c[N] ;  
ll ans[N * 10] ;  
void update(int po ,int num){  
    for (int i = po ; i <= n ; i += i & (-i) )c[i] += num ;  
}  
ll sum(int po){  
    ll ans = 0 ;  
    for (int i = po ; i >= 1 ; i -= i & (-i))ans += c[i] ;  
    return ans ;  
}  
void init(){  
    mem(c ,0) ;  
    mem(vis ,0) ;  
}  
int main() {  
    int T ;  
    cin >> T ;  
    while( T -- ){  
        init() ;  
        cin >> n ;  
        for (int i = 1 ; i <= n ; i ++ ){  
            RD(a[i]) ;  
            b[i] = a[i] ;  
        }  
        int m ;  
        cin >> m ;  
        for (int i = 0 ; i < m ; i ++ ){  
            RD(Q[i].s) ;  
            RD(Q[i].e) ;  
            Q[i].id = i ;  
        }  
        sort(Q , Q + m ,cmp) ;  
        sort(b + 1, b + n + 1) ;  
        int dd = unique(b + 1, b + n + 1) - b ;  
        for (int i = 1 ; i <= n ; i ++ ){  
            pos[i] = lower_bound(b ,b + n ,a[i]) - b + 1 ;  
        }  
        int now = 1 ;  
        for (int i = 0 ; i < m ; i ++ ){  
            while(Q[i].e >= now){  
                if(vis[pos[now]]){  
                    update(vis[pos[now]] ,-a[now]) ;  
                }  
                vis[pos[now]] = now ;  
                update(vis[pos[now]] , a[now]) ;  
                now ++ ;  
            }  
            ans[Q[i].id] = sum(Q[i].e) - sum(Q[i].s - 1) ;  
        }  
        for (int i = 0 ; i < m ;i ++ ){  
            printf("%I64d\n",ans[i]) ;  
        }  
    }  
    return 0 ;  
}  

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2505
#define inf 1<<28
#define LL(x) ( x << 1 )
#define RR(x) ( x << 1 | 1 )
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )
#define ll __int64
#define mem(a,b) memset(a,b,sizeof(a))
#define mp(a,b) make_pair(a,b)
#define PII pair<int,int>
using namespace std;


inline void RD(int &ret) {
    char c;
    do {
        c = getchar();
    } while(c < '0' || c > '9') ;
    ret = c - '0';
    while((c=getchar()) >= '0' && c <= '9')
        ret = ret * 10 + ( c - '0' );
}
#define N 30005
int a[N] ;
int b[N] ;
int pos[N] ;
int n ;
int vis[N] ;
struct kdq{
    int s , e , id ;
}Q[N * 10] ;
bool cmp(const kdq&a ,const kdq&b){
    if(a.e == b.e)return a.s < b.s ;
    return a.e < b.e ;
}
ll c[N] ;
ll ans[N * 10] ;
void update(int po ,int num){
    for (int i = po ; i <= n ; i += i & (-i) )c[i] += num ;
}
ll sum(int po){
    ll ans = 0 ;
    for (int i = po ; i >= 1 ; i -= i & (-i))ans += c[i] ;
    return ans ;
}
void init(){
    mem(c ,0) ;
    mem(vis ,0) ;
}
int main() {
    int T ;
    cin >> T ;
    while( T -- ){
        init() ;
        cin >> n ;
        for (int i = 1 ; i <= n ; i ++ ){
            RD(a[i]) ;
            b[i] = a[i] ;
        }
        int m ;
        cin >> m ;
        for (int i = 0 ; i < m ; i ++ ){
            RD(Q[i].s) ;
            RD(Q[i].e) ;
            Q[i].id = i ;
        }
        sort(Q , Q + m ,cmp) ;
        sort(b + 1, b + n + 1) ;
        int dd = unique(b + 1, b + n + 1) - b ;
        for (int i = 1 ; i <= n ; i ++ ){
            pos[i] = lower_bound(b ,b + n ,a[i]) - b + 1 ;
        }
        int now = 1 ;
        for (int i = 0 ; i < m ; i ++ ){
            while(Q[i].e >= now){
                if(vis[pos[now]]){
                    update(vis[pos[now]] ,-a[now]) ;
                }
                vis[pos[now]] = now ;
                update(vis[pos[now]] , a[now]) ;
                now ++ ;
            }
            ans[Q[i].id] = sum(Q[i].e) - sum(Q[i].s - 1) ;
        }
        for (int i = 0 ; i < m ;i ++ ){
            printf("%I64d\n",ans[i]) ;
        }
    }
    return 0 ;
}

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,