P4688 Ynoi2016 掉进兔子洞

news/2024/10/6 4:34:56/文章来源:https://www.cnblogs.com/binbinbjl/p/18288961

P4688 Ynoi2016 掉进兔子洞

经典莫队加 bitset

思路

不难发现最终答案就是:

\[(r_1-l_1+1)+(r_2-l_2+1)+(r_3-l_3+1)-3\times size \]

其中 \(size\) 表示 3 个区间内出现了多少个公共元素。

看到这么多区间,不妨有把区间拆下来搞莫队的想法。

先不考虑询问个数的限制,我们考虑使用 bitset 维护出现多少个公共元素。

然而 bitset 维护出来的是多少种而不是个数。

又然而我们可以先将序列离散化,离散化时每个元素的新值赋为小于等于它的元素的个数。

在莫队加入一个节点时,把 bitset 中的第 \(p-cnt_p\) 位标为 \(1\)

\(cnt_p\) 为当前区间内 \(p\) 元素的个数。

然后你就会发现,bitset 中不同的值的元素所储存位置是不同的(这个显而易见)。

然后你又发现,bitset 中不同区域的 \(1\) 的个数代表了某些值相等的元素的个数。

接着你把 3 个区间分别的 bitset 求交,统计 \(1\) 的个数,就求出了 \(size\)

然而一次性不可以处理这么多的区间,我们把询问分组处理即可。

时间复杂度 \(\frac{n^2\sqrt n}{w}\),然而卡不到莫队上限。

CODE

#include<bits/stdc++.h>
using namespace std;#define M 2e4const int maxn=1e5+5,maxm=2e4+5;struct qry
{int l,r,t;
}q[maxm*3];int n,m,tot=1;
int a[maxn],cnt[maxn],nans[maxm];bitset<maxn>ans[maxm],nb;map<int,int>mp;inline bool cmp1(qry a,qry b){return a.l<b.l;}
inline bool cmp2(qry a,qry b){return a.r<b.r;}
inline void ins(int a){nb[a-cnt[a]]=1;cnt[a]++;}
inline void del(int a){cnt[a]--;nb[a-cnt[a]]=0;}
inline void solve()
{if(tot>=m) return ;int tp=0;for(int i=1;i<=M&&tot<=m;i++,tot++){++tp;scanf("%d%d",&q[tp].l,&q[tp].r);q[tp].t=i;nans[i]+=q[tp].r-q[tp].l+1;++tp;scanf("%d%d",&q[tp].l,&q[tp].r);q[tp].t=i;nans[i]+=q[tp].r-q[tp].l+1;++tp;scanf("%d%d",&q[tp].l,&q[tp].r);q[tp].t=i;nans[i]+=q[tp].r-q[tp].l+1;}for(int i=1;i<=tp/3;i++) ans[i].set();sort(q+1,q+tp+1,cmp1);for(int i=1;i<=tp;i+=320){int r=min(i+319,tp);sort(q+i,q+r+1,cmp2);}int nl=0,nr=0;for(int i=1;i<=tp;i++){if(nr<q[i].l){for(int j=nl;j<=nr;j++) del(a[j]);nl=q[i].l,nr=q[i].r;for(int j=nl;j<=nr;j++) ins(a[j]);}else{while(nl<q[i].l) del(a[nl]),nl++;while(nl>q[i].l) nl--,ins(a[nl]);while(nr<q[i].r) nr++,ins(a[nr]);while(nr>q[i].r) del(a[nr]),nr--;}ans[q[i].t]&=nb;}for(int i=nl;i<=nr;i++) del(a[i]);for(int i=1;i<=tp/3;i++) printf("%lld\n",nans[i]-ans[i].count()*3);for(int i=1;i<=tp/3;i++) nans[i]=0;tp=0;
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]),mp[a[i]]++;map<int,int>::iterator it2,it1;for(it1=mp.begin(),it2=it1,it2++;it2!=mp.end();it1++,it2++) it2->second+=it1->second;for(int i=1;i<=n;i++) a[i]=mp[a[i]];for(int i=1;i<=5;i++) solve();
}

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

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

相关文章

Spark Special_杨宁远 杂题分析.md

