Turing Tree HDU - 3333 (Fenwick tree, seeking offline Interval element type)

After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because Turing Tree could easily have the solution. As well, wily 3xian made lots of new problems about intervals. So, today, this sick thing happens again...

Now given a sequence of N numbers A1 , A2, ..., AN and a number of Queries (i, j) (1≤i≤j≤N). For each Query (i, j), you are to caculate the sum of distinct values in the subsequence Ai , Ai + 1, ..., Aj.
given a sequence of length n, for a given m queries, each query interval [L, R] and the range of different elements.
INPUT
. Of The First Line T IS AN Integer (. 1 ≤ T ≤ 10), indecating The Number of TestCases below
the For each Case, the format Will The INPUT BE like the this:

  • Line 1: N (1 ≤ N ≤ 30,000).
  • Line 2: N integers A1, A2, ..., AN (0 ≤ Ai ≤ 1,000,000,000).
  • Line 3: Q (1 ≤ Q ≤ 100,000), the number of Queries.
  • Next Q lines: each line contains 2 integers i, j representing a Query (1 ≤ i ≤ j ≤ N) first integer T, denotes the number of data sets.
    For each test, the first row of an integer n, the number of elements in the sequence.
    The second row of n elements.
    The third line of an integer q, the number of groups of those questioned.
    Next q lines of two integers L and R & lt
    the Output
    the For each Query, Print The values of SUM of DISTINCT The subsequence specified in Line One.
    For each query, the result output.
    The Input the Sample
    2
    . 3
    . 1. 4. 1
    2
    . 1 2
    2. 3
    . 5
    . 1. 1. 1. 3 2
    . 3
    . 1. 5
    2. 4
    . 3. 5
    the Sample the Output
    . 1
    . 5
    . 6
    . 3
    . 6

Italian title:
English translation below Chinese
ideas:
first section information read in, and then sort the right point, then each section information off-line processing, and use a map to maintain a position of the last occurrence of x values.

See details Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bits/stdc++.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 30010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/

int q;
int n;
ll tree[maxn];
int lowbit(int x)
{
    return -x&x;
}
void add(int x,ll val)
{
    while(x<maxn)
    {
        tree[x]+=val;
        x+=lowbit(x);
    }
}
ll ask(int x)
{
    ll res=0;
    while(x)
    {
        res+=tree[x];
        x-=lowbit(x);
    }
    return res;
}
ll a[maxn];
map<ll,int> vis;
struct node
{
    int l,r;
    int id;
}b[100010];

bool cmp(node aa,node bb)
{
    return aa.r<bb.r;
}
bool cmp2(node aa,node bb)
{
    return aa.id<bb.id;
}
ll ans[100010];
int main()
{
    //freopen("D:\\code\\text\\input.txt","r",stdin);
    //freopen("D:\\code\\text\\output.txt","w",stdout);
    gbtb;
    int t;
    cin>>t;
    while(t--)
    {   
        MS0(tree);
        vis.clear();
        cin>>n;
        repd(i,1,n)
        {
            cin>>a[i];
        }
        int q;
        cin>>q;
        repd(i,1,q)
        {
            cin>>b[i].l;
            cin>>b[i].r;
            b[i].id=i;
        }
        sort(b+1,b+1+q,cmp);
        int p=1;
        repd(i,1,q)
        {
            while(p<=b[i].r)
            {
                if(vis[a[p]])
                {
                    add(vis[a[p]],-a[p]);
                    add(p,a[p]);
                    vis[a[p]]=p;
                }else
                {
                    vis[a[p]]=p;
                    add(p,a[p]);
                }
                p++;
            }
            ans[b[i].id]=ask(b[i].r)-ask(b[i].l-1);
        }
        sort(b+1,b+1+q,cmp2);
        repd(i,1,q)
        {
            cout<<ans[b[i].id]<<endl;
        }
    }
    
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}



Guess you like

Origin www.cnblogs.com/qieqiemin/p/11311859.html