zoukankan      html  css  js  c++  java
  • Saddle Point ZOJ

    题意:

      给出一个矩阵,删掉一些行和列之后 求剩下矩阵的鞍点的总个数

    解析:

      对于每个点 我们可以求出来 它所在的行和列  有多少比它大的 设为a 有多少比它小的 设为b

     然后对于那些行和列 都有两种操作 删和不删 所以一个点 就有2^a * 2^b 种成为鞍点的存在形式

    求出来所有的点的情况 加起来就好了

    英语限制了我的想象力

    #include <iostream>
    #include <cstdio>
    #include <sstream>
    #include <cstring>
    #include <map>
    #include <cctype>
    #include <set>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #include <bitset>
    #define rap(i, a, n) for(int i=a; i<=n; i++)
    #define rep(i, a, n) for(int i=a; i<n; i++)
    #define lap(i, a, n) for(int i=n; i>=a; i--)
    #define lep(i, a, n) for(int i=n; i>a; i--)
    #define rd(a) scanf("%d", &a)
    #define rlld(a) scanf("%lld", &a)
    #define rc(a) scanf("%c", &a)
    #define rs(a) scanf("%s", a)
    #define pd(a) printf("%d
    ", a);
    #define plld(a) printf("%lld
    ", a);
    #define pc(a) printf("%c
    ", a);
    #define ps(a) printf("%s
    ", a);
    #define LL long long
    #define ULL unsigned long long
    #define Pair pair<int, int>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define _  ios_base::sync_with_stdio(0),cin.tie(0)
    //freopen("1.txt", "r", stdin);
    using namespace std;
    const int maxn = 1010, INF = 0x7fffffff, LL_INF = 0x7fffffffffffffff, MOD = 1e9 + 7;
    LL num[maxn][maxn], row[maxn][maxn], cal[maxn][maxn];
    
    LL inv(LL a, LL b)
    {
        LL res = 1;
        while(b)
        {
            if(b & 1) res = res * a % MOD;
            a = a * a % MOD;
            b >>= 1;
        }
        return res;
    }
    
    int main()
    {
        int T, n, m;
        rd(T);
        while(T--)
        {
            rd(n), rd(m);
            for(int i = 0; i < n; i++)
            {
                for(int j = 0; j < m; j++)
                {
                    rlld(num[i][j]);
                    row[i][j] = num[i][j];
                    cal[j][i] = num[i][j];
                }
                sort(row[i], row[i] + m);
            }
            for(int i = 0; i < m; i++) sort(cal[i], cal[i] + n);
            LL res = 0;
            for(int i = 0; i < n; i++)
                for(int j = 0; j < m; j++)
                {
                    LL tmp1 = upper_bound(row[i], row[i] + m, num[i][j]) - row[i];
                    LL tmp2 = lower_bound(cal[j], cal[j] + n, num[i][j]) - cal[j];
                    tmp1 = m - tmp1;
                    res = (res + (inv(2, tmp1) % MOD * inv(2, tmp2) % MOD) % MOD) % MOD;
                }
            cout << res << endl;
        }
    
        return 0;
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    GenericServlet和HttpServlet有什么区别?
    什么是RMI?
    【WPF学习】第十八章 多点触控输入
    【WPF学习】第十七章 鼠标输入
    【WPF学习】第十六章 键盘输入
    【WPF学习】第十五章 WPF事件
    【WPF学习】第十四章 事件路由
    【WPF学习】第十三章 理解路由事件
    【WPF学习】第十二章 属性验证
    【WPF学习】第十一章 理解依赖项属性
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9735135.html
Copyright © 2011-2022 走看看