zoukankan      html  css  js  c++  java
  • bzoj 2738: 矩阵乘法【整体二分+树状数组】

    脑子一抽开始写主席树,敲了一会发现不对……
    整体二分,用二维树状数组维护值为当前区间的格子个数,然后根据k的大小和当前询问的子矩阵里的值和k的大小关系来决定这个询问放在哪一部分向下递归

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=300005;
    int n,q,t[505][505],rl[N],ans[N],tot;
    struct ques
    {
    	int x,y,xx,yy,k,id;
    }f[N],g[N];
    struct qwe
    {
    	int i,j,v;
    }a[N];
    bool cmp(const qwe &a,const qwe &b)
    {
    	return a.v<b.v;
    }
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    void update(int x,int y,int v)
    {
    	for(int i=x;i<=n;i+=(i&(-i)))
    		for(int j=y;j<=n;j+=(j&(-j)))
    			t[i][j]+=v;
    }
    int ques(int x,int y)
    {
    	int r=0;
    	for(int i=x;i>=1;i-=(i&(-i)))
    		for(int j=y;j>=1;j-=(j&(-j)))
    			r+=t[i][j];
    	return r;
    }
    void wk(int ll,int rr,int l,int r)
    {
    	if(a[ll].v==a[rr].v)
    	{
    		for(int i=l;i<=r;i++)
    			ans[f[i].id]=a[ll].v;
    		return;
    	}
    	int mid=(ll+rr)>>1,c1=l,c2=r;
    	for(int i=ll;i<=mid;i++)
    		update(a[i].i,a[i].j,1);
    	for(int i=l;i<=r;i++)
    	{
    		int nw=ques(f[i].xx,f[i].yy)-ques(f[i].x-1,f[i].yy)-ques(f[i].xx,f[i].y-1)+ques(f[i].x-1,f[i].y-1);
    		if(f[i].k<=nw)
    			g[c1++]=f[i];
    		else
    		{
    			f[i].k-=nw;
    			g[c2--]=f[i];
    		}
    	}
    	for(int i=l;i<=r;i++)
    		f[i]=g[i];
    	for(int i=ll;i<=mid;i++)
    		update(a[i].i,a[i].j,-1);
    	wk(ll,mid,l,c2);
    	wk(mid+1,rr,c1,r);
    }
    int main()
    {
    	n=read(),q=read();
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			a[++tot]=(qwe){i,j,read()};
    	sort(a+1,a+1+tot,cmp);
    	for(int i=1;i<=q;i++)
    		f[i].x=read(),f[i].y=read(),f[i].xx=read(),f[i].yy=read(),f[i].k=read(),f[i].id=i;
    	wk(1,tot,1,q);
    	for(int i=1;i<=q;i++)
    		printf("%d
    ",ans[i]);
    	return 0;
    }
    
  • 相关阅读:
    如何在xml中存储图片
    软件开发平台化催生软件产业链新层级(1)
    在sql server 中如何移动tempdb到新的位置
    Base64在XML中存储图片的解决方案
    东软金算盘VP*台:拆分标准与个性
    浪潮“楼上”开发平台简介
    python模块整理3random模块
    python模块整理1os模块
    python学习笔记18重点和忘记知识点总结
    python模块整理8glob(类似grep)和fnmatch(匹配文件名)
  • 原文地址:https://www.cnblogs.com/lokiii/p/10748156.html
Copyright © 2011-2022 走看看