码迷,mamicode.com
首页 > 其他好文 > 详细

【CF-1358 C. Celex Update】

时间:2020-05-28 11:37:02      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:所有路径   line   update   scanf   print   lld   最大   namespace   signed   

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\n",ans+1);
    }
    return 0;
}

【CF-1358 C. Celex Update】

标签:所有路径   line   update   scanf   print   lld   最大   namespace   signed   

原文地址:https://www.cnblogs.com/valk3/p/12979459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!