【XSY2720】区间第k小 整体二分 可持久化线段树

题目描述

  给你你个序列,每次求区间第\(k\)小的数。

  本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\)

  强制在线。

  \(n\leq 100000,a_i<n,w\leq n\)

题解

  考虑整体二分。

  先看看离线要怎么做。

  现在我们要计算每个数对每个区间的贡献。

  对于每个询问区间和每种数,让这个区间最右边\(w\)个数对这个询问的贡献为\(1\),第\(w+1\)个数对这个询问的贡献为\(-w\)

  这样每个数的贡献就是二维平面上的一个矩形。可以用扫描线+线段树解决。

  时间复杂度:\(O(n\log n)\)

  但问题是强制在线。

  可以把这棵线段树可持久化。

  时间复杂度不变。

  总时间复杂度:\(O(n\log^2 n)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<vector>
#include<utility>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
namespace sgt
{struct node{int ls,rs,v;};node a[50000010];int cnt;int insert(int p1,int l,int r,int v,int L,int R){int p=++cnt;a[p]=a[p1];if(l<=L&&r>=R){a[p].v+=v;return p;}int mid=(L+R)>>1;if(l<=mid)a[p].ls=insert(a[p].ls,l,r,v,L,mid);if(r>mid)a[p].rs=insert(a[p].rs,l,r,v,mid+1,R);return p;}int query(int p,int x,int L,int R){if(L==R)return a[p].v;int s=a[p].v;int mid=(L+R)>>1;if(x<=mid)s+=query(a[p].ls,x,L,mid);elses+=query(a[p].rs,x,mid+1,R);return s;}
}
struct change
{int x,y1,y2,k,w;change(){}change(int a,int c,int d,int e,int f){x=a;y1=c;y2=d;k=e;w=f;
//      printf("%d %d %d %d %d\n",x,y1,y2,k,w);}
};
int cmp(change a,change b)
{return a.x>b.x;
}
change c[1000010],c2[1000010];
int cnt;
int n,w,q,type;
int a[100010];
set<int> st[100010];
int rtcnt=0;
int ls[3000010];
int rs[3000010];
int crt;
vector<pii> d[3000010];
int build(int l,int r,int vl,int vr)
{if(vl==vr)return 0;int rr=++rtcnt;d[rr].push_back(pii());int now=0;int i;int vm=(vl+vr)>>1;int num=0;int cnt1=0;for(i=l;i<=r;i++){if(i!=l&&c[i].x!=c[i-1].x&&num){d[rr].push_back(pii(c[i-1].x,now));num=0;}if(c[i].k<=vm){now=sgt::insert(now,c[i].y1,c[i].y2,c[i].w,1,n);num++;cnt1++;}}if(num)d[rr].push_back(pii(c[r].x,now));int l1=l,r1=l+cnt1;for(i=l;i<=r;i++)if(c[i].k<=vm)c2[l1++]=c[i];elsec2[r1++]=c[i];for(i=l;i<=r;i++)c[i]=c2[i];ls[rr]=build(l,l+cnt1-1,vl,vm);rs[rr]=build(l+cnt1,r,vm+1,vr);return rr;
}
int get(vector<pii> &s,int x)
{if(s.size()==1)return 0;if(x>s[1].first)return 0;int l=1,r=s.size()-1;while(l<r){int mid=(l+r+1)>>1;if(x>s[mid].first)r=mid-1;elsel=mid;}return l;
}
int query(int rr,int l,int r,int k,int vl,int vr)
{if(vl==vr)return vl;int p=get(d[rr],l);int rt=d[rr][p].second;int s=sgt::query(rt,r,1,n);int vm=(vl+vr)>>1;if(k<=s)return query(ls[rr],l,r,k,vl,vm);elsereturn query(rs[rr],l,r,k-s,vm+1,vr);
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifscanf("%d%d%d%d",&n,&w,&q,&type);int x,i;for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=n;i>=1;i--){x=a[i];st[x].insert(i);int ed2=n;if(st[x].size()>=w+1){int ed=n;if(st[x].size()>=w+2){set<int>::iterator p=st[x].end();p--;ed=*p-1;st[x].erase(p);}set<int>::iterator p=st[x].end();p--;c[++cnt]=change(i,*p,ed,x,-w);ed2=*p-1;}c[++cnt]=change(i,i,ed2,x,1);}sort(c+1,c+cnt+1,cmp);int crt=build(1,cnt,0,n);int l,r,k;int last=0;for(i=1;i<=q;i++){scanf("%d%d%d",&l,&r,&k);if(type){l^=last;r^=last;k^=last;}last=query(crt,l,r,k,0,n);printf("%d\n",last);}return 0;
}

转载于:https://www.cnblogs.com/ywwyww/p/8513541.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php队列失败是指什么,队列是什么意思

队列是一种特殊的线性表。它只允许在表的前端(front)进行删除操作&#xff0c;而在表的后端(rear)进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表&#xff1b;进行插入操作的端称为队尾&#xff0c;进行删除操作的端称为队头&#xff1b;队列中没有…

从In Memory Data Grid,Apache Ignite快速入门

IMDG或内存数据网格不是内存中关系数据库&#xff0c;NOSQL数据库或关系数据库。 它是另一种软件数据存储库。 数据模型分布在单个位置或多个位置的许多服务器上。 这种分布称为数据结构。 这种分布式模型被称为“无共享”架构。 IMDG具有以下特征&#xff1a; 所有服务器可以…

python字典合并几种方式对比,Python合并两个字典的常用方法与效率比较

本文实例讲述了Python合并两个字典的常用方法与效率比较。分享给大家供大家参考。具体分析如下&#xff1a;下面的代码举例了5种合并两个字典的方法&#xff0c;并且做了个简单的性能测试#!/usr/bin/pythonimport timedef f1(d1,d2):return dict(d1,**d2)def f2(d1,d2):return …

91.91p10.space v.php,luogu P1091 合唱队形

任务计划推了很久才做www从两头开始的单调上升队列没啥可说的#include#includeusing namespace std;#define maxn 110int a[maxn];int f[2][maxn];int ans;int main() {int n;scanf("%d",&n);for(int i 1; i < n; i)scanf("%d",&a[i]);a[0] a…

oracle查询大小写敏感参数,让Oracle 大小写敏感 表名 字段名 对像名

一、解决方案1、在表名、字段名、对象名上加上双引号&#xff0c;即可实现让oracle大小写区分。2、但是这又引起了另一个问题&#xff1a;在数据库操作中&#xff0c;sql语句中相应的表名、字段名、对象名上一定要加双引号。解决办法是&#xff1a;使用"\"转义。如&a…

BZOJ 2097 [Usaco2010 Dec]Exercise 奶牛健美操

【题意】 给出一棵树。现在可以在树中删去m条边&#xff0c;使它变成m1棵树。要求最小化树的直径的最大值。 【题解】 二分答案。$Check$的时候用$DP$&#xff0c;记录当前节点每个儿子的直径$v[i]$&#xff0c;如果$v[i]1>mid$&#xff0c;那么就断掉连向儿子的这条边。如果…

将原生SQL功能Hibernate到您的Spring Data Repository中

JPA为您提供NamedNativeQuery以便使用本机SQL。 但是&#xff0c;用法并不方便&#xff0c;特别是当您需要在本机SQL中映射多个实体时。 您必须定义一组SqlResultSetMapping映射&#xff0c;这很容易出错。 对于以前使用过Hibernate本机SQL功能的用户&#xff0c;您会发现它比J…

daterangepicker双日历插件的使用

今天主要是由于项目的需要&#xff0c;做了一个daterangepicker双日历插件&#xff0c;做出来的效果如下&#xff1a; 个人感觉这个daterangepicker双日历插件很好用&#xff0c;并且实现起来也不是很麻烦&#xff0c;我是根据它的官方文档去写的&#xff0c;并将Bootstrap也整…

php 递归展现城市信息,PHP 递归兑现层级树状展现数据

PHP 递归实现层级树状展现数据?$arr[id],fid > $arr[fid],name > $arr[name],);}// 将数据按照缩进简单排列 见图1function data2arr($tree, $rootId 0, $level 0) {foreach($tree as $leaf) {if($leaf[fid] $rootId) {echo str_repeat( , $level) . $leaf[id] . .…

