CF-1358 C. Celex Update
Posted valk3
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF-1358 C. Celex Update相关的知识,希望对你有一定的参考价值。
C. Celex Update
题意
有一个无限大的表格,按照某个方式填上数字。给出T个询问,每个询问
给出两个坐标((x1,y1),(x2,y2)),只能向下或者向右移动,问从第一个点移动
到第二个点,有多少种不同的路径和。
题解
直接猜的是,所有路径和都不相同。
写组合公式的时候,突然想到这个答案 有点大啊,题目也没有说取模。
脑子瓦特了,竟然写了交了,GG。
肯定会有重复的。
比如((1,1)->(3,3))
1 2 5 9 13
1 3 5 8 13
这两条路径就是一样的,因为向下走比向右走会多1。
这样就可以抵消影响,使得和一样。
这时就大胆的猜,路径和最小值和路径和最大值之间是不是都可以取到。
在上一路径某个向右走的地方选择向下走,就可以使得路径和增加1。
所以都可以取到,答案就是最大值和最小值的差+1。
把两条路径的值的差依次写出来,1 2 3 4 ... x2-x1 x2-x1...4 3 2 1
数字总个数是x2-x1+y2-y1+1
求和(就是((x2-x1)*(y2-y1)))
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int x=x2-x1,y=y2-y1;
int n=x,m=x+y-1;
ll ans=1LL*(n+1)*n;
ans+=1LL*(m-2*n)*n;
printf("%lld
",ans+1);
}
return 0;
}
以上是关于CF-1358 C. Celex Update的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #645 (Div. 2) C - Celex Update 思维
Codeforces Round #645 (Div. 2) C - Celex Update 思维
markdown Robert C. Martin的“清洁代码”摘要