Spark Special 图论_杨宁远 杂题分析 Date: 2024-07-03 Preface 本文基于杨宁远 @ynycoding 的课件与题单,对省选/NOIP阶段图论的建模方法和解题策略进行总结,以及本阶段常用方法、模型和 Trick。 A. [AGC056C] 0/1 Balanced [AGC056C] 01 Balanced - 洛谷 | 计算机科学教育新…

按指定日期重复

问题:根据D1指定的日期将A2:C8区域进行重复公式1(姓名)右拉下拉完成 =INDEX(A:A,MOD(ROW(A1)+COUNTA(A:A)-2,COUNTA(A:A)-1)+2) 公式2(日期)下拉完成 =SUBSTITUTE(LEFT(D$1,FIND("-",D$1)-1),".","/")+(ROW(A1)-1)/(COUNTA(A:A)-1) 公式3(…

语法2-运算符、包机制、JavaDoc

语法 运算符 运算符具有优先级-网上查(一般使用括号保证)/-除,%-取余符号-21/10二十一除十取余数,幂运算使用工具类表示Math.pow(2,3)-2的3次方 ++自加,--自减 int a =3 ; int b =a++;//输出a=4,b=3 int b =++a;//输出a=4,b=4==-等于,!=-instanceof-不等于逻辑运算符-与或…

厦门福州七日游

厦门福州七日游2024-06-30 上午被发短信告知航班延误两个半小时。 晚上八点多九点才到了厦门,湘妹 yhp yzf 已经在酒店了。厦门机场不通地铁?????于是打了个车去地铁站。 酒店就在中山路步行街上,有各种店铺。点了一份外卖,和大伙打了一会三国杀,输了几局 2024-07-01 …

SumIf的问题

问题:进销存表数据等于同货号入库表中数据 函数公式解决:=SUMIF(入库!A:A,B3,入库!C:C)

7/8死神永生服周报第七期

1. 死神永生新闻 2. 死神永生服TNT军事基地[三] 3. 死神永生服的古代建筑之自然选择号目录死神永生新闻 死神永生服TNT军事基地[三] 死神永生服的古代建筑之自然选择号这几天又没上死神永生,主要是期末比较繁忙,因此又停了一期。。真的很抱歉。死神永生新闻前一周的治理新闻时…

两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码

今天推荐两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码,这两个源码完整,都是基于thinkphp内核开发的,框架稳定,带数据库,源码文件,可以直接部署使用。第一个:3D模型 图纸模型 机械模型(图纸)下载资源网站源码 thinkphp5开发原创模型(图…

win 10 使用SSH 连接

本教程建议使用win 10 、win 11 非家庭版使用 首先安装 ssh 服务端 Get-Service -Name *ssh* #查看服务ssh -V #查看ssh 版本 netstat -an |findstr :22 # 查看端口是否被监听 ipconfig # 查看本机IP ssh administrator@IP 在用户/.ssh 目录下创建文件 authorized_keys 将…

音视频录制与播放原理

图片来源于网上学习资料,零声学院!

2.基于Containerd运行时搭建Kubernetes多控制平面集群实践-腾讯云开发者社区-腾讯云

https://cloud.tencent.com/developer/article/21298462.基于Containerd运行时搭建Kubernetes多控制平面集群实践发布于 2022-09-29 19:27:531K0 举报文章被收录于专栏:全栈工程师修炼之路[TOC]0x00 前言简述 本章主要讲述,如果使用kubeadm进行安装配置K8S集群,并指定使用co…

【寻迹】二分与三分

二分与三分 二分是一种常用且非常精妙的算法。(英才计划甚至还水了一篇文章)三分法则可以用来解决单峰函数的极值以及相关问题 一、二分 二分法,在一个单调有序的集合或函数中查找一个解,每次均分为左右两部分,判断解在哪一个部分后调整上下界。每次二分都会舍弃一半区间,…

xftp实现linux服务器传输文件

1.xftp下载网址:https://www.xshell.com/zh/free-for-home-school/,下载后下一步安装即可 2.ip addr show查看ip地址,配置xftp连接服务器,找到对应路径传输文件 以上仅供参考,如有疑问,留言联系