4D consecutive sums 涨姿势了。。。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int m[50][50];
int rui[50][50];
int det[50][50][50][50];
int ans[50][50][50][50];
int x,y,q;
char str[50];
int main()
{
scanf("%d%d%d",&x,&y,&q);
for(int i=0;i<x;i++)
{
scanf("%s",str);
for(int j=0;j<y;j++)
{
m[i][j]=str[j]-'0';
}
}
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
rui[i+1][j+1]=rui[i+1][j]+rui[i][j+1]-rui[i][j]+m[i][j];
}
}
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
for(int k=i;k<x;k++)
{
for(int l=j;l<y;l++)
{
if(rui[k+1][l+1]+rui[i][j]-rui[i][l+1]-rui[k+1][j]==0)
{
det[i][j][k][l]=1;
}
}
}
}
}
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
for(int k=0;k<x;k++)
{
for(int l=0;l<y;l++)
{
ans[i+1][j+1][k+1][l+1]
=ans[i][j+1][k+1][l+1]
+ans[i+1][j][k+1][l+1]
+ans[i+1][j+1][k][l+1]
+ans[i+1][j+1][k+1][l]
-ans[i][j][k+1][l+1]
-ans[i][j+1][k][l+1]
-ans[i][j+1][k+1][l]
-ans[i+1][j][k][l+1]
-ans[i+1][j][k+1][l]
-ans[i+1][j+1][k][l]
+ans[i+1][j][k][l]
+ans[i][j+1][k][l]
+ans[i][j][k+1][l]
+ans[i][j][k][l+1]
-ans[i][j][k][l]
+det[i][j][k][l];
}
}
}
}
while(q--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
a--; b--; c--; d--;
printf("%d\n",
ans[c+1][d+1][c+1][d+1]
-ans[a][d+1][c+1][d+1]
-ans[c+1][b][c+1][d+1]
-ans[c+1][d+1][a][d+1]
-ans[c+1][d+1][c+1][b]
+ans[a][b][c+1][d+1]
+ans[a][d+1][a][d+1]
+ans[a][d+1][c+1][b]
+ans[c+1][b][a][d+1]
+ans[c+1][b][c+1][b]
+ans[c+1][d+1][a][b]
-ans[c+1][b][a][b]
-ans[a][d+1][a][b]
-ans[a][b][c+1][b]
-ans[a][b][a][d+1]
+ans[a][b][a][b]
);
}
return 0;
}
一种更加简洁的写法。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, m, q, sum[50][50], ct[50][50][50][50];
char map[50][50];
int main()
{
cin >> n >> m >> q;
for (int i = 0; i < n; i++)
{
cin >> map[i];
}
for (int i = n - 1; i >= 0; i--)
{
for (int j = m - 1; j >= 0; j--)
{
sum[i][j] = sum[i + 1][j] + sum[i][j + 1] - sum[i + 1][j + 1] + (map[i][j] == '1');
}
}
for (int x1 = n - 1; x1 >= 0; x1--)
{
for (int x2 = x1 + 1; x2 <= n; x2++)
{
for (int y1 = m - 1; y1 >= 0; y1--)
{
for (int y2 = y1 + 1; y2 <= m; y2++)
{
int &c = ct[x1][y1][x2][y2];
c = ct[x1 + 1][y1][x2][y2]
+ ct[x1][y1 + 1][x2][y2]
+ ct[x1][y1][x2 - 1][y2]
+ ct[x1][y1][x2][y2 - 1]
- ct[x1][y1][x2 - 1][y2 - 1]
- ct[x1][y1 + 1][x2][y2 - 1]
- ct[x1][y1 + 1][x2 - 1][y2]
- ct[x1 + 1][y1][x2][y2 - 1]
- ct[x1 + 1][y1][x2 - 1][y2]
- ct[x1 + 1][y1 + 1][x2][y2]
+ ct[x1][y1 + 1][x2 - 1][y2 - 1]
+ ct[x1 + 1][y1][x2 - 1][y2 - 1]
+ ct[x1 + 1][y1 + 1][x2][y2 - 1]
+ ct[x1 + 1][y1 + 1][x2 - 1][y2]
- ct[x1 + 1][y1 + 1][x2 - 1][y2 - 1];
if (sum[x1][y1] - sum[x1][y2] - sum[x2][y1] + sum[x2][y2] == 0) c++;
}
}
}
}
while (q--)
{
int a, b, c, d;
cin >> a >> b >> c >> d;
a--; b--;
cout << ct[a][b][c][d] << endl;
}
return 0;
}
分享到:
相关推荐
Codeforces - 1107B. Digital root & 1107C. Brutality(规律 & 贪心)Codeforces - 1107B.
Codeforces 是一个知名的在线编程竞赛平台,吸引了众多程序员参与,以提升编程技能和解决算法问题的能力。"Codeforces round 678 D2" 指的是一场特定的编程比赛,其中"D2"可能代表该轮比赛的难度级别或类别,可能是...
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,...
# 基于Python的Codeforces题目集锦 ## 项目简介 本项目是一个基于Python的Codeforces题目集锦,旨在通过Python脚本来解决Codeforces平台上的各种算法和数据结构问题。项目包含了多个Python脚本,每个脚本对应一个...
《Codeforces 988 D. Points and Powers of Two》是一道融合了数学与算法的编程竞赛题目。问题的核心在于找到一个数组中的子序列,使得其中任意两个元素之间的差值都是2的幂次。目标是找到这样的子序列,其长度尽...
Watermelon: http://codeforces.com/problemset/problem/4/A 2- 71A. Way Too Long Words: http://codeforces.com/problemset/problem/71/A 3- 118A. String Task: ...
Educational Codeforces Round 157D. XOR Construction
F. Maximum White Subtree time limit per test2 seconds memory limit per test... A tree is a connected undirected graph with n−1 edges. Each vertex v of this tree has a color assigned to it (av=1 if the
codeforces每日一练。 题意: 有n张卡片,卡片上的数字就是分数,比如说甲乙两人抽卡,三局两胜,一局得分高的胜,求在甲赢了两局的情况下乙赢了第三局且总分比甲高的概率。 思路: 数据1e3,很明显的On^2算法,所以...
codeforces.dev codeforces.dev 这是应用程序的项目模板。 它位于 。 要使用基于此模板创建一个新项目: npx degit sveltejs/template svelte-app cd svelte-app 请注意,您将需要安装 开始吧 安装依赖项... ...
题意: 给出 nnn 个点,n−1n-1n−1 条边,最多询问 n2\frac{n}{2}2n 次,每次询问 u,vu,vu,v,会给出 uvuvuv的最近公共祖先,求树的根。 ...操作就是一个删除叶子节点的过程。 AC代码: const int N = 1010;...
codeforces每日一练。 题意: 给一棵树,每个点有一个点权,每条边有一个边权,求一条链使得点权和-边权和最大。 思路: 由于我没看清楚题意,以为是求联通子图的点权和-边权和最大,用link-cut-tree写换根,wa10了两...
Codeforces是一个知名的在线编程竞赛平台,它吸引了众多程序员参与,以提升编程技能和解决实际问题的能力。"Codeforces比赛用模板.zip"是一个压缩包,包含了参赛者在Codeforces平台上进行比赛时可能会用到的源码模板...
Codeforces Round #632 (Div. 2) C. Eugene and an array 题意: 求出一个数列中子区间满足 此区间的任意子区间之和 不为0的区间个数。 思路: 考虑用dp[x]dp[x]dp[x]记录前缀和为xxx的区间右端点。 那么这道题其实...
题意: 在集合 S=1,2,⋯,nS={1,2,⋯,n}S=1,2,⋯,n 中,对于每个正整数 kkk ,找出一个大小为 kkk 的子集,使得该子集中两两间最大公因数的最大值最小,求这个最小值。 我们考虑如何构造两两间最大公因数的最大值最小...
codeforces每日一练。 题意: 给定n个点,m条有向边,以及k时间。求不超过k时间1-n最多能经过多少个点。 思路: 数据<=5000,说明是个暴力dp。 那么可以用dp[i][j]维护从1到i点经过了j个点,然后初始化为inf,再设...
E. Array Shrinking time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...Choose a pair of two neighboring equal elements ai=ai+1 (if there is at least o
如果a嘲讽b,b嘲讽c,那么(a,b,c)是一个三元组 问每次操作之后一共有多少对三元组 数据范围:n,m<=1e5,q<=1e5 三元组图例(未修改工资时): 图中三元组一共4组: 4->3->1 4->3->2 4->2->1 3->2->1 解法...
【简单个人聊天室】是一个基于ASP.NET技术构建的在线交流平台,主要面向个人用户,提供了一个简易而实用的沟通环境。在这个项目中,我们将探讨ASP.NET的核心特性、Web应用程序的基本结构以及如何实现基本的实时聊天...
D. Ehab the Xorcist ...Given 2 integers u and v, find the shortest array such that bitwise-xor of its elements is u, and the sum of its elements is v. Input The only line contains 2 integers u and v