zoukankan      html  css  js  c++  java
  • bzoj 2038 小z的袜子 莫队

    莫队大法好,入坑保平安

    只要能O(1)或O(log)转移,离线莫队貌似真的无敌。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define N 50005
    using namespace std;
    int n,m,nn,tot,c[N],be[N],num[N];
    struct Query{
    	int id,l,r;
    	long long son,mom;
    }qr[N];
    bool cmp(Query a,Query b){
    	if(be[a.l]==be[b.l]&&a.r==b.r) 
    		return a.l<b.l;
    	if(be[a.l]==be[b.l]) return a.r<b.r;
    	return be[a.l]<be[b.l];
    }
    bool com(Query a,Query b){
    	return a.id<b.id;
    }
    long long ans;
    void work(int x,int y){
    	ans-=num[c[x]]*num[c[x]];
    	num[c[x]]+=y;
    	ans+=num[c[x]]*num[c[x]];
    }
    long long gcd(long long x,long long y){
    	return y==0?x:gcd(y,x%y);
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	nn=(int)sqrt(n);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&c[i]);
    		be[i]=(i-1)/nn+1;
    	} tot=be[n];
    	for(int i=1;i<=m;i++){
    		qr[i].id=i;
    		scanf("%d%d",&qr[i].l,&qr[i].r);
    	}
    	sort(qr+1,qr+m+1,cmp);
    	int l=1,r=0;
    	for(int i=1;i<=m;i++){
    		qr[i].mom=(long long)(qr[i].r-qr[i].l+1)*(qr[i].r-qr[i].l);
    		while(l<qr[i].l) work(l++,-1);
    		while(l>qr[i].l) work(--l,1);
    		while(r<qr[i].r) work(++r,1);
    		while(r>qr[i].r) work(r--,-1);
    		qr[i].son=(long long)ans-(qr[i].r-qr[i].l+1);
    		if(qr[i].son==0) qr[i].mom=1;
    		else{
    			long long gg=gcd(qr[i].son,qr[i].mom);
    			qr[i].son/=gg; qr[i].mom/=gg;
    		}
    	}
    	sort(qr+1,qr+m+1,com);
    	for(int i=1;i<=m;i++)
    		printf("%lld/%lld
    ",qr[i].son,qr[i].mom);
    	return 0;
    }


  • 相关阅读:
    【转载】分布式之redis复习精讲
    Oracle学习笔记——常用函数总结
    数据库 字段动态添加
    c# form的设定
    C# 单元测试,测试资源管理器里面没有需要的单元测试
    Nvidia--cuda--document
    C# 文件的读取与另存为(WPF)
    java反射概述
    java设计模式:工厂模式
    oracle表被锁定的解决办法
  • 原文地址:https://www.cnblogs.com/Ren-Ivan/p/7746743.html
Copyright © 2011-2022 走看看