zoukankan      html  css  js  c++  java
  • [BZOJ3289]Mato的文件管理

    BZOJ
    题意:询问区间逆序对。可离线

    sol

    可离线那就离线莫队搞啊。
    据说在线的话分块也是可以的。
    不管了。。。
    用树状数组维护一下逆序对,每次移动区间的时候计算+修改即可。

    code

    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int N = 50005;
    int gi()
    {
    	int x=0,w=1;char ch=getchar();
    	while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    	if (ch=='-') w=0,ch=getchar();
    	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    	return w?x:-x;
    }
    int n,m,block,a[N],o[N],len,c[N];
    long long ans[N],Ans;
    struct query{
    	int l,r,id;
    	bool operator < (const query &b) const
    		{return l/block<b.l/block||(l/block==b.l/block&&r<b.r);}
    }q[N];
    void Modify(int k,int v){while (k<=len) c[k]+=v,k+=k&-k;}
    int Query(int k){int s=0;while (k) s+=c[k],k-=k&-k;return s;}
    int main()
    {
    	n=gi();block=pow(n,0.5);
    	for (int i=1;i<=n;i++) o[i]=a[i]=gi();
    	sort(o+1,o+n+1);len=unique(o+1,o+n+1)-o-1;
    	for (int i=1;i<=n;i++) a[i]=lower_bound(o+1,o+n+1,a[i])-o;
    	m=gi();
    	for (int i=1;i<=m;i++) q[i]=(query){gi(),gi(),i};
    	sort(q+1,q+m+1);
    	int L=1,R=0;
    	for (int i=1;i<=m;i++)
    	{
    		while (L<q[i].l) Ans-=Query(a[L]-1),Modify(a[L],-1),L++;
    		while (L>q[i].l) L--,Modify(a[L],1),Ans+=Query(a[L]-1);
    		while (R<q[i].r) R++,Modify(a[R],1),Ans+=Query(len)-Query(a[R]);
    		while (R>q[i].r) Ans-=Query(len)-Query(a[R]),Modify(a[R],-1),R--;
    		ans[q[i].id]=Ans;
    	}
    	for (int i=1;i<=m;i++) printf("%lld
    ",ans[i]);
    	return 0;
    }
    
  • 相关阅读:
    Apache的Thrift引发的编译思考
    QQ的小秘密
    快速简化Android截屏工作
    Solution of wireless link "PCI unknown" on Centos 7.1
    Java Date Compare
    eclipse集成tomcat日志文件输出配置
    身份证号码验证正则表达式
    curl用法一例 传递代理用户名密码
    HTML 5 placeHolder
    JavaScript(ECMAScript) with 语句
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/8320462.html
Copyright © 2011-2022 走看看