bzoj1926[sdoi2010]粟粟的书架

ws_zzy ws_zzy     2022-10-16     376

关键词:

题解:

这是两道题

前50%:

发现p[i][j]很小,于是记录f[i][j][k]表示(1,1)~(i,j)这个子矩阵内>=k的书的总高度,g[i][j][k]记录本数

查询是二分答案就好了

后50%:

主席树,右子树够了就向右走,否则向左走

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n,m,T;

int PTsiz;
int root[500009];
struct PresidentTree{
	int ls,rs,d,sum;
}tree[10000009];
void BuildTree(int &now,int l,int r){
	now=++PTsiz;
	tree[now].d=tree[now].sum=0;
	if(l==r)return;
	int mid=(l+r)>>1;
	BuildTree(tree[now].ls,l,mid);
	BuildTree(tree[now].rs,mid+1,r);
}
void Updatapoint(int &now,int pre,int p,int x,int l,int r){
	now=++PTsiz;
	tree[now]=tree[pre];
	tree[now].d++;tree[now].sum+=x;
//	cout<<"shit"<<tree[now].l<<‘ ‘<<tree[now].r<<endl;
	if(l==r)return;
	
	int mid=(l+r)>>1;
	if(p<=mid)Updatapoint(tree[now].ls,tree[pre].ls,p,x,l,mid);
	else Updatapoint(tree[now].rs,tree[pre].rs,p,x,mid+1,r);
}
int a[500009];
int b[500009],nn;
int sum2[500009];
int Queryamount(int now,int pre,int tot,int l,int r){
	if(l==r){
		int x=b[l];
		if(tot%x==0)return tot/x;
		else return tot/x+1;
	}
	int s=tree[tree[now].rs].sum-tree[tree[pre].rs].sum;
	int d=tree[tree[now].rs].d-tree[tree[pre].rs].d;
//	printf("%d %d %d %d
",b[tree[now].l],b[tree[now].r],d,s);
//	if(s==tot)return d;
	int mid=(l+r)>>1;
	if(s<tot)return d+Queryamount(tree[now].ls,tree[pre].ls,tot-s,l,mid);
	else return Queryamount(tree[now].rs,tree[pre].rs,tot,mid+1,r);
}

const int u=1000;
int f[209][209][u+10];//amount 
int g[209][209][u+10];//sum
int c[209][209];
int Getans(int x,int y,int xx,int yy,int s){
	int l=1,r=u,mid,ans=1;
	while(l<=r){
		mid=(l+r)>>1;
		int tmp=g[xx][yy][mid]-g[xx][y-1][mid]-g[x-1][yy][mid]+g[x-1][y-1][mid];
		if(tmp>=s){
			ans=mid;l=mid+1;
		}else{
			r=mid-1;
		}
	}
	int tmp=f[xx][yy][ans]-f[xx][y-1][ans]-f[x-1][yy][ans]+f[x-1][y-1][ans];
	int tmp2=g[xx][yy][ans]-g[xx][y-1][ans]-g[x-1][yy][ans]+g[x-1][y-1][ans];
	return tmp-(tmp2-s)/ans;
//	return tmp;
}

