南京网络赛B-The writing on the wall
- 30.43%
- 2000ms
- 262144K
Feeling hungry, a cute hamster decides to order some take-away food (like fried chicken for only 3030 Yuan).
However, his owner CXY thinks that take-away food is unhealthy and expensive. So she demands her hamster to fulfill a mission before ordering the take-away food. Then she brings the hamster to a wall.
The wall is covered by square ceramic tiles, which can be regarded as a n * mn∗m grid. CXY wants her hamster to calculate the number of rectangles composed of these tiles.
For example, the following 3 * 33∗3 wall contains 3636 rectangles:

Such problem is quite easy for little hamster to solve, and he quickly manages to get the answer.
Seeing this, the evil girl CXY picks up a brush and paint some tiles into black, claiming that only those rectangles which don't contain any black tiles are valid and the poor hamster should only calculate the number of the valid rectangles. Now the hamster feels the problem is too difficult for him to solve, so he decides to turn to your help. Please help this little hamster solve the problem so that he can enjoy his favorite fried chicken.
Input
There are multiple test cases in the input data.
The first line contains a integer TT : number of test cases. T \le 5T≤5.
For each test case, the first line contains 33 integers n , m , kn,m,k , denoting that the wall is a n \times mn×m grid, and the number of the black tiles is kk.
For the next kk lines, each line contains 22 integers: x\ yx y ,denoting a black tile is on the xx-th row and yy-th column. It's guaranteed that all the positions of the black tiles are distinct.
For all the test cases,
1 \le n \le 10^5,1\le m \le 1001≤n≤105,1≤m≤100,
0 \le k \le 10^5 , 1 \le x \le n, 1 \le y \le m0≤k≤105,1≤x≤n,1≤y≤m.
It's guaranteed that at most 22 test cases satisfy that n \ge 20000n≥20000.
Output
For each test case, print "Case #xx: ansans" (without quotes) in a single line, where xx is the test case number and ansans is the answer for this test case.
Hint
The second test case looks as follows:

