zoukankan      html  css  js  c++  java
  • G. Snake Rana 容斥原理

    题意: 统计网格矩形的子矩形数目,其中要求每个格子不能包含一些特殊格子(特殊格子小于20)

    思路:统计格子是个老问题,sum=n*(n+1)/2*m*(m+1)/2 这里要求一些格子不合法,显然用总答案减去非法答案更容易计算。

    计算非法答案时k<=20是一个提示算是,我们可以直接枚举包含的非法格子数目,然后再容斥就好。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define MEM(a,b) memset(a,b,sizeof(a))
    #define PB push_back
    #define MP make_pair
    #define X first
    #define Y second
    #define bug puts("bug");
    typedef long long ll;
    typedef pair<ll,ll> pii;
    const double PI=acos(-1);
    pii p[30];
    int tmp[10];
    ll sum;
    ll t,a,b,n,m,k;
    void dfs(int id,int pp,ll lux,ll luy,ll rdx,ll rdy){
        if(pp==1) sum-=lux*luy*(n-rdx+1)*(m-rdy+1);
        else sum+=lux*luy*(n-rdx+1)*(m-rdy+1);
        for(int i=id+1;i<k;i++){
            dfs(i,pp^1,min(lux,p[i].X),min(luy,p[i].Y),max(rdx,p[i].X),max(rdy,p[i].Y));
        }
    }
    
    int main(){
        cin>>t;
        while(t--){
            cin>>n>>m>>k;
            sum=m*(m+1)/2*n*(n+1)/2;
            for(int i=0;i<k;i++) cin>>p[i].X>>p[i].Y;
            for(int i=0;i<k;i++)
                dfs(i,1,p[i].X,p[i].Y,p[i].X,p[i].Y);
            cout<<sum<<endl;
        }
        return 0;
    }
    



  • 相关阅读:
    elipse图标注解
    Thrift源码解析--transport
    IDL和生成代码分析
    thrift概述
    less分页阅读
    this与super使用总结(java)
    more分页阅读
    Arrays
    Teigha克隆db的blockTableRecord里面的一个实体
    Teigha的BlockTableRecord获取方法
  • 原文地址:https://www.cnblogs.com/zhangxianlong/p/10672512.html
Copyright © 2011-2022 走看看