牛客网 2018年全国多校算法寒假训练营练习比赛(第五场) H.Tree Recovery-完全版线段树(区间更新、区间求和)...

H.Tree Recovery时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K64bit IO Format: %lld链接&#xff1a;https://www.nowcoder.com/acm/contest/77/H来源&#xff1a;牛客网题目描述 You have N integers, A1,…

面向对象的代码生成方法

代码生成是减少无聊任务的不健康负担的一种常用方法&#xff0c;这些任务常常使我们急切的代码苦恼。 我见过的许多代码生成框架都使用模板替换重复方法&#xff0c;在该方法中&#xff0c;您可以编写一个模板&#xff0c;以了解生成的代码文件的外观&#xff0c;然后替换某些关…

t oracle删除吗,Oracle 11g 手工建库与删库

Oracle 11g 手工建库与删库在前一篇文章中提到阅读Oracle 11gR2 Administrator‘sGuide(文档编号E25494-01)时&#xff0c;简单描述了DDL_LOCK_TIMEOUT参数。在Oracle 11gR2Administrator‘s Guide文档的chapter 2 Creating and Configuring anOracle Database章节时&#xff0…

oracle连接满报错日志,Oracle归档日志满了导致Oracle连接(ORA-00257)报错处理

最近一段时间&#xff0c;有收到一台Oracle服务器的连接告警&#xff0c; 刚刚开始还以为是Oracle的监听被关闭导致&#xff0c;结果连上服务器看下Oracle的监听进程正常&#xff0c;自己连接一次发现有报ORA-00257错&#xff0c;又去监控系统中在看下日志再用sqlplus连上Oracl…

