我是靠谱客的博主 可爱发带,最近开发中收集的这篇文章主要介绍容斥原理·Gym101350G·Snake Rana,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目大意:n*m的矩阵问不包含炸弹的子矩阵总数;

解题思路:

奇加偶减容斥。

AC代码:

#include <iostream>
#include <cmath>
#include<cstdio>
#include <algorithm>
#include <map>

using namespace std;

typedef long long ll;
#define maxd 10000 + 10
#define inf 0x3f3f3f3f3f3f3f3f

ll n, m, k;
struct node {
    ll x, y;
};
node ac[maxd];

int main() {
    int t;
    cin >> t;
    while(t --) {
        cin >> n >> m >> k;
        for (int i = 0; i < k; i++) {
            cin >> ac[i].x >> ac[i].y ;
        }
        ll ans = (n + 1) * n/2 * (m + 1) * m/2;
       // cout << "ans :: " << ans << endl;
        for (int i = 1; i < (1<<k); i++) {
            ll cnt = 0;
//            ll LU = 0, LD = 0, RU = 0, RD = 0;
            ll max_x = 0;
            ll min_x = inf;
            ll max_y = 0;
            ll min_y = inf;
            for(int j = 0; j < k; j++) {
                if(i>>j&1) {
                    max_y = max(max_y, ac[j].y);
                    min_y = min(min_y, ac[j].y);
                    max_x = max(max_x, ac[j].x);
                    min_x = min(min_x, ac[j].x);
                    cnt ++;
                }
            }
            //ll nn = max_y - min_y;
           // ll mm = max_x - min_x;
            //ll res = (nn+1) * nn/2 * (mm + 1) * mm/2;
            ll res = min_x * min_y * (n - max_x + 1) * (m - max_y + 1);
            //cout << "res : " << res << endl;
            if(cnt & 1) {
                ans -= res;
            }
            else {
                ans += res;
            }
        }
        cout << ans << endl;
    }
}

最后

以上就是可爱发带为你收集整理的容斥原理·Gym101350G·Snake Rana的全部内容,希望文章能够帮你解决容斥原理·Gym101350G·Snake Rana所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部