ZOJ 3955 Saddle Point 校赛 一道计数题
题意是这样的 给定一个n*m的整数矩阵 n和m均小于1000
对这个矩阵删去任意行和列后剩余一个矩阵为M{x1,x2,,,,xm;y1,y2,,,,,yn}表示删除任意的M行N列
对于这个剩下的矩阵,我们考虑其中是否存在特殊的元素,保证这些元素是所在行最大,所在列最小的元素 且非之一。
求对于所有删法,上述元素个数之和 对10^9+7取余。
显然所有删法 有2^(n+m)种 暴力是搞不定的。
于是反过来看,矩阵的元素最多有10^6个 是不是可以考虑每一个元素对最终答案的贡献?
所谓贡献,就是它在哪几种删法的矩阵中是“特殊的元素”。
于是,我们考虑对于任意一个元素,在它所在的行有多少严格小于它的,在它所在的列有多少严格大于它的 然后乘法原理一下,就可以知道这个元素对答案的贡献是多少了。
没有想到好的预处理方法可以在常数时间内回答上述询问,于是考虑在遍历元素的过程中直接求得上述询问。
首先对所有元素排序,(当然提前标记好每个元素所在行和所在列)
这样当我们遍历到其中某个元素时,根据之前遍历过的元素以及元素总和,知道所在行列的具体情况了,然后对2的1000次幂提前打表储存,最后的复杂度为O(N*M) 顺利AC
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- using namespace std;
- const int maxn=1000+1;
- typedef long long int LL;
- struct point
- {
- LL val;
- int x;int y;
- };
- point pp[maxn*maxn];
- int sumr[maxn],sumc[maxn];
- int sumlr[maxn],sumlc[maxn],sumrr[maxn],sumrc[maxn];
- const LL MOD=1000000007;
- bool cmp(point a,point b)
- {
- return a.val<b.val;
- }
- queue<point>q,qq;
- LL poww[maxn+10];
- int main()
- {//freopen("t.txt","r",stdin);
- int T;
- scanf("%d",&T);
- while(T--)
- {
- LL np=1;
- for(int i=0;i<=1005;i++)
- {
- poww[i]=np;
- np=np*2%MOD;
- }
- int n,m;
- scanf("%d%d",&n,&m);
- for(int i=0;i<n;i++)
- for(int j=0;j<m;j++)
- {
- scanf("%lld",&pp[i*m+j].val);
- pp[i*m+j].x=i;pp[i*m+j].y=j;
- }
- for(int i=0;i<n;i++)sumr[i]=sumlr[i]=sumrr[i]=m;
- for(int i=0;i<m;i++)sumc[i]=sumlc[i]=sumrc[i]=n;
- sort(pp,pp+n*m,cmp);
- LL nv=pp[0].val;
- int suma=0,sumb=0;
- LL ans=0;
- int i=0;
- while(i<n*m)
- {
- while(pp[i].val==nv&&i<n*m)
- {
- // cout<<pp[i].val<<endl;
- q.push(pp[i]);
- sumrr[pp[i].x]--;
- sumrc[pp[i].y]--;
- i++;
- }
- while(!q.empty())
- {
- point np=q.front();q.pop();
- //cout<<"npv "<<np.val<<"x"<<np.x<<endl;
- qq.push(np);
- //cout<<"sumc"<<sumc[np.y]<<endl;
- //cout<<"sumlc"<<sumc[np.y]-sumlc[np.y]<<endl;
- //cout<<"sumr"<<sumrr[pp[i].x]<<endl;
- ans=(ans+poww[sumc[np.y]-sumlc[np.y]]*poww[sumrr[np.x]])%MOD;
- //cout<<"ans:"<<ans<<endl;
- }
- nv=pp[i].val;
- while(!qq.empty())
- {
- point np=qq.front();qq.pop();
- sumlc[np.y]=sumrc[np.y];
- }
- }
- printf("%lld\n",ans);
- }
- return 0;
- }
————————————————
吐槽一下ZJU校赛,竟然 竟然有三道水题!!!
我做完两道估计就没有水题了,于是花了一个小时写这道计数题,回头看还有一道日历的水题,时间不够调不出来了。。。卒 还好顺利晋级省赛,希望和新的队友密切配合拿下省赛。
ZOJ 3955 Saddle Point 校赛 一道计数题的更多相关文章
- HZNU第十二届校赛赛后补题
愉快的校赛翻皮水! 题解 A 温暖的签到,注意用gets #include <map> #include <set> #include <ctime> #inclu ...
- ZOJ 3955 Saddle Point
排序. 枚举每一个格子,计算这个格子在多少矩阵中是鞍点,只要计算这一行有多少数字比他大,这一列有多少数字比他小,方案数乘一下就是这个格子对答案做出的贡献. #include<bits/stdc+ ...
- Crosses Puzzles zoj 4018 (zju校赛)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5746 题目大意: N*M的方格里,每个格子有一个指针,一开始指向上下左右四个方 ...
- ZOJ 3949 (17th 浙大校赛 B题,树型DP)
题目链接 The 17th Zhejiang University Programming Contest Problem B 题意 给定一棵树,现在要加一条连接$1$(根结点)和$x$的边,求加 ...
- 牛客网-湘潭大学校赛重现H题 (线段树 染色问题)
链接:https://www.nowcoder.com/acm/contest/105/H来源:牛客网 n个桶按顺序排列,我们用1~n给桶标号.有两种操作: 1 l r c 区间[l,r]中的每个桶中 ...
- 算法笔记_216:第六届蓝桥杯软件类校赛部分真题(Java语言C组)
目录 1 题目一 2 题目二 3 题目三 4 题目四 5 题目五 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学 ...
- 算法笔记_215:第六届蓝桥杯软件类校赛部分真题(Java语言B组)
目录 1 题目一 2 题目二 3 题目三 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 java中提供了对正则表达式的支持. 有的时候,恰当地使用正则,可以让我们的工作事半功倍! 如下代码 ...
- kmp变形,带通配符的kmp——华科校赛E 好题
https://blog.csdn.net/a302549450/article/details/80948741?tdsourcetag=s_pctim_aiomsg 上面是题解的链接.., 其实和 ...
- 校赛F
问题描述 例如对于数列[1 2 3 4 5 6],排序后变为[6 1 5 2 4 3].换句话说,对于一个有序递增的序列a1, a2, a3, ……, an,排序后为an, a1, an-1, a2, ...
随机推荐
- stm8l定时器中的ARPE
• Auto-reload preload enabled (ARPE bit set in the TIM1_CR1 register). In this mode,when data is wri ...
- python之更加抽象 2014-4-6
#更加抽象 12:50pm- 14:50 p112- 1.对象的魔力 多态 如count 在多种数据类型中都可以实现计数的功能 封装 对全局作用域中其他区域隐藏多余信息的原则 继承2.类和类型 创建类 ...
- ORACLE数据库查看执行计划的方法
一.什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述. 二.如何查看执行计划 1: 在PL/SQL下按F5查看执行计划.第三方工具toad等 ...
- bzoj 1430 小猴打架 prufer 性质
小猴打架 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 709 Solved: 512[Submit][Status][Discuss] Descri ...
- restful(3):认证、权限、频率 & 解析器、路由控制、分页、渲染器、版本
models.py中: class UserInfo(models.Model): name = models.CharField(max_length=32) psw = models.CharFi ...
- 运算符、流程控制、while循环
运算符: 1. 算术运算符: “ + ”.“ - ” .“ * ” .“ / ” 分别为加.减.乘.除. # % 是“取模运算符”,就是返回除法的余数.eg. a = 3, b=5, b % a 就是 ...
- ajax接收json数据到js解析
今天又学到了一点新知识,脑子记不住东西特把它记录下来! 页面ajax请求后台时一般都是返回字符串进行判断,要是返回list或者对象时该怎么办? 第一种:ajax接收到list并返回给前台 js代码: ...
- [ C语言 ] 迷宫 迷宫生成器 [ 递归与搜索 ]
[原创]转载请注明出处 [浙江大学 程序设计专题] [地图求解器] 本题目要求输入一个迷宫地图,输出从起点到终点的路线. 基本思路是从起点(Sx,Sy)每次枚举该格子上下左右四个方向,直到走到终点(T ...
- LOJ#541. 「LibreOJ NOIP Round #1」七曜圣贤
有一辆车一开始装了编号0-a的奶茶,现有m次操作,每次操作Pi在[-1,b),若Pi为一个未出现过编号的奶茶,就把他买了并装上车:若Pi为一个在车上的奶茶,则把他丢下车:否则,此次操作为捡起最早丢下去 ...
- SQL SERVER 2012 第三章 T-SQL 基本SELECT语句用法,Where子句详细用法
select [all|distinct] [top (<expression>) [Percent] [with ties]] <column list> [from < ...