int Workans1(){
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			scanf("%d",&c[i][j]);
			for(int k=0;k<=u;++k){
				f[i][j][k]=f[i][j-1][k]+f[i-1][j][k]-f[i-1][j-1][k];
				g[i][j][k]=g[i][j-1][k]+g[i-1][j][k]-g[i-1][j-1][k];
				if(k<=c[i][j]){
					f[i][j][k]+=1;
					g[i][j][k]+=c[i][j];
				}
			}
		}
	}
	while(T--){
		int x,y,xx,yy,s;
		scanf("%d%d%d%d%d",&x,&y,&xx,&yy,&s);
		int maxsum=g[xx][yy][0]-g[x-1][yy][0]-g[xx][y-1][0]+g[x-1][y-1][0];
		if(maxsum<s)printf("Poor QLW
");
		else printf("%d
",Getans(x,y,xx,yy,s));
	}
}

int Workans2(){
	for(int i=1;i<=m;++i){
		scanf("%d",&a[i]);b[i]=a[i];sum2[i]=a[i]+sum2[i-1];
	}
	sort(b+1,b+1+m);
	nn=unique(b+1,b+1+m)-b-1;
	
	BuildTree(root[0],1,nn);
	for(int i=1;i<=m;++i)Updatapoint(root[i],root[i-1],lower_bound(b+1,b+1+nn,a[i])-b,a[i],1,nn);
	while(T--){
		int x,y,xx,yy,s;
		scanf("%d%d%d%d%d",&x,&y,&xx,&yy,&s);
		int tmp=Queryamount(root[yy],root[y-1],s,1,nn);
		if(sum2[yy]-sum2[y-1]>=s)printf("%d
",tmp);
		else printf("Poor QLW
");
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&T);
	if(n!=1)Workans1();
	else Workans2();
	return 0;
}

  

bzoj1926[sdoi2010]粟粟的书架

 Description幸福幼儿园B29班的粟粟是一个聪明机灵、乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢ThomasH.Cormen的文章。粟粟家中有一个R行C列的巨型书架,书架的每一个位置都摆有一本书,上数第i行、左数第j列摆放的... 查看详情

ac日记——[sdoi2010]粟粟的书架bzoj1926

1926 思路:  主席树+二分水题; 代码:#include<bits/stdc++.h>usingnamespacestd;#definemaxn500005#definemaxr205#definemaxn_maxn*13#defineFalseAns"PoorQLW"intn,m,q,lc[maxn_],rc[maxn_],num[maxn_],ci[max 查看详情

刷题bzoj1926[sdoi2010]粟粟的书架

Description幸福幼儿园B29班的粟粟是一个聪明机灵、乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢ThomasH.Cormen的文章。粟粟家中有一个R行C列的巨型书架,书架的每一个位置都摆有一本书,上数第i行、左数第j列摆放的书有P... 查看详情

bzoj1926[sdoi2010]粟粟的书架

题解:这是两道题前50%:发现p[i][j]很小,于是记录f[i][j][k]表示(1,1)~(i,j)这个子矩阵内>=k的书的总高度,g[i][j][k]记录本数查询是二分答案就好了后50%:主席树,右子树够了就向右走,否则向左走 #include<iostream>#includ... 查看详情

bzoj1926[sdoi2010]粟粟的书架主席树+二分+前缀和

题目幸福幼儿园B29班的粟粟是一个聪明机灵、乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢ThomasH.Cormen的文章。粟粟家中有一个R行C列的巨型书架,书架的每一个位置都摆有一本书,上数第i行、左数第j列摆放的书有Pi,j... 查看详情

1926:[sdoi2010]粟粟的书架

1926:[Sdoi2010]粟粟的书架TimeLimit: 30Sec  MemoryLimit: 552MBSubmit: 807  Solved: 321[Submit][Status][Discuss]Description幸福幼儿园B29班的粟粟是一个聪明机灵、乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 查看详情

[bzoj1926]粟粟的书架(代码片段)

BZOJ:https://www.lydsy.com/JudgeOnline/problem.php?id=1926Luogu:https://www.luogu.org/problemnew/show/P2468BZOJ的sillyB评测机各种无故CE,只好去Luogu上A了o(╯□╰)o Algorithm:从数据范围可以发现,这其实是2道题:1、一个R×C的矩形,每次询问一个子矩... 查看详情

[sdoi2010]粟粟的书架(代码片段)

Description幸福幼儿园B29班的粟粟是一个聪明机灵、乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢ThomasH.Cormen的文章。粟粟家中有一个R行C列的巨型书架,书架的每一个位置都摆有一本书,上数第i行、左数第j列摆放的书有P... 查看详情

sdoi2010粟粟的书架(代码片段)

传送门代码1#include<iostream>2#include<cstring>3#include<cstdio>4#include<algorithm>5#include<math.h>6#definemaxn5000057usingnamespacestd;8intR,C,M;9intcont[1005];10inthe[205] 查看详情

[sdoi2010]粟粟的书架

题目大意:网址:https://daniu.luogu.org/problemnew/show/2468大意:本题有两问:[1]给定一个(R*C)的带权矩阵,询问(2×10^5)次在一个子矩阵内至少选择多少个点使他们的权值和大于(H)。[2]给定长度为L的一条链,询问(2×10^4)次在一个区间([L,... 查看详情

[sdoi2010]粟粟的书架(代码片段)

[SDOI2010]粟粟的书架题意:一个R*C的矩阵,每个位置都有个数page[ij],现在选定一个小矩阵范围(给左上角坐标,和右下角坐标),问这个范围内的数总和是否大于h,如果大于h的话最少选几个数aij对于50%的数... 查看详情

[sdoi2010]粟粟的书架[主席树](代码片段)

[SDOI2010]粟粟的书架考虑暴力怎么做显然是提取出来(x2-x1+1)*(y2-y1+1)个数字拿出来然后从大到小排序然后就可以按次取数了…然而接下来看数据范围(50\%r,cleq200)(50\%r=1,cleq5*10^5)值域(in[1,1000])对于前50%可以用个前缀和搞定…令(sum_i,j,k)... 查看详情

sdoi2010粟粟的书架lg2468(可持久化,前缀和)(代码片段)

题面见https://www.luogu.org/problemnew/show/P2468然后这道题属于合二为一题,看一眼数据范围就能发现首先我们先考虑50分,二维前缀和维护一下(反正我不记得公式,手推了半天)tot[i][j][k]表示矩阵(1,1)到(i,j)中数值大等于k的总... 查看详情

粟粟的书架题解(代码片段)

粟粟的书架题解第一次见到这种二合一的题,开始的时候居然死磕二维主席树,又是屈辱看题解系列,其实很比较好做第一部分(R,C≤200,M≤200000,1≤Pi,j≤1,000)这一部分可以用两个数组来记录:(num[i][j][k]):代表1~i,1~j的矩形中小于... 查看详情

可持久化汇总(讲解+题目)

...OI2016]神秘数CF484ESignonFenceCF1080FKatyaandSegmentsSetsP2468[SDOI2010]粟粟的书架P3302[SD 查看详情

bzoj1975:[sdoi2010]魔法猪学院

二次联通门: BZOJ1975:[Sdoi2010]魔法猪学院    /*BZOJ1975:[Sdoi2010]魔法猪学院k短路统计一下在能量用完之前走了多少条到终点的路即可*/#include<cstdio>#include<queue>#include<iostream>#include<cstring 查看详情

bzoj1923:[sdoi2010]外星千足虫

二次联通门: BZOJ1923:[Sdoi2010]外星千足虫     /*BZOJ1923:[Sdoi2010]外星千足虫高斯消元解异或方程组模板题来一发*/#include<cstdio>#include<iostream>#include<bits/stdc++.h>#defineMax2005s 查看详情

bzoj1922:[sdoi2010]大陆争霸

二次联通门: BZOJ1922:[Sdoi2010]大陆争霸     /*BZOJ1922:[Sdoi2010]大陆争霸最短路思路题带限制的转移_link[x]记录的是当前城市有多少城市保护记录两个距离一个是到当前点的最短路一个是最早能够进入当前点时间... 查看详情