HDU 5116 Everlasting L
题目链接:HDU-5116
题意:给定若干个整数点,若一个点集满足P = {(x, y), (x + 1, y), . . . , (x + a, y), (x, y + 1), . . . , (x, y + b)}(a, b ≥ 1) 且 gcd(a, b)==1 则称这是一个好(a, b)-L集。求共有多少个(A, B)满足A,B都是好L集且A,B不相交。
思路是先找出好L集的数量a,再找出相交的好L集对数b,则答案为a * a - b 。
首先要解决的第一个问题是求出a,一个自然的思路是对于每个点,分别向右、向下搜索,但是这样做会超时。所以我们需要优化一下。
首先算出每个点向右、向下最远长度,记为rght[i][j]和down[i][j]。然后对于每个点,在向右搜索时,对于当前搜索到的长度L,我们希望能知道有多少向下的长度D可以与之组成一个好L-集。所以优化的思路就是处理出在[ 1, down[i][j] ]范围内,有多少数与L互质。我们用f[i][j]表示在[0, j]范围内有多少数与i的gcd等于1。
这样我们就解决了第一个问题。
对于第二个问题,我们处理出,对于每一个点(i, j),有多少好L-集的下路经过点(i, j),用sum[i][j]表示,那么假设存在x个右路经过点(i, j)的好L-集,则 b += 2 * x * sum[i][j]。
具体请参照代码:
//f[i][j]表示在[1,j]范围内,有多少数与i的gcd=1。
//g[i][j]表示在sum(gcd(a,b)==1) (1<=a<=i && 1<=b<=j)
//rght[i][j]表示点(i, j)右路最长长度
//down[i][j]表示点(i, j)下路最长长度
//sum[i][j]表示下路通过(i, j)的好L-集的个数 #include<cstdio>
#include<set>
#include<map>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
typedef long long LL; const LL MAXN=; LL gcd(LL a,LL b)
{
if(b==) return a;
return gcd(b,a%b);
}
bool vis[MAXN][MAXN];
LL g[MAXN][MAXN],f[MAXN][MAXN],down[MAXN][MAXN],rght[MAXN][MAXN],sum[MAXN][MAXN];
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
memset(g,,sizeof(g));
memset(f,,sizeof(f));
for(LL i=;i<=;i++)
for(LL j=;j<=;j++)
{
f[i][j]=f[i][j-]+(gcd(i,j)==);
g[i][j]=g[i-][j]+f[i][j];
}
LL T;
scanf("%lld",&T);
for(LL tt=;tt<=T;tt++)
{
memset(down,,sizeof(down));
memset(rght,,sizeof(rght));
memset(vis,,sizeof(vis));
memset(sum,,sizeof(sum));
LL n;
scanf("%lld",&n);
for(LL i=;i<=n;i++)
{
LL x,y;
scanf("%lld%lld",&x,&y);
vis[x][y]=;
}
for(LL i=;i>=;i--)
for(LL j=;j>=;j--)
if(vis[i][j])
{
if(vis[i+][j]) down[i][j]=down[i+][j]+;
if(vis[i][j+]) rght[i][j]=rght[i][j+]+;
}
LL a=;
memset(sum,,sizeof(sum));
for(LL i=;i<=;i++)
for(LL j=;j<=;j++)
if(vis[i][j])
{
LL cnt[MAXN];
memset(cnt,,sizeof(cnt));
for(LL k=;k<=down[i][j];k++)
cnt[k]+=f[k][rght[i][j]];
for(LL k=down[i][j]-;k>=;k--)
cnt[k]+=cnt[k+];
for(LL k=;k<=down[i][j];k++)
sum[i+k][j]+=cnt[k];
a+=cnt[];
}
LL b=;
for(LL i=;i<=;i++)
for(LL j=;j<=;j++)
if(vis[i][j])
{
LL cnt=;
for(LL k=rght[i][j];k>=;k--)
{
cnt+=f[k][down[i][j]];
b+=*cnt*sum[i][j+k];
}
b-=g[down[i][j]][rght[i][j]]*g[down[i][j]][rght[i][j]];
}
printf("Case #%lld: %lld\n",tt,a*a-b);
}
return ;
}
HDU 5116 Everlasting L的更多相关文章
- 动态规划(DP计数):HDU 5116 Everlasting L
Matt loves letter L.A point set P is (a, b)-L if and only if there exists x, y satisfying:P = {(x, y ...
- hdu 4630 查询[L,R]区间内任意两个数的最大公约数
No Pain No Game Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)
6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...
- HDU 6437 Problem L.Videos (最大费用)【费用流】
<题目链接> 题目大意: 一天有N个小时,有m个节目(每种节目都有类型),有k个人,连续看相同类型的节目会扣w快乐值.每一种节目有都一个播放区间[l,r].每个人同一时间只能看一个节目,看 ...
- HDU 6343 - Problem L. Graph Theory Homework - [(伪装成图论题的)简单数学题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- hdu 5116 计数
题目大意:给你n个点, n个点的坐标都在200以内,让你统计不相交的两个L形的种数,且L形的两条边长的gcd = 1. 思路:用二维树状数组维护点的信息,然后划分区块进行统计,题解是用总的减去相交的, ...
- HDU 6330.Problem L. Visual Cube-模拟到上天-输出立方体 (2018 Multi-University Training Contest 3 1012)
6330.Problem L. Visual Cube 这个题就是输出立方体.当时写完怎么都不过,后来输出b<c的情况,发现这里写挫了,判断失误.加了点东西就过了,mdzz... 代码: //1 ...
- HDU - 6437 Problem L.Videos 2018 Multi-University Training Contest 10 (最小费用最大流)
题意:M个影片,其属性有开始时间S,结束时间T,类型op和权值val.有K个人,每个人可以看若干个时间不相交的影片,其获得的收益是这个影片的权值val,但如果观看的影片相邻为相同的属性,那么收益要减少 ...
- 2014ACM/ICPC亚洲区北京站题解
本题解不包括个人觉得太水的题(J题本人偷懒没做). 个人觉得这场其实HDU-5116要比HDU-5118难,不过赛场情况似乎不是这样.怀疑是因为老司机带错了路. 这套题,个人感觉动态规划和数论是两个主 ...
随机推荐
- hdu 1150 Machine Schedule (二分匹配)
Machine Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- bzoj 3275: Number (最小割)
题目的意思是要选一些数,但是这些数如果满足两个条件的话就不能一起被选. type arr=record toward,next,cap:longint; end; const maxn=; maxm= ...
- BZOJ2038:[2009国家集训队]小Z的袜子——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找 ...
- 关于web.xml中的<welcome-file-list>中的默认首页资料
关于web.xml中的<welcome-file-list>中的默认首页文件 先看我的配置文件: <welcome-file-list> <welcome-file> ...
- [10.12模拟赛] 老大 (二分/树的直径/树形dp)
[10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...
- Android 解决adb server is out of date. killing... ADB server didn't ACK * failed to star
The connection to adb is down, and a severe error has occured. [-- :: - HelloOPone] You must restart ...
- Naive Operations HDU多校(线段树上线段果)
Problem Description In a galaxy far, far away, there are two integer sequence a and b of length n.b ...
- gps各种地图坐标系转换
原文地址:https://my.oschina.net/fankun2013/blog/338100 地图供应商比较多,产生了许多地图坐标.地图坐标正确转换是个问题.在之前开发地图应用的时候发现从WG ...
- [Leetcode] LRU 算法实现
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- sun.security.x509.CertAndKeyGen;找不到
导入已有项目编译时出错,报: import sun.security.x509.CertAndKeyGen;找不到 而这个包属于sun公司的jar包.不是项目本身的问题,而是开发环境的问题. 最后原因 ...