SDOI2010 粟粟的书架
Posted fang-hao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDOI2010 粟粟的书架相关的知识,希望对你有一定的参考价值。
代码
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<math.h> 6 #define maxn 500005 7 using namespace std; 8 int R,C,M; 9 int cont[1005]; 10 int he[205][205][1005],nu[205][205][1005],a[205][205]; 11 long long hh[maxn],sum[maxn*11]; 12 int lson[maxn*11],rson[maxn*11],cnt=1,root[maxn],num[maxn*11]; 13 inline void ins(int &ID,int IDl,int nl,int nr,long long v){ 14 if(!ID)ID=++cnt; 15 if(nl==nr){ 16 num[ID]=num[IDl]+1,sum[ID]=v+sum[IDl]; //注意!!!! 17 return; 18 } 19 int m=(nl+nr)>>1; 20 if(m>=v){ 21 rson[ID]=rson[IDl]; 22 ins(lson[ID],lson[IDl],nl,m,v); 23 } 24 else { 25 lson[ID]=lson[IDl]; 26 ins(rson[ID],rson[IDl],m+1,nr,v); 27 } 28 sum[ID]=sum[lson[ID]]+sum[rson[ID]]; 29 num[ID]=num[lson[ID]]+num[rson[ID]]; 30 } 31 inline int query(int ID,int IDl,int nl,int nr,long long v){ 32 if(nl==nr)return ceil((double)v/nl); 33 int ans,m=(nl+nr)>>1; 34 if(sum[rson[ID]]-sum[rson[IDl]]<=v)return ans=num[rson[ID]]-num[rson[IDl]]+query(lson[ID],lson[IDl],nl,m,v-(sum[rson[ID]]-sum[rson[IDl]])); 35 else return ans=query(rson[ID],rson[IDl],m+1,nr,v); 36 } 37 inline long long calc(int k,int x1,int y1,int x2,int y2){ 38 return he[x2][y2][k]-he[x1-1][y2][k]-he[x2][y1-1][k]+he[x1-1][y1-1][k]; 39 } 40 inline int get_ans(int k,int x1,int y1,int x2,int y2){ 41 return nu[x2][y2][k]-nu[x1-1][y2][k]-nu[x2][y1-1][k]+nu[x1-1][y1-1][k]; 42 } 43 inline void solve(){ 44 for(register int i=1;i<=R;i++){ 45 for(register int j=1;j<=C;j++){ 46 scanf("%lld",&a[i][j]); 47 cont[a[i][j]]++; 48 } 49 } 50 for(register int k=1;k<=1000;k++){ 51 for(register int i=1;i<=R;i++){ 52 for(register int j=1;j<=C;j++){ 53 he[i][j][k]=he[i-1][j][k]+he[i][j-1][k]-he[i-1][j-1][k]; 54 nu[i][j][k]=nu[i-1][j][k]+nu[i][j-1][k]-nu[i-1][j-1][k]; 55 if(a[i][j]>=k)he[i][j][k]+=a[i][j],nu[i][j][k]++; 56 } 57 } 58 } 59 register int x1,x2,y1,y2; 60 register long long h; 61 while(M--){ 62 scanf("%d%d%d%d%lld",&x1,&y1,&x2,&y2,&h); 63 if(calc(1,x1,y1,x2,y2)<h){ 64 printf("Poor QLW\n"); 65 continue; 66 } 67 int l=1,r=1000; 68 while(l<=r){ 69 int m=(l+r)>>1; 70 if(calc(m,x1,y1,x2,y2)>=h)l=m+1; 71 else r=m-1; 72 } 73 int final=(l+r)>>1; 74 int ans=get_ans(final,x1,y1,x2,y2); 75 int fsum=calc(final,x1,y1,x2,y2); 76 int jian=cont[final]; 77 while(jian&&fsum-final>=h){ 78 jian--,fsum-=final,ans--; 79 } 80 printf("%d\n",ans); 81 } 82 } 83 int main(){ 84 scanf("%d%d%d",&R,&C,&M); 85 if(R!=1){ 86 solve(); 87 return 0; 88 } 89 register int x1,x2,y1,y2; 90 register long long h,maxh=0; 91 for(register int i=1;i<=C;i++){ 92 scanf("%lld",&hh[i]); 93 maxh=max(maxh,hh[i]); 94 } 95 root[0]=1; 96 for(register int i=1;i<=C;i++){ 97 ins(root[i],root[i-1],1,maxh,hh[i]); 98 } 99 for(register int i=1;i<=M;i++){ 100 scanf("%d%d%d%d%lld",&x1,&y1,&x2,&y2,&h); 101 if(sum[root[y2]]-sum[root[y1-1]]<h){ 102 printf("Poor QLW\n"); 103 continue; 104 } 105 else printf("%d\n",query(root[y2],root[y1-1],1,maxh,h)); 106 } 107 }
以上是关于SDOI2010 粟粟的书架的主要内容,如果未能解决你的问题,请参考以下文章