• [bzoj3781]小B的询问_莫队


    小B的询问 bzoj-3781

    题目大意:给定一个n个数的序列,m次询问。每次询问一段区间内数的种类的平方和。

    注释:$1le n\,mle 5cdot 10^4$。


    想法:莫队练习题。

    我们考虑旁区间转移:只需要把当前权值贡献减去,然后修改,加一或减一,之后再把新贡献加回来。

    即可。

    最后,附上丑陋的代码.. ...

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #define N 50010 
    using namespace std; int Ans[N],a[N],ans,blg[N],stack[N];
    struct Node {int l,r,id;}q[N]; inline bool cmp(const Node &x,const Node &y) {return blg[x.l]==blg[y.l]?x.r<y.r:blg[x.l]<blg[y.l];}
    inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
    int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
    inline void fix(int val,int delta)
    {
    	ans-=1ll*stack[val]*stack[val];
    	stack[val]+=delta;
    	ans+=1ll*stack[val]*stack[val];
    }
    int n,m,k;
    void Test()
    {
    	puts("Fuck"); for(int i=1;i<=m;i++) printf("%d ",q[i].id); puts("");
    }
    int main()
    {
    	n=rd(),m=rd(),k=rd(); int unit=sqrt(n); int t=n/unit;
    	for(int i=1;i<=t;i++)
    	{
    		for(int j=(i-1)*unit+1;j<=i*unit;j++) {a[j]=rd(); blg[j]=i;}
    	}
    	if(unit*t<n)
    	{
    		t++;
    		for(int i=unit*(t-1)+1;i<=n;i++) a[i]=rd(),blg[i]=t;
    	}
    	for(int i=1;i<=m;i++) q[i].l=rd(),q[i].r=rd(),q[i].id=i;
    	int l=1,r=0;
    	sort(q+1,q+m+1,cmp); /* Test();  */for(int i=1;i<=m;i++)
    	{
    		while(l<q[i].l) fix(a[l],-1),l++;
    		while(r>q[i].r) fix(a[r],-1),r--;
    		while(l>q[i].l) l--,fix(a[l],1);
    		while(r<q[i].r) r++,fix(a[r],1);
    		Ans[q[i].id]=ans;
    	}
    	for(int i=1;i<=m;i++) printf("%d
    ",Ans[i]);
    	return 0;
    }
    

    小结:莫队真的好玩啊,有些没什么头绪的题想一想分块有奇效。

  • 相关阅读:
    linux下C++程序开发范例
    a list of compiler books — 汗牛充栋的编译器参考资料
    中国象棋将帅问题
    CPU利用率问题:操作系统原理和API
    算法性能分析
    MySQL时间分组查询
    在MongoDB的MapReduce上踩过的坑
    C++双缓冲多线程分析大文件词频
    MongoDB进行MapReduce的数据类型
    得到内网域管理员的5种常见方法<转>
  • 原文地址:https://www.cnblogs.com/ShuraK/p/9686397.html
Copyright © 2020-2023  润新知