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 round 678 D2_Codeforces_源码
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: ...
codeforces每日一题。 题意: 给出一个数组,让你挑选出能组成任意pair差值为2的幂的序列,并且使这个序列长度尽可能大。 思路: 针对于挑选出来的序列,任意pair对的差值为2的幂数。 假设有多个pair对,设dis(a,b)=2...
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
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
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 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,再设...
如果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 解法...
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
一个简单的基于ASP.net的个人聊天室网页。
Codeforces Guide.zip
Codeforces - 1131C. Birthday(贪心)题目链接题目给你n和n个数,要你重新排列n个数,使得这些数的相邻差值中最大的那个值最小。stat
Codeforces Round #723 (Div. 2).md