UVA 12508 - Triangles in the Grid(计数问题)

2024-06-01 20:32

本文主要是介绍UVA 12508 - Triangles in the Grid(计数问题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

12508 - Triangles in the Grid

题目链接

题意:给定一个nm格子的矩阵,然后给定A,B,问能找到几个面积在A到B之间的三角形。

思路:枚举每一个子矩阵,然后求[0,A]的个数减去[0,B]的个数就是答案,然后对于每个子矩阵个数很好求为(nr+1)(mc+1)。关键在于怎么求每个子矩阵的符合个数。

想了好久,参考别人题解才想出来,分3种情况讨论:
1、一个点在矩形顶点,另外两点对应在顶点的另外两边上。
2、两个点在顶点上,另外一点在对边上。
3、三个点都在顶点上
然后分别去计算求和,具体的过程比较麻烦,在纸上多画画一边就能得到一个o(N)的方法,大概是枚举一个在竖直边上的位置,横的位置利用公式运算一步求解,这样时间复杂度是可以接受的

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;int t;
long long n, m, a, b;long long solve(long long limit) {long long ans = 0;for (long long r = 1; r <= n; r++) {for (long long c = 1; c <= m; c++) {long long count = 0;long long up, down;if (r * c <= limit) count += 2 * (r - 1 + c - 1);for (long long x = 0; x <= r; x++) {up = min(c, (x * c + limit) / r);long long tmp = x * c - limit;if (tmp <= 0) down = 0;else down = (tmp - 1) / r + 1;if (down <= up) count += 2 * (up - down + 1);}for (long long x = 1; x < r; x++) {long long s = (r * c - x);if (s <= limit) count += 4 * (c - 1);else count += 4 * ((c - 1) - min((s - limit) / x + ((s - limit) % x != 0), c - 1));}ans += count * (n - r + 1) * (m - c + 1);}}return ans;
}int main() {scanf("%d", &t);while (t--) {scanf("%lld%lld%lld%lld", &n, &m, &a, &b);a <<= 1; b <<= 1; if (a == 0) a = 1;printf("%lld\n", solve(b) - solve(a - 1));}return 0;
}

这篇关于UVA 12508 - Triangles in the Grid(计数问题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022040

相关文章

UVA - 12206 Stammering Aliens (hash)

这题其实很容易想到2分长度,关键是2分后,怎么判断出现最多次的串是否》=m次了。这里需要用到hash来处理。 对于一个字符串   H[i] =H[i+1]*131+s[i]  ;其中 H[n]=0;那么对于一个长度为L的串 ,hanh[i,l]=H[i]-H[i+L]*x^L ; 这样记录每个字符串的hash值,然后再处理起来就比较简单了。 VIEW CODE #include<

「R绘图」grid学习笔记之grid.layout

grid.layout用于在一个视图上创建多个图层。大部分参数都很好理解,例如nrow和ncol就是声明行和列各有多少个图层。widths和heigths则是声明行高和列宽。比较难以理解的是参数,respect的参数说明是 If a logical, this indicates whether row heights and column widths should respect each

css grid实现九宫格布局

常见的九宫格布局可以使用flex布局实现,但是flex布局有个致命的缺陷,比如3行3列的布局,当第不足3个元素的时候,元素依然是平局平铺的,这样就不满足九宫格的效果,这种情况,使用grid布局可以轻松搞定这个问题            html布局 <div class="layout"><div class="item">1</div><div class="item">2</

[Uva 11990] Dynamic Inversion (CDQ分治入门)

Uva - 11990 动态逆序对,求删除一个点之前序列中逆序对的个数 首先倒过来看这个问题,把点先全部删掉 然后从最后一个点开始倒着往数列中加点 求加完这个点逆序对的变化 CDQ分治做法 把删除时间看作 t,下标看作 x,值看作 y 然后对 x排序,对 t偏序,用树状数组维护 y 具体来说就是对于每个点 (t0,x0,y0) (t_0, x_0, y_0) 先统计

数位统计DP——AcWing 338. 计数问题

数位统计DP 定义 数位DP(Digital DP)是一种用于解决与数字的数位相关问题的动态规划算法。它将数字的每一位看作一个状态,通过转移状态来计算满足特定条件的数字个数或其他相关统计信息。 运用情况 统计满足特定条件的数字个数,例如在给定范围内有多少个数字满足某些数位特征。计算数字的某个数位上的特定统计信息,如出现的数字频率等。解决与数字排列、组合相关的问题。 注意事项 数位DP的

UVA 11624 搜索

给出1000*1000矩阵,含起点‘J’,路‘.',墙‘#’,火‘F'; 火每秒蔓延一格,人每秒走一步 问人是否可以安全走出矩阵,不能被火碰到 先对所有火BFS一遍,记录每个点被烧到的时间 然后对人BFS一遍,若到每点前没被火烧即可走 #include "stdio.h"#include "string.h"#include "queue"using namespace

UVa 11361 Investigating Div-Sum Property

这道题居然提交了十次才过....期间小问题不断。思路的话基本是《训练指南》里面来的,不过有几个小问题需要注意一下。第一,当K在大于100的情况下,就直接输出0就可以了。因为a,b不超过2^31,可以估算出a,b最多十位十进制数,那么每位最大为9,所以各个数字之和是不可能超过100的,那么个数字之和为模K为0的条件是永远不可能到达的。       还有一点是,当剩余数字d=0时,当且

UVa 1362(LA 3516) Exploring Pyramids

依旧是《训练指南》上的一道例题。思路大致相同,即设有一个序列S(i),S(i+1),S(i+2)...S(j),d[i,j]为所求的解。当S(i)==S(k),i<k<=j 时,说明在k回到根,那么S(i+1)...S(k-1)构成一棵独立的子树(当然也可能并不是子树)。那么d[i,j]就要加上d[i+1,k-1]*d[k,j],不断递增k,每遇到一个k,d[i,j]+=d[i

UVa 11174 Stand in a Line

依旧是《训练指南》上的一道例题。书上讲的比较抽象,下面就把解法具体一下。因为涉及到父子关系,因此自然而然可以将n个节点构造成一棵树,最后将形成一个森林。接下来将使用递归的手法。设f(i)是以节点i为树根的子树,节点i有儿子c1,c2,c3....cj共j棵子树。s[i]为树根为i的子树包含的节点数。如果分别先给各个子树内部排序,那么毫无疑问, 共有f(c1)*f(c2)*f(c3).

UVa 11375 Matches

大年夜的写代码果然状态非常之差...感觉特别困,连个高精度都折腾了我好久。还是刘汝佳《训练指南》里的一道例题,解题思路其实也差不多,但是想对书里面的内容再讲讲。其中d[i]是代表i个火柴棒恰好能构成的正整数数目(不包含整数0),然后有点类似于动态规划的做法,通过已知的d[]求出剩下的d[]。        不过仔细想来貌似有点问题。例如已知d[j],那么d[j+num[0]]+=d[