[bzoj 4939][Ynoi 2016]掉进兔子洞
传送门
Description
一个长为 n 的序列 a。
有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立。
注意这里删掉指的是一个一个删,不是把等于这个值的数直接删完,
比如三个区间是 [1,2,2,3,3,3,3] , [1,2,2,3,3,3,3] 与 [1,1,2,3,3],就一起扔掉了 1 个 1,1 个 2,2 个 3。
Solution
弱化版是luoguP3674,这里放上它的题解 戳我
要找相同的元素就是集合求交集,莫队+bitset即可
可是这道题是要算上重复的元素的,很简单,离散化的时候给每个数留下相应的空位就行了
即每个数的离散值等于小于它的数个数+1.
几个例子:
我们把序列
3 3 5 5 6 7 7,离散化成1 1 3 3 5 6 6,而不是1 1 2 2 3 4 4那么,我们在加入数的时候,把它加到“它的离散值+它出现的次数-1”这个位置上
那么求交就是
now.count()还有一个问题,维护\(100000*100000\)的bitset!虽然看上去不太可能,但其实上我们分成3次莫队就行了
Code
#include<bits/stdc++.h>
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
#define MN 100005
int n,m,a[MN],T,nums[MN];
std::bitset<MN> now;
std::bitset<MN> quer[33343];
struct ques{
int l,r,id,pl;
bool operator <(const ques&o)const{return (pl^o.pl)?(pl<o.pl):((pl&1)?r<o.r:r>o.r);}
}q[MN+33343];
int num[MN],len[MN];
inline void solve(int L,int R)
{
if(L>R) return;
register int tt=0,i;
for(i=1;i<=R-L+1;++i)
{
quer[i].set();
q[++tt].l=read(),q[tt].r=read();q[tt].pl=(q[tt].l-1)/T+1;q[tt].id=i;len[i] =q[tt].r-q[tt].l+1;
q[++tt].l=read(),q[tt].r=read();q[tt].pl=(q[tt].l-1)/T+1;q[tt].id=i;len[i]+=q[tt].r-q[tt].l+1;
q[++tt].l=read(),q[tt].r=read();q[tt].pl=(q[tt].l-1)/T+1;q[tt].id=i;len[i]+=q[tt].r-q[tt].l+1;
}
std::sort(q+1,q+tt+1);
register int l=1,r=0;now.reset();
memset(num,0,sizeof num);
for(i=1;i<=tt;++i)
{
for(;r<q[i].r;++r) num[a[r+1]]++,now[a[r+1]+num[a[r+1]]-1]=1;
for(;l>q[i].l;--l) num[a[l-1]]++,now[a[l-1]+num[a[l-1]]-1]=1;
for(;r>q[i].r;--r) now[a[r]+num[a[r]]-1]=0,--num[a[r]];
for(;l<q[i].l;++l) now[a[l]+num[a[l]]-1]=0,--num[a[l]];
quer[q[i].id]&=now;
}
for(i=1;i<=R-L+1;++i) printf("%d\n",len[i]-3*quer[i].count());
}
int main()
{
n=read();m=read();
register int i;T=ceil(sqrt((double)n));
for(i=1;i<=n;++i) nums[i]=a[i]=read();
std::sort(nums+1,nums+n+1);
for(i=1;i<=n;++i) a[i]=std::lower_bound(nums+1,nums+n+1,a[i])-nums;
int N1=m/3+1,N2=2*N1;
solve(1,min(N1,m));solve(min(N1,m)+1,min(N2,m));solve(min(N2,m)+1,m);
return 0;
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
[bzoj 4939][Ynoi 2016]掉进兔子洞的更多相关文章
- [YNOI 2016] 掉进兔子洞
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4939 [算法] 不难发现 , ansi = (r1 - l1 + 1) + (r2 ...
- luogu P4688 [Ynoi2016]掉进兔子洞 bitset 莫队
题目链接 luogu P4688 [Ynoi2016]掉进兔子洞 题解 莫队维护bitset区间交个数 代码 // luogu-judger-enable-o2 #include<cmath&g ...
- loj #6201. 「YNOI2016」掉进兔子洞
#6201. 「YNOI2016」掉进兔子洞 您正在打galgame,然后突然发现您今天太颓了,于是想写个数据结构题练练手: 给出一个长为 nnn 的序列 aaa. 有 mmm 个询问,每次询问三个区 ...
- YNOI2016:掉进兔子洞 (莫队+bitset)
YNOI2016:掉进兔子洞 题意简述: 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于这 ...
- [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset)
[Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间 ...
- BZOJ.4939.[Ynoi2016]掉进兔子洞(莫队 bitset 分组询问)
BZOJ 洛谷 删掉的数即三个区间数的并,想到bitset:查多个区间的数,想到莫队. 考虑bitset的每一位如何对应每个数的不同出现次数.只要离散化后不去重,每次记录time就可以了. 但是如果对 ...
- BZOJ 4939 [Ynoi2016]掉进兔子洞(莫队+bitset)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4939 [题目大意] 给出一个数列,每个询问给出三个区间,问除去三个区间共有的数字外, ...
- BZOJ 4939: [Ynoi2016]掉进兔子洞(莫队+bitset)
传送门 解题思路 刚开始想到了莫队+\(bitset\)去维护信息,结果发现空间不太够..试了各种奇技淫巧都\(MLE\),最后\(\%\)了发题解发现似乎可以分段做..这道题做法具体来说就是开\(3 ...
- bzoj千题计划320:bzoj4939: [Ynoi2016]掉进兔子洞(莫队 + bitset)
https://www.lydsy.com/JudgeOnline/problem.php?id=4939 ans= r1-l1+1 + r2-l2+1 +r3-l3+1 - ∑ min(cnt1[i ...
随机推荐
- java实现HTTP请求 HttpUtil
示例: package com.sensor.utils; import java.net.HttpURLConnection; import java.net.URL; public class H ...
- ElementUI动态表格数据转换formatter
elementUI的表格初始化比较简单,声明prop值对应的字段名即可. 而在实际应用中,我们常常有这种需求:从服务器获取的数据并不是我们要显示的最终结果,涉及一些状态.类型.日期时间等的转换,这时候 ...
- 记一次B类地址子网划分
说明:一般内网地址,没有要求严格的划分之类的.需要按要求严格划分一般都是公网地址 温馨提醒:由于笔者功底不是很深厚,只能说我们保证把数算对用相对简单的方法 现有一个公网ip,B类地址130.3.0.0 ...
- Elasticsearch 入门,基本概念和操作
基本概念 Node 与 Cluster Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例. 单个 Elastic 实例称为一个节点(nod ...
- layui列表表单
列表: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title ...
- java - day014 - 编译期,运行期
编译期 静态成员 私有变量 成员变量 运行期 非静态方法 package day1401; public class Test1 { public static void main(String[] ...
- JVM学习总结
JVM指令执行流程架构图:
- python算法与数据结构-常用查找算法一(37)
一.什么是查找 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表(Search Table):由同一类型的数据元素(或记录)构成的集合 ...
- Return local beginning of day time object in Go
Both the title and the text of the question asked for "a local [Chicago] beginning of today tim ...
- 0016SpringBoot实现RESTFUL形式的增删改查
1.列表页面如下 <!DOCTYPE html><!-- saved from url=(0052)http://getbootstrap.com/docs/4.0/examples ...