ZOJ3955

题意是这样的 给定一个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 校赛 一道计数题的更多相关文章

  1. HZNU第十二届校赛赛后补题

    愉快的校赛翻皮水! 题解 A 温暖的签到,注意用gets #include <map> #include <set> #include <ctime> #inclu ...

  2. ZOJ 3955 Saddle Point

    排序. 枚举每一个格子,计算这个格子在多少矩阵中是鞍点,只要计算这一行有多少数字比他大,这一列有多少数字比他小,方案数乘一下就是这个格子对答案做出的贡献. #include<bits/stdc+ ...

  3. Crosses Puzzles zoj 4018 (zju校赛)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5746 题目大意: N*M的方格里,每个格子有一个指针,一开始指向上下左右四个方 ...

  4. ZOJ 3949 (17th 浙大校赛 B题,树型DP)

    题目链接  The 17th Zhejiang University Programming Contest Problem B 题意  给定一棵树,现在要加一条连接$1$(根结点)和$x$的边,求加 ...

  5. 牛客网-湘潭大学校赛重现H题 (线段树 染色问题)

    链接:https://www.nowcoder.com/acm/contest/105/H来源:牛客网 n个桶按顺序排列,我们用1~n给桶标号.有两种操作: 1 l r c 区间[l,r]中的每个桶中 ...

  6. 算法笔记_216:第六届蓝桥杯软件类校赛部分真题(Java语言C组)

    目录 1 题目一 2 题目二 3 题目三 4 题目四 5 题目五 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学 ...

  7. 算法笔记_215:第六届蓝桥杯软件类校赛部分真题(Java语言B组)

    目录 1 题目一 2 题目二 3 题目三 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 java中提供了对正则表达式的支持. 有的时候,恰当地使用正则,可以让我们的工作事半功倍! 如下代码 ...

  8. kmp变形,带通配符的kmp——华科校赛E 好题

    https://blog.csdn.net/a302549450/article/details/80948741?tdsourcetag=s_pctim_aiomsg 上面是题解的链接.., 其实和 ...

  9. 校赛F

    问题描述 例如对于数列[1 2 3 4 5 6],排序后变为[6 1 5 2 4 3].换句话说,对于一个有序递增的序列a1, a2, a3, ……, an,排序后为an, a1, an-1, a2, ...

随机推荐

  1. ruby cloud9部署到heroku

    Cloud9网址:https://c9.io/ 使用github账号登陆,如果没有,现在github(https://github.com/)上注册一个用户,在进行登陆.

  2. CODE【VS】3160 最长公共子串 (后缀自动机)

    3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Outp ...

  3. web前端开发——HTML

    一.简介 1.发展史 (1)web1.0 时代 产物:网页制作 那时的网页主要是静态网页,即没有与用户交互,仅仅是提供信息浏览的网页.如QQ日志.博文等. 网页制作三剑客:Dreamweaver+Fi ...

  4. Unity 3D 使用TerrainCompose 调用RTP 报错:

    Unity 3D:5.2 version TerrainCompose:1.92 version RTP:3.2d version Unity 3D  使用TerrainCompose 调用RTP 报 ...

  5. chrome webstore

    chrome webstore https://chrome.google.com/webstore/detail/set-character-encoding/bpojelgakakmcfmjfil ...

  6. [luoguP2146] 软件包管理器(树链剖分)

    传送门 看着很吓人,其实就是个树链剖分模板. 可支持操作: 1.将节点 x 到 根 的路径上的值都变成 1 2.将以节点 x 为根的子树的值都变成 0 1A爽~ ——代码 #include <c ...

  7. 【数轴涂色+并查集路径压缩+加速】C. String Reconstruction

    http://codeforces.com/contest/828/problem/C [题意] [思路] 因为题目保证一定有解,所有优化时间复杂度的关键就是不要重复染色,所以我们可以用并查集维护区间 ...

  8. hdu - 2266 How Many Equations Can You Find (简单dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=2266 给一个字符串和一个数n,在字符串中间可以插入+或者 -,问有多少种等于n的情况. 要注意任意两个数之间都可 ...

  9. SOJ 2800_三角形

    真的是O不是0[看了discuss才发现.....一个大写的蠢 [题意]多个黑白三角形组成的倒三角,求白三角形组成的最大倒三角的面积 [分析]由于问的是倒三角个数,所以只需看与行数奇偶性相同的白色倒三 ...

  10. hdfs是什么?

    参考:https://www.cnblogs.com/shijiaoyun/p/5778025.html hadoop分布式文件系统 1.hdfs是一个分布式文件系统,简单理解就是多台机器组成的一个文 ...