zoukankan      html  css  js  c++  java
  • 《算法竞赛进阶指南》0x03 前缀和 BZOJ1218

    描述:给出格子中的权值,求使用边长为R的正方形去覆盖,能得到的最大权值。

    容斥原理求解即可。需要注意的是,由于内存的限制,无法再开一个5001*5001的数组来存储A,也就是原图,只能通过S数组以及递推关系进行求解,递推关系中要注意的是

    边界情况下递推方程会衰减,并且容斥原理在边界位置也会衰减。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef unsigned int ui;
    typedef long long ll;
    typedef unsigned long long ull;
    #define pf printf
    #define mem(a,b) memset(a,b,sizeof(a))
    #define prime1 1e9+7
    #define prime2 1e9+9
    #define pi 3.14159265
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    #define scand(x) scanf("%llf",&x) 
    #define f(i,a,b) for(int i=a;i<=b;i++)
    #define scan(a) scanf("%d",&a)
    #define mp(a,b) make_pair((a),(b))
    #define P pair<int,int>
    #define dbg(args) cout<<#args<<":"<<args<<endl;
    #define inf 0x7ffffff
    inline int read(){
        int ans=0,w=1;
        char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
        while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
        return ans*w;
    }
    int n,m,t;
    const int maxn=5010;
    const ll mod=10000;
    int s[maxn][maxn];
    int main()
    {
    //    freopen("input.txt","r",stdin);
    //    freopen("output.txt","w",stdout);
        std::ios::sync_with_stdio(false);
        int r;
        cin>>n>>r;
        while(n--){
            int x,y,z;
            x=read(),y=read(),z=read();
            s[x][y]=z;//内存限制,无法使用另外的数组存权值 
        }
        f(i,0,5000)
            f(j,0,5000){
                if(i==0&&j==0)continue;//s[i][j]=A[i][j]
                else if(i==0)s[i][j]+=s[i][j-1];//s[i][j]=s[i][j-1]+A{i][j]
                else if(j==0)s[i][j]+=s[i-1][j];//s[i][j]=s[i-1][j]+A[i][j]
                else s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];             
            } 
        int ans=0;
        f(i,r-1,5000)
            f(j,r-1,5000){
                if(i==r-1&&j==r-1)ans=max(ans,s[i][j]);
                else if(i==r-1)ans=max(ans,s[i][j]-s[i][j-r]);
                else if(j==r-1)ans=max(ans,s[i][j]-s[i-r][j]);
                else ans=max(ans,s[i][j]-s[i][j-r]-s[i-r][j]+s[i-r][j-r]);//容斥             
            }
            cout<<ans<<endl;
    }
  • 相关阅读:
    数据操作-对数据的增删改查-单表查询和多表查询
    爬虫从入门到放弃
    爬虫从入门到放弃
    创建表的完整语法及表之间的关系
    树链剖分练习总结
    [BZOJ]1984: 月下“毛景树”
    [BZOJ]2243: [SDOI2011]染色
    [BZOJ]4034: [HAOI2015]树上操作
    NOIP2012题解
    CODEVS4633 [Mz]树链剖分练习
  • 原文地址:https://www.cnblogs.com/randy-lo/p/13124572.html
Copyright © 2011-2022 走看看