传送门

文章目录

  • 题意:
  • 思路:

题意:

给一个长度为nnn的序列,每次一个询问[l,r][l,r][l,r],求其中数第一次出现的位置的中位数。

思路:

先考虑一下如何求区间内不同数的个数。
因为要求位置的中位数,我们考虑以位置建立线段树。因为要求第一次出现的位置,我们倒着插入,记pre[i]pre[i]pre[i]为iii上次出现的位置,每次插入的时候都将当前数的位置+1+1+1,pre[i]pre[i]pre[i]的位置−1-1−1,让后可持久化一下,这样当询问[l,r][l,r][l,r]的时候就直接询问第lll棵树的[l,r][l,r][l,r]内的和。
我们求出来了区间不同数的个数sumsumsum,那么中位数的位置就是⌊sum+12⌋\left \lfloor \frac{sum+1}{2} \right \rfloor⌊2sum+1​⌋,也就是查询第lll棵树的第⌊sum+12⌋\left \lfloor \frac{sum+1}{2} \right \rfloor⌊2sum+1​⌋个大数即可。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int a[N],pre[N];
int root[N],tot;
struct Node
{int l,r;int sum;
}tr[N*40];void insert(int p,int &q,int l,int r,int x,int c)
{q=++tot; tr[q]=tr[p];tr[q].sum+=c;if(l==r) return;int mid=l+r>>1;if(x<=mid) insert(tr[p].l,tr[q].l,l,mid,x,c);else insert(tr[p].r,tr[q].r,mid+1,r,x,c);
}int query_sum(int u,int l,int r,int ql,int qr)
{if(!u) return 0;if(ql<=l&&r<=qr) return tr[u].sum;int mid=l+r>>1,ans=0;if(ql<=mid) ans+=query_sum(tr[u].l,l,mid,ql,qr);if(qr>mid) ans+=query_sum(tr[u].r,mid+1,r,ql,qr);return ans;
}int query_k(int u,int l,int r,int k)
{if(l==r) return l;int mid=l+r>>1;if(tr[tr[u].l].sum>=k) return query_k(tr[u].l,l,mid,k);else return query_k(tr[u].r,mid+1,r,k-tr[tr[u].l].sum);
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);int _; scanf("%d",&_);for(int __=1;__<=_;__++){scanf("%d%d",&n,&m); tot=0;for(int i=1;i<=n;i++) root[i]=0; root[n+1]=0;for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=n;i>=1;i--){insert(root[i+1],root[i],1,n,i,1);if(pre[a[i]]) insert(root[i],root[i],1,n,pre[a[i]],-1);pre[a[i]]=i;}int p=0;printf("Case #%d:",__);while(m--){int ql,qr; scanf("%d%d",&ql,&qr);int l=min((ql+p)%n+1,(qr+p)%n+1);int r=max((ql+p)%n+1,(qr+p)%n+1);int sum=query_sum(root[l],1,n,l,r);int mid=(sum+1)/2;printf(" %d",p=query_k(root[l],1,n,mid));}puts("");for(int i=1;i<=n;i++) pre[a[i]]=0;}return 0;
}
/**/

2016中国大学生程序设计竞赛(长春)Sequence II HDU - 5919 主席树相关推荐

  1. Sequence II (HDU 5919)(主席树)

    Sequence II 题目大意是有mmm次询问,每次询问一段区间[l,r][l, r][l,r],从左到右,如果这个数是在这个区间第一次出现,则记录下其下标, 我们会得到一个新的数组,要求这个数组的 ...

  2. 上海大学计算机学院卞韬,我校计算机工程与科学学院学生在CCPC中国大学生程序设计竞赛中喜获金奖...

    CCPC中国大学生程序设计竞赛(China Collegiate Programming Contest)是由中国大学生程序设计竞赛组委会组织的年度性赛事,旨在通过竞赛来提高并展示中国大学生程序设计创 ...

  3. Nise-Anti-AK Problem(2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 L题)

    题目链接 Description: Peppa has been learning math recently, he is trapped by a easy problem. He is give ...

  4. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)...

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  5. 挑战程序设计竞赛_我系首次参加第六届中国大学生程序设计竞赛网络预选赛

    点击上方蓝字关注  「龙外信息工程系」 讲述有温度的故事    传递有态度的思想 2020年9月20日12时至17时,第六届中国大学生程序设计竞赛网络赛预选赛在杭州电子科技大学OJ成功举办,黑龙江外国 ...

  6. 计算机竞赛女生,我校组队参加 CCPC-WFINAL中国大学生程序设计竞赛女生专场

    6月1日至6月2日,为期两天的"CCPC-WFINAL"中国大学生程序设计竞赛女生专场在南京晓庄学院如期举行.中国大学生程序设计竞赛是由中国大学生程序设计竞赛协会主办的面向世界大学 ...

  7. 字节跳动杯2018中国大学生程序设计竞赛-女生专场题解

    以下所有AC题解程序来自"仙客传奇"团队. A. 口算训练 题解链接: ABDFHK "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 B. 缺失的数据范 ...

  8. 2018中国大学生程序设计竞赛-网络选拔赛题解

    以下所有AC题解程序来自"仙客传奇"团队. A. Buy and Resell AC的C++语言程序: #include<iostream> #include<c ...

  9. 巴卡斯杯 中国大学生程序设计竞赛 - 女生专场(重现)解题思路

    此文章可以使用目录功能哟↑(点击上方[+]) 经过这么一次女生赛,告诉我们千万不要小瞧女生,不然会死得很惨,orz... 链接→"巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场( ...

最新文章

  1. HMM(隐马尔科夫)用于中文分词
  2. 字符串相关的类String
  3. oracle 查询历史sql执行最慢和执行次数最多的sql
  4. django_2.0_请求处理
  5. jupyter notebook界面颜色jt_更改jupyter notebook主题颜色——步骤详解(Windows系统)...
  6. CF198D Cube Snake(三维空间/增量构造)
  7. 排队论模型的monteCarlo法仿真
  8. android 手机地图
  9. devcon-计算机硬件设备的禁用与启动说明
  10. 测试工具|(本来不想分享的)安卓系统Ping IP工具
  11. js 动态生成表格案例
  12. 计算机网络复习重点/经典考试知识点
  13. 贪心法--->1.会议安排问题
  14. 赫兹的单位换算_频率 时间 单位转换
  15. Vue之v-on之修饰符prevent(007)
  16. Blender 基础 骨架-02 骨架的各种呈现方式
  17. C# 程序开机自动启动
  18. nginx的反向代理和负载均衡
  19. 《勋伯格和声学》读书笔记(八):转调
  20. 读书笔记《学习之道》芭芭拉·奥克利 - 一 书中说了什么

热门文章

  1. 大气的压力竟然能吊起相扑力士!?
  2. 微信新功能又来了,这些功能再次打开了我新世界的大门!
  3. 和哪个专业的男生谈恋爱最惨?
  4. 怎样借助Python爬虫给宝宝起个好名字
  5. python垃圾回收机制为什么标记能解决循环引用问题_Python 垃圾回收机制和如何解决循环引用...
  6. vue 带全选和多选的表格怎么写_EXCEL五分钟,批量制作带照片的工地出入证
  7. bpmn文件的标签为何都以bpmn2开头_C语言之两种作用域:函数的作用域与文件作用域...
  8. adf盖怎么打开_罐头好吃盖难开,学会这几招,再不靠蛮力了,女生也轻松拧开...
  9. java让对象分配在栈上_java – Hotspot何时可以在堆栈上分配对象?
  10. linux中wine yum安装,分享|在基于RedHat或Debian的系统上安装 Wine 1.7