hdu 3333 Turing Tree(图灵树,线段树,离散化)

题目大意:

求区间内不同的数字的和。这题用一般性的线段树写的时候没法处理相同的数字。

解题思路:

首先离散化,因为数字太大。

然后读入所有的询问区间,以右端为基准进行排序。这样能保证如果某个数字前面出现过,在原来位置删去,在新位置插入不会影响结果。因为越往后面,区间的右端越大。

然后线段树查询区间和的时候不变。

下面是代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 120009
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL __int64

LL sum[maxn];

void build(int l,int r,int rt)
{
    sum[rt]=0;
    if(l==r)return ;
    int m =(l+r)>>1;
    build(lson);
    build(rson);
}
void pushup(int rt)
{
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void update(int l,int r,int rt,int p,int flag,int num)
{
    if(l==r)
    {
        sum[rt]+=flag*num;
        return ;
    }
    int m = (l+r)>>1;
    if(m>=p)update(lson,p,flag,num);
    else update(rson,p,flag,num);
    pushup(rt);
}
LL query(int l,int r,int rt,int L,int R)
{
    if(l>=L&&r<=R)return sum[rt];
    int m =(l+r)>>1;
    LL ans =0;
    if(m>=L) ans += query(lson,L,R);
    if(m<R)  ans += query(rson,L,R);
    return ans ;
}
struct node
{
    int l,r,id;
} nod[100009];

bool cmp(node a,node b)
{
    return a.r<b.r;
}

struct Tem
{
    int a,id;
} tem[30009];

bool cmp1(Tem x,Tem y)
{
    return x.a<y.a;
}
bool cmp2(Tem x,Tem y)
{
    return x.id<y.id;
}
int main()
{
    int n,m,i,j,T;
    LL an[100009];
    int a1[30009];
    int vis[30009];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
            scanf("%d",&tem[i].a);
            tem[i].id=i+1;
        }
        sort(tem,tem+n,cmp1);
        a1[tem[0].id]=1;

        for(i=1; i<n; i++)
        {
            a1[tem[i].id]=a1[tem[i-1].id];
            if(tem[i].a!=tem[i-1].a)a1[tem[i].id]++;
        }
        sort(tem,tem+n,cmp2);

        scanf("%d",&m);
        for(i=0; i<m; i++)
        {
            scanf("%d%d",&nod[i].l,&nod[i].r);
            nod[i].id=i;
        }
        sort(nod,nod+m,cmp);
        j=1;
        memset(vis,0,sizeof(vis));
        build(1,n,1);
        for(i=0; i<m; i++)
        {
            while(j<=nod[i].r)
            {
                if(vis[a1[j]]!=0)
                    update(1,n,1,vis[a1[j]],-1,tem[j-1].a);
                update(1,n,1,j,1,tem[j-1].a);
                vis[a1[j]]=j;
                j++;
            }
            an[nod[i].id] =query(1,n,1,nod[i].l,nod[i].r);
        }
        for(i=0; i<m; i++)
            printf("%I64d\n",an[i]);
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值