ZOJ 3955 Saddle Point (树状数组)
来源:互联网 发布:app软件开发流程 编辑:程序博客网 时间:2024/06/05 13:40
H. Saddle Point
Chiaki has an n × m matrix A. Rows are numbered from 1 to n from top to bottom and columns are numbered from 1 to m from left to right. The element in the i-th row and the j-th column is Ai, j.
Let M({i1, i2, …, is}, {j1, j2, …, jt}) be the matrix that results from deleting row i1, i2, …, is and column j1, j2, …, jt of A and f({i1, i2, …, is}, {j1, j2, …, jt}) be the number of saddle points in matrix M({i1, i2, …, is}, {j1, j2, …, jt}).
Chiaki would like to find all the value of f({i1, i2, …, is}, {j1, j2, …, jt}). As the output may be very large (
Note that a saddle point of a matrix is an element which is both the only largest element in its column and the only smallest element in its row.
解题思路
此题求原矩阵 A 删除若干行及若干列后产生的一个新的矩阵
此题需单独考虑矩阵 A 中每一个
代码
#include<bits/stdc++.h>using namespace std;const int mod = 1e9 + 7;const int MAXN = 1000000 + 10;int n, m, A[1010][1010];int revR[1010][1010], revC[1010][1010];long long pow2[2010] = {1ll};int bit[MAXN];int lowbit(int x){ return x & -x; }void add(int x, int w){ for(int i=x;i<MAXN;i+=lowbit(i)) bit[i]+=w;}int get(int x){ int res = 0; for(int i=x;i;i-=lowbit(i)) res += bit[i]; return res;}void init(){ for(int i=1;i<=2000;i++) { pow2[i] = pow2[i-1] * 2; if(pow2[i] > mod) pow2[i] %= mod; } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) add(A[i][j], 1); for(int j=1;j<=m;j++) revR[i][j] = get(MAXN-1) - get(A[i][j]); for(int j=1;j<=m;j++) add(A[i][j], -1); } for(int j=1;j<=m;j++) { for(int i=1;i<=n;i++) add(A[i][j], 1); for(int i=1;i<=n;i++) revC[i][j] = get(A[i][j]-1); for(int i=1;i<=n;i++) add(A[i][j], -1); }}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d", &A[i][j]); init(); long long ans = 0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { ans += pow2[revC[i][j] + revR[i][j]]; if(ans > mod) ans %= mod; } printf("%lld\n", ans); }}
- ZOJ 3955 Saddle Point (树状数组)
- ZOJ 3955 Saddle Point (排序/二分/树状数组)
- zoj 3955 Saddle Point
- ZOJ-3955-Saddle Point【17th浙大校赛】
- ZOJ3955 Saddle Point 【快速幂】
- zoj 3724 树状数组
- zoj 3279【树状数组+二分】
- zoj 3724 树状数组经典
- ZOJ 3635 树状数组+二分
- ZOJ 3635 树状数组+二分
- zoj 3157 计算几何 + 树状数组(逆序数)
- zoj 3635(树状数组求K大)
- ZOJ 3635 Cinema in Akiba(树状数组 + 二分)
- zoj 3635 Cinema in Akiba(树状数组+二分)
- ZOJ 2112 Dynamic Rankings(树状数组套主席树)
- ZOJ 3724 Delivery(树状数组+离线处理)
- ZOJ 3635 Cinema in Akiba(二分+树状数组)
- ZOJ 2112-Dynamic Rankings (树状数组+主席树)
- 【JavaEE】第一个JSP程序--了解JSP执行过程
- 汇编语言中OUT和IN的用法
- Oracle执行优化hint使用教程
- uml类图基本知识
- select,poll.epoll区别
- ZOJ 3955 Saddle Point (树状数组)
- 安装软件出现缺少vcruntime140dll的解决方法
- 路由器逆向分析------路由器固件分析和动态调试环境搭建简述
- Shiro 权限管理filterChainDefinitions过滤器配置
- 下拉刷新上拉加载控件+Material Design使用
- 521. Longest Uncommon Subsequence I
- 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS
- 注册事件
- android 小米手机 相册图片路径空指针的问题