首页 > 其他分享 >C117 莫队配合 bitset P4688 [Ynoi2016] 掉进兔子洞

C117 莫队配合 bitset P4688 [Ynoi2016] 掉进兔子洞

时间:2024-04-19 22:14:13浏览次数:27  
标签:include int Ynoi2016 bitset C117 now P4688

视频链接:C117 莫队配合 bitset P4688 [Ynoi2016] 掉进兔子洞_哔哩哔哩_bilibili

 

 

 

Luogu P4688 [Ynoi2016] 掉进兔子洞

// 莫队配合 bitset O(n*sqrt(n))
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bitset>
using namespace std;

const int N=100005,M=N/3;
int n,m,B,a[N],b[N],p[N],sum[M];
bitset<N> bs[M],now;
struct Q{
  int l,r,id;
  bool operator<(const Q& x) const{
    if(l/B!=x.l/B) return l<x.l;
    return (l/B)&1 ? r<x.r : r>x.r;
  }
}q[N];

void add(int x){
  now.set(x+p[x]); //x位置 置1
  p[x]++; //相同数的位置偏移量
}
void del(int x){
  p[x]--;
  now.reset(x+p[x]); //x位置 置0
}
void solve(){
  memset(p,0,sizeof(p));
  int cnt=0,tot=0; //cnt查询数,tot区间数
  now.reset();     //全置0
  for(cnt=0;cnt<M&&m;m--,cnt++){ //查询
    sum[cnt]=0;
    bs[cnt].set(); //全置1
    for(int j=0;j<3;j++){
      scanf("%d%d",&q[tot].l,&q[tot].r);
      q[tot].id=cnt;
      sum[cnt]+=q[tot].r-q[tot].l+1;
      tot++;
    }
  }
  sort(q,q+tot); //区间排序
  for(int i=0,l=1,r=0;i<tot;i++){ //莫队
    while(l>q[i].l) add(a[--l]);
    while(r<q[i].r) add(a[++r]);
    while(l<q[i].l) del(a[l++]);
    while(r>q[i].r) del(a[r--]);
    bs[q[i].id]&=now; //查询的交集
  }
  for(int i=0;i<cnt;i++) //查询
    printf("%d\n",sum[i]-bs[i].count()*3);
}
int main(){
  scanf("%d%d",&n,&m); B=sqrt(n);
  for(int i=1;i<=n;i++)
    scanf("%d",&a[i]),b[i]=a[i];
  sort(b+1,b+n+1);
  for(int i=1;i<=n;i++) //不去重的离散化
    a[i]=lower_bound(b+1,b+n+1,a[i])-b;
  solve();solve();solve(); //分三段处理
}

 

P3674 小清新人渣的本愿 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P5355 [Ynoi2017] 由乃的玉米田 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P5313 [Ynoi2011] WBLT - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 

标签:include,int,Ynoi2016,bitset,C117,now,P4688
From: https://www.cnblogs.com/dx123/p/18137606

相关文章

  • C++bitset类型
    bitset类型我们介绍了将整型运算对象当作二进制位集合处理的一些内置运算符。标准库还定义了bitset类,使得位运算的使用更为容易,并且能够处理超过最长整型类型大小的位集合。bitset类定义在头文件bitset中。定义和初始化bitsetbitset类是一个类模板,它类似array类,具有固定的......
  • [算法]分割等和子集算法 & bitset容器应用
    LeetCode416.分割等和子集1题目描述给你一个只包含正整数的非空数组nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。1.1输入测试示例1:输入:nums=[1,5,11,5]输出:true解释:数组可以分割成[1,5,5]和[11]。示例2:输入:nums=[1,2,3,5]......
  • P4690 [Ynoi2016] 镜中的昆虫
    P4690[Ynoi2016]镜中的昆虫本质就是区间修改,区间数颜色弱化一下,先考虑不带修的情况,也就是P1972[SDOI2009]HH的项链其难点在于区间颜色的去重,需要想一个办法让区间内一个颜色只被数一次我们可以去维护一个\(Nxt\)数组,表示下一个与当前位置颜色相同的位置若当前位......
  • bitset 相关优化
    bitset基础用法operator[]:访问其特定的一位。operator==/!=:比较两个bitset内容是否完全一样。operator&/&=/|/|=/^/^=/~:进行按位与/或/异或/取反操作。bitset只能与bitset进行位运算,若要和整型进行位运算,要先将整型转换为bitset。operator<>/<<=/>>=:进行......
  • P4690 [Ynoi2016] 镜中的昆虫 题解
    题目链接:镜中的昆虫经典题了,我们首先回顾下颜色数的常见做法统计:对每个位置维护一个\(pre_i\),表示与当前位置相同的颜色上一次出现位置。那么我们分讨一下。查询\([l,r]\)得到颜色数,对于\(pre_i<l\)的\(i\)点,显然它就是这个区间内\(a_i\)对应颜色出现的第一个位置,我们......
  • STL-bitset模拟实现
    #include<time.h>#include<string>#include<vector>#include<iostream>usingstd::cout;usingstd::endl;usingstd::string;namespacetest{/**位图概念*所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。......
  • AT_arc117_c [ARC117C] Tricolor Pyramid 题解
    [ARC117C]TricolorPyramid博客阅读体验(也许)更佳题意给一个金字塔的底部颜色组成和生长规律,问顶部的颜色是什么。分析试几次就可以很容易得到的一种构造:令颜色B为\(0\),W为\(1\),R为\(2\)。设左右两个方块的颜色分别为\(col_l\)和\(col_r\),则生长规则可以描......
  • 黑科技:bitset 优化 LCS
    感觉挺有参考意义的,单独拎出来发一个。Loj6564最长公共子序列求\(a,b\)LCS长度。\(n,m\le7\times10^4\),1s,1GB。这\(O(n^2)\)还能往下卡吗?可以的,\(O(\frac{n^2}{w})\)。考虑\(dp_{i,j}\)的转移,有\(0\ledp_{i,j+1}-dp_{i,j}\le1\),即差分数组是01串,给差分......
  • C转C++速成浅入浅出系列——STL之bitset
    本系列为应付考研复试用,知识浅入浅出,很多地方不深究细节原理;如有谬误,欢迎大家指出。bitset【bitset:位集,比特集】理解为比特集。特点是①只能存入0与1②小端存储(可参阅计算机组成原理知识,表现为按b[i]增序输出时会倒序输出)需提供头文件#include<bitset> 创建注:①存储时......
  • bitset优化传递闭包
    bitset优化传递闭包时间复杂度\(O(\frac{n^3}{w})\)#include<bits/stdc++.h>#defineF(i,l,r)for(inti=l;i<=r;++i)#defineG(i,r,l)for(inti=r;i>=l;--i)#definelllonglongusingnamespacestd;constintN=1005;bitset<N>f[N];intn;intmain......