微信登陆超时 重新登录_重新登录:重新登录

微信登陆超时 重新登录嗨&#xff0c;我再次感到非常高兴&#xff0c;认为日志记录是任何应用程序设计和开发的固有部分。 我是坚强的基础知识的忠实拥护者&#xff0c;以我的拙见&#xff0c;日志记录是任何企业级应用程序中经常被忽略但基本的关键要素之一。 我已经写在此之前…

HBase错误:ERROR: Can't get master address from ZooKeeper; znode data == null 解决办法

一、问题背景 使用命令 $ hbase shell 进入hbase的shell之后使用create命令创建表时出现错误&#xff1a;ERROR: Cant get master address from ZooKeeper; znode data null 二、解决方法 检查${HBASE_HOME}/conf/hbase-site.html的属性hbase.rootdir <property><na…

oracle中OEM证书失效怎么办,安全证书过期怎么办 网站安全证书失效处理【解决方法】...

安全证书过期怎么办?所谓的网站安全证书是通过在客户端浏览器和Web服务器之间建立一条SSL安全通道保证了双方传递信息的安全性&#xff0c;而且用户可以通过服务器证书验证他所访问的网站是否真实可靠。下面&#xff0c;我们就来看看网站安全证书失效处理方法。一、计算机中的…

JavaFX缺少的功能调查:表视图

JavaFX的TableView&#xff08;和TreeTableView&#xff09;赢得了我最近的“ JavaFX缺失功能”调查以及许多后续讨论中&#xff08;尤其是苏黎世JavaFX Meetup小组的成员 &#xff09;中提到最多的控件的价格。 &#xff09;。 我想原因之一是一个简单的事实&#xff0c;即几乎…

快速幂矩阵快速幂

快速幂 题目链接&#xff1a;https://www.luogu.org/problemnew/show/P1226 快速幂用了二分的思想&#xff0c;即将\(a^{b}\)的指数b不断分解成二进制的形式&#xff0c;然后相乘累加起来&#xff0c;就是用\(a^{b/2}a^{b/2}\)去求\(a{^b}\)。 例如:\(a^{11}a^{(2^02^12^3)}\)…

前端项目里常见的十种报错及其解决办法

错误一&#xff1a;Uncaught TypeError: Cannot set property onclick of nullat operate.js:86图片.png原因&#xff1a;当js文件放在head里面时&#xff0c;如果绑定了onclick事件&#xff0c;就会出现这样的错误&#xff0c;是因为W3School的写法是浏览器先加载完按钮节点才…

监控oracle数据io,Prometheus监控Oracle数据库

背景本文简单介绍下&#xff0c;Prometheus如何通过exporters监控Oracle数据库&#xff0c;以及应该注意哪些指标。oracledb_exporteroracledb_exporter是一个连接到Oracle数据库并生成Prometheus metrics的应用程序&#xff0c;设置展示下如何安装和设置oracledb_exporter&…