zoukankan      html  css  js  c++  java
  • bzoj1926 [Sdoi2010]粟粟的书架

    Description

    幸福幼儿园 B29 班的粟粟是一个聪明机灵、乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章。粟粟家中有一个 R行C 列的巨型书架,书架的每一个位置都摆有一本书,上数第i 行、左数第j 列摆放的书有Pi,j页厚。粟粟每天除了读书之外,还有一件必不可少的工作就是摘苹果,她每天必须摘取一个指定的苹果。粟粟家果树上的苹果有的高、有的低,但无论如何凭粟粟自己的个头都难以摘到。不过她发现, 如果在脚下放上几本书,就可以够着苹果;她同时注意到,对于第 i 天指定的那个苹果,只要她脚下放置书的总页数之和不低于Hi,就一定能够摘到。由于书架内的书过多,父母担心粟粟一天内就把所有书看完而耽误了上幼儿园,于是每天只允许粟粟在一个特定区域内拿书。这个区域是一个矩形,第 i 天给定区域的左上角是上数第 x1i行的左数第 y1i本书,右下角是上数第 x2i行的左数第y2i本书。换句话说,粟粟在这一天,只能在这﹙x2i-x1i+1﹚×﹙y2i-y1i+1﹚本书中挑选若干本垫在脚下,摘取苹果。粟粟每次取书时都能及时放回原位,并且她的书架不会再撤下书目或换上新书,摘苹果的任务会一直持续 M天。给出每本书籍的页数和每天的区域限制及采摘要求,请你告诉粟粟,她每天至少拿取多少本书,就可以摘到当天指定的苹果。

    Input

    第一行是三个正整数R,C,M。
    接下来是一个R行C列的矩阵,从上到下、从左向右依次给出了每本书的页数Pi,j。
    接下来M行,第i行给出正整数x1i,y1i,x2i,y2i,Hi,表示第i天的指定区域是﹙x1i,y1i﹚与﹙x2i,y2i﹚间的矩形,总页数之和要求不低于Hi。
    保证1≤x1i≤x2i≤R,1≤y1i≤y2i≤C。

    Output

    有M行,第i 行回答粟粟在第 i 天时为摘到苹果至少需要 拿取多少本书。如果即使取走所有书都无法摘到苹果,则在该行输出“Poor QLW” (不含引号)。

    Sample Input

    5 5 7
    14 15 9 26 53
    58 9 7 9 32
    38 46 26 43 38
    32 7 9 50 28
    8 41 9 7 17
    1 2 5 3 139
    3 1 5 5 399
    3 3 4 5 91
    4 1 4 1 33
    1 3 5 4 185
    3 3 4 3 23
    3 1 3 3 108

    Sample Output

    6
    15
    2
    Poor QLW
    9
    1
    3

    HINT

    对于 10%的数据,满足 R, C≤10; 
    对于 20%的数据,满足 R, C≤40; 
    对于 50%的数据,满足 R, C≤200,M≤200,000; 
    另有 50%的数据,满足 R=1,C≤500,000,M≤20,000; 
    对于 100%的数据,满足 1≤Pi,j≤1,000,1≤Hi≤2,000,000,000

    正解:二分+主席树。

    闲得无聊刷水题。。因为这题用可持久化二维线段树过不去,所以只能写两个程序。。

    $R,C<=200$,因为$Pi,j$很小,直接记一个后缀和,二分答案即可。

    $R=1$,直接建主席树,乱搞一下即可。

      1 //It is made by wfj_2048~
      2 #include <algorithm>
      3 #include <iostream>
      4 #include <cstring>
      5 #include <cstdlib>
      6 #include <cstdio>
      7 #include <vector>
      8 #include <cmath>
      9 #include <queue>
     10 #include <stack>
     11 #include <map>
     12 #include <set>
     13 #define il inline
     14 #define RG register
     15 #define ll long long
     16 
     17 using namespace std;
     18 
     19 int n,m,Q;
     20 
     21 il int gi(){
     22     RG int x=0,q=1; RG char ch=getchar();
     23     while ((ch<'0' || ch>'9') && ch!='-') ch=getchar();
     24     if (ch=='-') q=-1,ch=getchar();
     25     while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar();
     26     return q*x;
     27 }
     28 
     29 namespace chair{
     30 
     31 #define N (500010)
     32     
     33     struct query{ int l,r,h; }q[N];
     34     
     35     int sum[15*N],num[15*N],ls[15*N],rs[15*N],rt[N],a[N],sz;
     36     
     37     il void insert(RG int x,RG int &y,RG int l,RG int r,RG int v){
     38     sum[y=++sz]=sum[x]+v,num[y]=num[x]+1,ls[y]=ls[x],rs[y]=rs[x];
     39     if (l==r) return; RG int mid=(l+r)>>1;
     40     v<=mid?insert(ls[x],ls[y],l,mid,v):insert(rs[x],rs[y],mid+1,r,v); return;
     41     }
     42     
     43     il int query(RG int x,RG int y,RG int l,RG int r,RG int v){
     44     if (l==r) return (v-1)/l+1; RG int mid=(l+r)>>1,tmp=sum[rs[y]]-sum[rs[x]];
     45     return v<=tmp?query(rs[x],rs[y],mid+1,r,v):query(ls[x],ls[y],l,mid,v-tmp)+num[rs[y]]-num[rs[x]];
     46     }
     47     
     48     int main(){
     49     for (RG int i=1;i<=m;++i) a[i]=gi();
     50     for (RG int i=1;i<=m;++i) insert(rt[i-1],rt[i],1,1000,a[i]);
     51     for (RG int i=1,l1,l2,r1,r2,h;i<=Q;++i){
     52         l1=gi(),r1=gi(),l2=gi(),r2=gi(),h=gi();
     53         if (sum[rt[r2]]-sum[rt[r1-1]]<(ll)h) puts("Poor QLW");
     54         else printf("%d
    ",query(rt[r1-1],rt[r2],1,1000,h));
     55     }
     56     return 0;
     57     }
     58 
     59 #undef N
     60     
     61 }
     62 
     63 namespace twopoints{
     64 
     65 #define N (210)
     66 
     67     int sum[1010][N][N],num[1010][N][N],p[N][N];
     68 
     69     il int asksum(RG int k,RG int l1,RG int r1,RG int l2,RG int r2){
     70     return sum[k][l2][r2]-sum[k][l1-1][r2]-sum[k][l2][r1-1]+sum[k][l1-1][r1-1];
     71     }
     72 
     73     il int asknum(RG int k,RG int l1,RG int r1,RG int l2,RG int r2){
     74     return num[k][l2][r2]-num[k][l1-1][r2]-num[k][l2][r1-1]+num[k][l1-1][r1-1];
     75     }
     76     
     77     il int query(RG int l1,RG int r1,RG int l2,RG int r2,RG int h){
     78     RG int l=1,r=1000,mid,key,res=1;
     79     while (l<=r){
     80         mid=(l+r)>>1;
     81         if (asksum(mid,l1,r1,l2,r2)>=h) res=mid,l=mid+1; else r=mid-1;
     82     }
     83     key=asksum(res+1,l1,r1,l2,r2);
     84     return asknum(res+1,l1,r1,l2,r2)+(h-key-1)/res+1;
     85     }
     86     
     87     int main(){
     88     for (RG int i=1;i<=n;++i)
     89         for (RG int j=1;j<=m;++j)
     90         p[i][j]=gi(),sum[p[i][j]][i][j]=p[i][j],num[p[i][j]][i][j]=1;
     91     for (RG int k=1000;k;--k)
     92         for (RG int i=1;i<=n;++i)
     93         for (RG int j=1;j<=m;++j)
     94             sum[k][i][j]+=sum[k+1][i][j],num[k][i][j]+=num[k+1][i][j];
     95     for (RG int k=1000;k;--k)
     96         for (RG int i=1;i<=n;++i)
     97         for (RG int j=1;j<=m;++j){
     98             sum[k][i][j]+=sum[k][i][j-1]+sum[k][i-1][j]-sum[k][i-1][j-1];
     99             num[k][i][j]+=num[k][i][j-1]+num[k][i-1][j]-num[k][i-1][j-1];
    100         }
    101     for (RG int i=1,l1,r1,l2,r2,h;i<=Q;++i){
    102         l1=gi(),r1=gi(),l2=gi(),r2=gi(),h=gi();
    103         if (asksum(1,l1,r1,l2,r2)<h) puts("Poor QLW");
    104         else printf("%d
    ",query(l1,r1,l2,r2,h));
    105     }
    106     return 0;    
    107     }
    108     
    109 #undef N
    110     
    111 }
    112 
    113 int main(){
    114 #ifndef ONLINE_JUDGE
    115     freopen("bookshelf.in","r",stdin);
    116     freopen("bookshelf.out","w",stdout);
    117 #endif
    118     n=gi(),m=gi(),Q=gi();
    119     if (n==1) chair::main();
    120     else twopoints::main();
    121     return 0;
    122 }
  • 相关阅读:
    yolo_to_onnx ValueError: need more tan 1 value to unpack
    yolo_to_onnx killed
    C++ 实现二维矩阵的加减乘等运算
    Leetcode 1013. Partition Array Into Three Parts With Equal Sum
    Leetcode 1014. Best Sightseeing Pair
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 219. Contains Duplicate II
    Leetcode 890. Find and Replace Pattern
    Leetcode 965. Univalued Binary Tree
    Leetcode 700. Search in a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/wfj2048/p/7267289.html
Copyright © 2011-2022 走看看