• NC17942J(莫队算法)


    给出一个序列,每次询问区间内出现次数恰好是k的元素个数。

    //c[maxn]维护出现i次的数有多少
    //cc[maxn]维护第i个数出现多少次
    //然后莫队
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=4e4+100;
    int c[maxn],cc[maxn];
    int belong[maxn];
    int sz,bnum;
    struct node {
    	int l,r,k,id;
    	bool operator < (const node &b) const {
    		return  (belong[l]^belong[b.l])?belong[l]<belong[b.l]:((belong[l]&1)?r<b.r:r>b.r);
    	}
    }q[maxn];
    int n,m,a[maxn],ans[maxn];
    int main () {
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=n;i++) scanf("%d",a+i),cc[a[i]]++;
    	int l=1,r=n;
    	sz=sqrt(n);
    	bnum=n/sz+(n%sz>0);
    	for (int i=1;i<=bnum;i++) {
    		for (int j=(i-1)*sz+1;j<=i*sz;j++) {
    			belong[j]=i;
    		}
    	}
    	for (int i=0;i<=4e4;i++) {
    		c[cc[i]]++;
    	}
    	for (int i=1;i<=m;i++) {
    		scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k);
    		q[i].id=i;
    	}
    	sort(q+1,q+m+1);
    	for (int i=1;i<=m;i++) {
    		while (l<q[i].l) {
    			c[cc[a[l]]]--;
    			cc[a[l]]--;
    			c[cc[a[l]]]++;
    			l++;
    		}
    		while (l>q[i].l) {
    			l--;
    			c[cc[a[l]]]--;
    			cc[a[l]]++;
    			c[cc[a[l]]]++;
    		}
    		while (r<q[i].r) {
    			r++;
    			c[cc[a[r]]]--;
    			cc[a[r]]++;
    			c[cc[a[r]]]++;
    		}
    		while (r>q[i].r) {
    			c[cc[a[r]]]--;
    			cc[a[r]]--;
    			c[cc[a[r]]]++;
    			r--;
    		}
    		ans[q[i].id]=c[q[i].k];
    	}
    	for (int i=1;i<=m;i++) printf("%d
    ",ans[i]);
    }
  • 相关阅读:
    Oracle 导入导出 dmp 文件
    zTree树
    下拉复选框
    jQuery Pagination分页插件
    下载java生成PDF
    Activiti 流程实例、任务、执行对象及相关的表
    Activiti 删除key值相同的所有不同版本的流程定义
    Activiti 查询最新版本的流程定义
    Activiti 查看流程图
    Activiti 删除流程定义
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/15017028.html
Copyright © 2020-2023  润新知