2021-05-26 莫队求区间出现正偶次数的个数,求区间满足差值要求的对数,分块求区间众数

博客内容涉及使用莫队算法解决区间出现正偶次数的数的个数问题,以及通过修改分块求区间众数的代码来解决其他题目。还介绍了如何结合离散化和树状数组求解区间内满足差值要求的数对数量。
摘要由CSDN通过智能技术生成

#42. czy的后宫3

1.题意:
2.题解:

疯了,怎么都提交不了,是不是oj删题了???
莫队轻松解决,分块写代码就有点复杂了
区间出现正偶数次的数的个数

3.ac代码:
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int f[5002][5002];
const int INF=0x3f3f3f3f;
int a[N];
int cnt[N];
int ans;
int res[N];
int sq; 
struct Node{
   
	int l,r,id;
	operator <(const Node &o)const{
   
		if(l/sq!=o.l/sq) return l<o.l;
		if(l/sq&1) return r<o.r;
		return r>o.r;
	}
}node[N];
void add(int i){
   
	
	cnt[a[i]]++;
	if(cnt[a[i]]%2==0&&cnt[a[i]]) ans++;
	if(cnt[a[i]]%2==1&&cnt[a[i]]!=1) ans--;
	
}
void del(int i){
   
	
	cnt[a[i]]--;
	if(cnt[a[i]]%2==0&&cnt[a[i]]!=0) ans++;
	if(cnt[a[i]]%2==1) ans--;
}
int main(){
   
    int n,c,m;
    cin>>n>>c>>m;
    
    for(int i=1;i<=n;i++){
   
        cin>>a[i];
       
    }
    sq=sqrt(n);
    //int l,r;
    for(int i=1;i<=m;i++){
   
        cin>>node[i].l>>node[i].r;  
		node[i].id=i;    
    }
    sort(node+1,node+1+m);
    int l=1,r=0;
    
    for(int i=1;i<=m;i++){
   //l,r是闭区间,包含在内,所以增加时先++/--,减少时先传入l,r再加减 
    	
    	while(l<node[i].l){
   
    		del(l++);
		}
		while(l>node[i].l){
   
			add(--l);
		}
		while(r<node[i].r){
   
			add(++r);
		}
		while(r>node[i].r){
   
			del(r--);
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值