首页 > 其他分享 >UVA13095 Tobby and Query 题解

UVA13095 Tobby and Query 题解

时间:2024-03-07 13:35:21浏览次数:22  
标签:cnt mathit int 题解 re il UVA13095 Query define

分析

一眼莫队(虽然通过这题的范围显然看出出题人用的不是莫队)。

我们定义 \(\mathit{cnt}_{i}\) 表示数字 \(i\) 出现的次数。在指针的拓展增加 \(x\) 时,若有 \(\mathit{cnt}_{x}+1=1\),则表示在在这个区间里,\(x\) 是第一次出现的,我们可以将答案加 \(1\);在指针的收缩减去 \(x\) 时,若有 \(\mathit{cnt}_{x}-1=0\),则表示在在这个区间里,\(x\) 将不会出现,我们可以将答案减 \(1\)。这样就能很容易地统计出某个区间内不同数字的数量啦。

注:这题多测,建议不要把没有必要开太大的数组开大,没必要清空的数组可以不清空。复杂度单组数据是 \(O(q\sqrt{n})\) 的,能过。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define x first
#define y second
#define re register
#define il inline
const int N=1e5+10,M=15;
int n,q,c[N];
struct node{
	int l,r,id;
}Q[N];
int len,cnt[M],ans,ANS[N];
il bool cmp(node a,node b){
	return ((a.l/len!=b.l/len)?(a.l<b.l):(((a.l/len)&1)?(a.r<b.r):(a.r>b.r)));
}
il void read(){
	for(re int i=1;i<=n;++i)
		scanf("%lld",&c[i]),cnt[c[i]]=0;
	scanf("%lld",&q);
	for(re int i=1;i<=q;++i)
		scanf("%lld%lld",&Q[i].l,&Q[i].r),Q[i].id=i;
	return ;
}
il void add(int x){
	++cnt[x];
	if(cnt[x]==1) ans++;
	return ;
}
il void del(int x){
	--cnt[x];
	if(cnt[x]==0) ans--;
	return ;
}
il void solve(){
	ans=0,len=sqrt(n),sort(Q+1,Q+q+1,cmp);
	int l=1,r=0;
	for(re int i=1;i<=q;++i){
		while(l>Q[i].l) add(c[--l]);
		while(r<Q[i].r) add(c[++r]);
		while(l<Q[i].l) del(c[l++]);
		while(r>Q[i].r) del(c[r--]);
		ANS[Q[i].id]=ans;
	}
	return ;
}
il void print(){
	for(re int i=1;i<=q;++i)
		printf("%lld\n",ANS[i]);
	return ;
}
signed main(){
	while(scanf("%lld",&n)==1){
		read(),solve(),print();
	}
	return 0;
}

标签:cnt,mathit,int,题解,re,il,UVA13095,Query,define
From: https://www.cnblogs.com/harmisyz/p/18058694

相关文章

  • P5017题解
    前言做这道题,首先要了解\(dp\)。\(dp\)一般有三个步骤(个人理解):根据题意确定状态。根据状态的定义推出状态转移方程,一般有两种:填表法和刷表法。填表法就是普通\(dp\),用前面的状态转移到现在的状态,例:\(f[i]=f[i-1]+a[i]\)。刷表法就是在现有的基础上(\(f[i]\)已知),去推出\(f[......
  • SP20848 IGAME - Interesting Game 题解
    分析数位DP一眼题。对于一个\(k\)位的数\(s\),我们不妨将其看做由数字\(s_1,s_2,s_3,\dots,s_k\)这\(k\)个数字拼接起来的。而题意是每个人可以将\(s_1,s_2,s_3,\dots,s_k\)中的任意一个减去任意数字,保证不减去\(0\)且结果\(\ge0\)。显然,在我们将这\(k\)个数看......
  • AT_abc216_g [ABC216G] 01Sequence 题解
    分析一道差分约束题。我们令\(\mathit{sum}_{i}\)表示\(1\)到\(i\)中,\(1\)的数量,根据题意可得:\(\mathit{sum}_{l_i-1}+x_i\le\mathit{sum}_{r_i}\)\(\mathit{sum}_{l+1}+(-1)\le\mathit{sum}_{l}\)\(\mathit{sum}_{l}+0\le\mathit{sum}_{l+1}\)因为我们要尽......
  • CF1066E 题解
    Solution首先不难想到计算\(a\)的每一位对答案产生的贡献,然后题目告诉我们\(b\)每次会往右移一位,然后结合样例可以发现:对于\(a\)的第\(i\)位,能与其产生贡献的条件是:\(a_i=1\)且\(b_j=1(i\leqj)\),对答案的贡献不难想出即为\(2^{i-1}\times\sum\limits_{j=i}^{m}b_j......
  • AT_abl_e Replace Digits 题解
    分析线段树模板题。维护一个区间\([l,r]\)中\(\sum\limits_{i=l}^r10^{n-i}\)的答案。将某个区间\([l,r]\)全部修改成\(x\)之后的表示的数就是\(x\times(\sum\limits_{i=l}^r10^{n-i})\)。区间修改可以用线段树,用快速幂或者预处理弄出来\(10^x\),建树的时候就能把每......
  • AT_abl_d Flat Subsequence 题解
    分析线段树模板题。一眼DP。定义状态函数\(\mathit{f}_i\)表示前\(i\)个数中,必选\(\mathit{A}_i\)时\(B\)的最大长度。则有转移方程:\(\mathit{f}_i=\max\{f_j|((1\lej\lei-1)\land(-k\leA_i-A_j\lek))\}+1\)。答案就是\(\max\limits_{i=1}^{n}\mathit{f}_i......
  • CF808E 题解
    很好的一道分类讨论题。观察数据范围,\(w\leq3\),不难想到,将\(w\)分为\(1,2,3\)种情况,如果直接贪心选会不难发现是错的。但是如果\(w\)的值只有\(2\)种,就像\(w=1/2\)的情况,将\(w=1/2\)的数据按价值排序,最后枚举每种选多少即可。但是\(w=3\)就会显得难以处理,需要讨......
  • CF1824B1 LuoTianyi and the Floating Islands (Easy Version) 题解
    分析按照\(k\)的奇偶分开考虑。\(k\)为奇数。一个好的节点有且仅有一个在任意两个有人的节点\(i,j\)的路径的交点上的最优位置。若该交点偏移\(1\)步,则必然会使路径长度和\(+1\)。故期望为\(1\)。\(k\)为偶数。任意一个好的节点仍然在任意两个有人的节点\(i,j\)的......
  • 【教程】HBuilderX开发实践:隐私合规检测问题解决方案
    文章目录摘要引言正文1、违规收集个人信息2、APP强制、频繁、过度索取权限知识点补充总结 摘要本篇博客介绍了在使用HBuilderX进行开发过程中,常遇到的隐私合规问题,并提供了相应的解决方案。主要包括违规收集个人信息和APP强制、频繁、过度索取权限两方面。......
  • CF147B 题解
    Solution一道十分典型的dp题。有三个关键点分别是定义状态、优化和答案的统计。首先定义状态,定义\(f_{i,j,p}\)表示\(i\toj\)号节点,共走了不超过\(p\)条边,且是\(i\toj\)的最长路径。不超过\(p\)条边是为了方便转移,而最长路径如果都为负环,说明需要走更多的边,实......