样例输入复制
2
3 3 0
3 3 1
2 2
样例输出复制
Case #1: 36
Case #2: 20
题目来源
感觉这道题和暑假牛客网多校赛有道题很像 求数独子矩阵的 按那个方法敲了
T了 本来先用vector存的 然后排序 觉得这里可能会T 改成了优先队列
但是还是T了 可能有时候logn还是比较大吧 题解的算法是nmm 和 nmlogn比可能还是会小一点
实际上题解的方式和牛客网上这道题的思路是一样的 只不过少了处理相同字母这一部分 要更简单一点
AC代码:
相当于每次从一个矩阵的最右下角开始加一个一列的矩阵,加一个两列的矩阵,加一个三列的矩阵...........
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#include<set>
//#include<bits/stdc++.h>
#define inf 0x7f7f7f7f7f7f7f7f
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 10;
int t, n, m, k;
int up[110], wall[maxn][110];
void init()
{
memset(wall, 0, sizeof(wall));
memset(up, 0, sizeof(up));
}
int main()
{
cin>>t;
for(int cas = 1; cas <= t; cas++){
scanf("%d%d%d", &n, &m, &k);
init();
for(int i = 0; i < k; i++){
int x, y;
scanf("%d%d", &x, &y);
wall[x][y] = 1;
}
LL ans = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(wall[i][j]){
up[j] = i;
}
}
for(int j = 1; j <= m; j++){
LL minn = inf;
for(int k = j; k > 0; k--){
minn = min(minn, (LL)(i - up[k]));
ans += minn;
}
}
}
printf("Case #%d: %lld\n", cas, ans);
}
return 0;
}
TLE代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#include<set>
//#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int maxn = 1e5;
int t, n, m, k;
int len[maxn], L[maxn][105], U[maxn][105];
//vector <LL> blackcol[105], blackrow[maxn];
priority_queue <int, vector<int>, greater<int> > blackcol[105], blackrow[maxn];
void init()
{
for(int i = 1; i <= n; i++){
while(!blackrow[i].empty()){
blackrow[i].pop();
}
blackrow[i].push(0);
//blackrow[i].clear();
//blackrow[i].push_back(0);
}
for(int i = 1; i <= m; i++){
while(!blackcol[i].empty()){
blackcol[i].pop();
}
blackcol[i].push(0);
//blackcol[i].clear();
//blackcol[i].push_back(0);
}
memset(L, 0, sizeof(L));
memset(U, 0, sizeof(U));
}
int main()
{
cin>>t;
for(int cas = 1; cas <= t; cas++){
scanf("%d%d%d", &n, &m, &k);
init();
for(int i = 0; i < k; i++){
int x, y;
scanf("%d%d", &x, &y);
blackcol[y].push(x);
blackrow[x].push(y);
//blackcol[y].push_back(x);
//blackrow[x].push_back(y);
}
/*for(int i = 1; i <= n; i++){
sort(blackrow[i].begin(), blackrow[i].end());
}
for(int i = 1; i <= m; i++){
sort(blackcol[i].begin(), blackcol[i].end());
}*/
for(int i = 1; i <= n; i++){
int now = blackrow[i].top();
blackrow[i].pop();
for(int j = 1; j <= m; j++){
if(!blackrow[i].empty()){
if(j == blackrow[i].top()){
now = blackrow[i].top();
blackrow[i].pop();
}
}
L[i][j] = min(L[i][j - 1] + 1, j - now);
}
}
for(int j = 1; j <= m; j++){
int now = blackcol[j].top();
blackcol[j].pop();
for(int i = 1; i <= n; i++){
if(!blackcol[j].empty()){
if(i == blackcol[j].top()){
now = blackcol[j].top();
blackcol[j].pop();
}
}
U[i][j] = min(U[i - 1][j] + 1, i - now);
}
}
LL ans = 0;
for(int j = 1; j <= m; j++){
memset(len, 0, sizeof(len));
for(int i = 1; i <= n; i++){
for(int k = 0; k < L[i][j]; k++){
len[k] = min(len[k] + 1, U[i][j - k]);
if(k)len[k] = min(len[k], len[k - 1]);
ans += len[k];
}
for(int k = L[i][j]; k < m; k++)len[k] = 0;
}
}
printf("Case #%d: %lld\n", cas, ans);
}
return 0;
}
南京网络赛B-The writing on the wall的更多相关文章
- 2018ICPC南京网络赛
2018ICPC南京网络赛 A. An Olympian Math Problem 题目描述:求\(\sum_{i=1}^{n} i\times i! \%n\) solution \[(n-1) \ ...
- HDU 4751 Divide Groups (2013南京网络赛1004题,判断二分图)
Divide Groups Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 4750 Count The Pairs (2013南京网络赛1003题,并查集)
Count The Pairs Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
- HDU 4758 Walk Through Squares (2013南京网络赛1011题,AC自动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)
2019ICPC南京网络赛A题 The beautiful values of the palace https://nanti.jisuanke.com/t/41298 Here is a squa ...
- 2019 南京网络赛A
南京网络赛自闭现场 https://nanti.jisuanke.com/t/41298 二维偏序经典题型 二维前缀和!!! #include<bits/stdc++.h> using n ...
- 计蒜客 2018南京网络赛 I Skr ( 回文树 )
题目链接 题意 : 给出一个由数字组成的字符串.然后要你找出其所有本质不同的回文子串.然后将这些回文子串转化为整数后相加.问你最后的结果是多少.答案模 1e9+7 分析 : 应该可以算是回文树挺裸的题 ...
- The writing on the wall 南京网络赛2018B题
样例输入复制 2 3 3 0 3 3 1 2 2 样例输出复制 Case #1: 36 Case #2: 20 题目来源 ACM-ICPC 2018 南京赛区网络预赛 题意: 就是求图中去掉涂黑的方格 ...
- 南京网络赛G-Lpl and Energy【线段树】
During tea-drinking, princess, amongst other things, asked why has such a good-natured and cute Drag ...
随机推荐
- R语言低级绘图函数-arrows
arrows 函数用来在一张图表上添加箭头,只需要分别指定起始坐标和终止坐标,就可以添加箭头了,还可以通过一些属性对箭头的形状,大小进行调整 基本用法: xo, yo 指定起始点的x和y坐标,x1, ...
- QQ空间留言的JS
直接上代码吧... var i=0; var time; function test(str) { i++; document.getElementById('tgb').contentWindow. ...
- CSS导入使用及引用的两种方法
方法一<link rel="stylesheet" type="text/css" href="test.css"> 方法二&l ...
- js焦点轮播图
汇集网上焦点轮播图的实现方式,自己试了下,不过鼠标悬浮停止动画和鼠标离开动画播放好像没生效,不太明白,最后两行代码中,为什么可以直接写stop和play.不用加括号调用函数么?求懂的大神指点! 所用知 ...
- FairyGUI和NGUI对比
一直在做Unity方面的游戏开发,经同事介绍了解到有这么一个GUI能提供跨平台的能力,有独立UI编辑器,而且功能强大,能够组合成复杂的UI界面,可以导出到Unity,Flash,Starling等,文 ...
- html5引擎开发 -- 引擎消息中心和有限状态机 - 初步整理 一
一 什么是有限状态机 FSM (finite-state machine),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.他对于逻辑以及 ...
- javascript测试框架 Mocha 实例教程
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html
- mybatis由浅入深day01_5mybatis开发dao的方法(5.1SqlSession使用范围_5.2原始dao开发方法)
5 mybatis开发dao的方法 5.1 SqlSession使用范围 5.1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂 ...
- laravel框架容器管理的一些要点
本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. ...
- 图片上传根据stream生成image
对于图片上传代码的整合 因为需要判断上传的图片的宽高是否符合尺寸,所以在最初拿到inputstream的时候,就直接获取image格式的图片 本来是想在下面的checkFile中获取的,不过直接使用S ...