题目链接:hdu_5919_Sequence II

题意:

给你n个数,m个询问,每次问你一个区间中每一种数在区间中第一次出现的位置的中位数,强制在线。

题解:

一看就是主席树搞,不过这里要询问第一次出现的位置,有个技巧就是倒着将数插进去,如果有相同的数,就把位置靠后的数的贡献取消掉,这样查询的时候就只需要查询root[l]了,因为root[l]包括了l到n的信息,前面已经只保留了相同数的最前面的位置,所以查询一共有多少种数时直接查询root[l]的l到r就行了。

 #include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int N=2e5+;
struct node{int l,r,sum;}T[*N]; int t,n,m,a[N],pre[N],root[N],tot,ic=; void update(int &x,int y,int pos,int val,int l=,int r=n)
{
T[++tot]=x?T[x]:T[y],T[tot].sum+=val,x=tot;
if(l==r)return;
int m=l+r>>;
if(pos<=m)update(T[x].l,T[y].l,pos,val,l,m);
else update(T[x].r,T[y].r,pos,val,m+,r);
} int query(int x,int k,int l=,int r=n)
{
if(l==r)return l;
int m=l+r>>;
if(k<=T[T[x].l].sum)return query(T[x].l,k,l,m);
return query(T[x].r,k-T[T[x].l].sum,m+,r);
} int getsum(int x,int L,int R,int l=,int r=n)
{
if(L<=l&&r<=R)return T[x].sum;
int m=l+r>>,ans=;
if(L<=m)ans+=getsum(T[x].l,L,R,l,m);
if(R>m)ans+=getsum(T[x].r,L,R,m+,r);
return ans;
} int main()
{
scanf("%d",&t);
while(t--)
{
printf("Case #%d: ",ic++);
scanf("%d%d",&n,&m);
tot=;
F(i,,n)scanf("%d",a+i);
for(int i=n;i>;i--)
{
if(pre[a[i]])update(root[i],root[i+],pre[a[i]],-);
update(root[i],root[i+],i,);
pre[a[i]]=i;
}
int ans=,l,r,sum;
F(i,,m)
{
scanf("%d%d",&l,&r);
l=(l+ans)%n+,r=(r+ans)%n+;
if(l>r)l^=r,r^=l,l^=r;
sum=getsum(root[l],l,r);
printf("%d%c",ans=query(root[l],sum+>>)," \n"[i==m]);
}
while(tot)T[tot].l=T[tot].r=T[tot].sum=,tot--;
F(i,,n)root[i]=,pre[a[i]]=;
}
return ;
}

hdu_5919_Sequence II(主席树)的更多相关文章

  1. HDU 5919 Sequence II 主席树

    Sequence II Problem Description   Mr. Frog has an integer sequence of length n, which can be denoted ...

  2. HDU5919 Sequence II(主席树)

    Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...

  3. HDU 5919 -- Sequence II (主席树)

    题意: 给一串数字,每个数字的位置是这个数第一次出现的位置. 每个询问对于序列的一个子区间,设一共有k个不同的数,求第ceil(k/2)个数的位置. 因为强制在线,所以离线乱搞pass掉. 主席树可解 ...

  4. hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)

    题目链接 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2 ...

  5. Sequence II HDU - 5919(主席树)

    Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...

  6. HDU 5919 Sequence II(主席树)题解

    题意:有A1 ~ An组成的数组,给你l r,L = min((l + ans[i - 1]) % n + 1, (r + ans[i - 1]) % n + 1),R = max((l + ans[ ...

  7. HDU--5519 Sequence II (主席树)

    题目链接 2016年长春ccpc I 题 题目大意 : 给你n(n≤2∗105n≤2∗105)个数,每个数的大小 0<Ai≤2∗10^5   0<Ai≤2∗10^5. 再给你m(m≤2∗1 ...

  8. HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)

    HDU 5919 题意: 动态处理一个序列的区间问题,对于一个给定序列,每次输入区间的左端点和右端点,输出这个区间中:每个数字第一次出现的位子留下, 输出这些位子中最中间的那个,就是(len+1)/2 ...

  9. SPOJ3267 D-query 离线+树状数组 在线主席树

    分析:这个题,离线的话就是水题,如果强制在线,其实和离线一个思路,然后硬上主席树就行了 离线的代码 #include <iostream> #include <stdio.h> ...

随机推荐

  1. iOS 加载Image的两种方式

    Apple官方文档对于加载image提供了两个方法 + (nullable UIImage *)imageNamed:(NSString *)name; + (nullable UIImage *)i ...

  2. linux kernel 编译

    lin

  3. 记JavaScript的入门学习(一)

    2016年11月20日算是每天都会利用点时间去思考,去学习,接下来便是我学习JavaScript的前前后后,希望早日学完JavaScript和jQuery 之前学校毕业设计选择了一个如下图的题目 希望 ...

  4. 诡异的数学,数字问题 - leetcode

    134. Gas Station 那么这题包含两个问题: 1. 能否在环上绕一圈? 2. 如果能,这个起点在哪里? 第一个问题,很简单,我对diff数组做个加和就好了,leftGas = ∑diff[ ...

  5. [MFC] 编辑框 EditControl 输入数字范围限制

    在MFC中,项目需要对编辑框EditControl的数字输入范围进行限制,主要有以下实现方式,各有优缺点,个人推荐第三种. 第一种:添加变量 为编辑框添加int.float变量的时候,可以填写最大值与 ...

  6. CSS3 六边形绘制

    把一个104px的div放在它们之间,设置一个背景颜色: width: 0; border-bottom: 30px solid #6C6; border-left: 52px solid trans ...

  7. swift3.0 原生GET请求 POST同理

    swift3.0 原生GET请求  POST同理 func getrequest(){ let url = URL(string: "http://117.135.196.139:" ...

  8. 敏捷开发(十一)- Scrum Sprint评审会议

    本文主要是为了检测你对SCRUM 评审会议的了解和使用程度, 通过本文你可以检测一下     1.你们的SCRUM 评审会议的过程和步骤    2.SCRUM 评审会议的输出结果一.会议目的     ...

  9. HDU 5886 Tower Defence

    树的直径. 比赛的时候想着先树$dp$处理子树上的最长链和次长链,然后再从上到下进行一次$dfs$统计答案,和$CCPC$网络赛那个树$dp$一样,肯定是可以写的,但会很烦.......后来写崩了. ...

  10. C#模板打印excel

    using Microsoft.Office.Interop.Excel; //引用   public void PrintPriviewExcelFile(string filePath) {    ...