2021牛客国庆集训派对day1 J.Different Integers(莫队)

简介: 2021牛客国庆集训派对day1 J.Different Integers(莫队)

linkkkk

题意:

给出一个长度为n的序列,每次询问[ 1 , l ]和[ r , n ]里不同数的个数。

思路:

先求出[ 1 , n ]不同数的个数,每次减去[ l + 1 , r − 1 ]的贡献就好了,莫队维护。

代码:

// Problem: Different Integers
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/20322/J
// Memory Limit: 1048576 MB
// Time Limit: 4000 ms
// 
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;typedef unsigned long long ull;
typedef pair<ll,ll>PLL;typedef pair<int,int>PII;typedef pair<double,double>PDD;
#define I_int ll
inline ll read(){ll 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*10+ch-'0';ch=getchar();}return x*f;}
#define read read()
#define rep(i, a, b) for(int i=(a);i<=(b);++i)
#define dep(i, a, b) for(int i=(a);i>=(b);--i)
ll ksm(ll a,ll b,ll p){ll res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;}
const int maxn=1e6+7,maxm=1e6+7;
int n,m,a[maxn];
struct node{
  int id,l,r;
}q[maxm];
int cnt[1000010],res[maxn];
int len;//分块的长度 
int tot=0;
bool cmp(node a,node b){
  ///第一关键字是左端点的块编号,第二关键字是右端点的大小 
  int xa=a.l/len,xb=b.l/len;
  if(xa==xb) return a.r<b.r;
  return xa<xb;
}
void add(int w,int &tot){
  if(cnt[w]==0) tot++;
  cnt[w]++;
}
void del(int w,int &tot){
  cnt[w]--;
  if(cnt[w]==0) tot--;
}
bool st[maxn];
void solve(){
  int tmp_ans=0;
  memset(cnt,0,sizeof cnt);
  for(int i=1;i<=n;i++){
    a[i]=read;
    if(!cnt[a[i]]) tmp_ans++;
    cnt[a[i]]++;
  }
  len=sqrt(n);
  for(int i=1;i<=m;i++){
    q[i].l=read,q[i].r=read;q[i].id=i;
  }
  sort(q+1,q+1+m,cmp);
  tot=tmp_ans;
  int i=2,j=1;///实际上i在j后面,初始条件表示区间为空
  for(int k=1;k<=m;k++){
    int id=q[k].id,l=q[k].l,r=q[k].r;
    if(l==r){
      res[id]=tmp_ans;continue;
    }
    while(i<r) del(a[i],tot),i++;
    while(j<l) add(a[j+1],tot),j++;
    while(j>l) del(a[j],tot),j--;
    while(i>r) add(a[i-1],tot),i--;
    res[id]=tot;
  }
  for(int i=1;i<=m;i++)
      cout<<res[i]<<"\n";
}
int main(){
  while(cin>>n>>m) solve(); 
  return 0;
}
目录
相关文章
ACM刷题之路(二十)线筛素数+找规律f(n) 2019暑期集训 HDU 2585
ACM刷题之路(二十)线筛素数+找规律f(n) 2019暑期集训 HDU 2585
【寒假每日一题】AcWing 4455. 出行计划
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 差分与前缀和
125 0
|
算法 Go
牛客寒假算法集训营 2 感想
【【题目讲解】2023牛客寒假算法基础集训营2】
102 0
牛客寒假算法集训营 2 感想
|
Android开发
LeetCode 双周赛 98,脑筋急转弯转不过来!
大家好,我是小彭。 昨晚是 LeetCode 第 98 场双周赛,你参加了吗?这场周赛需要脑筋急转弯,转不过来 Medium 就会变成 Hard,转得过来就变成 Easy。
91 0
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第 95 场周赛
文章目录 第一题 AcWing 4873. 简单计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4874. 约数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4875. 整数游戏 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
121 0
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第94场周赛
文章目录 第一题 AcWing 4870. 装物品 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4871. 最早时刻 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4872. 最短路之和 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
82 0
|
存储 人工智能 算法
【蓝桥杯集训·最后一次周赛】AcWing 第 97 场周赛
文章目录 第一题 AcWing 4944. 热身计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4945. 比大小 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4946. 叶子节点 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
137 0
|
JavaScript BI
【蓝桥杯集训·周赛】AcWing 第96场周赛
文章目录 第一题 AcWing 4876. 完美数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4877. 最大价值 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4878. 维护数组 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
92 0
|
人工智能
【寒假每日一题】AcWing 4700. 何以包邮?
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 0-1背包问题
146 0
|
存储
【蓝桥杯集训·周赛】AcWing 第92场周赛
文章目录 第一题 AcWing 4864. 多边形 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4865. 有效类型 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4866. 最大数量 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
131 0