关于1ll(1LL)的用法

今天看代码时发现一句 ans += yes[i] * 1LL * (yes[i] - 1) / 2; 其中用了1LL。LL其实代表long long, * 1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量。代码中有这一行,long long ans = 0;
ans是long long类型的,ans += yes[i] * 1LL * (yes[i] - 1) / 2;
不至于后面计算溢出,* 1LL之后类型就转换为long long, yes内容是定义为int类型的。

在进行类型转换的时候,在其他类型的数字后面乘以一个1LL,就可以避免强制转换时候的精度问题。

举个例子:
Distance
链接:https://ac.nowcoder.com/acm/problem/14268
来源:牛客网

FST作为小朋友,经常会遇到和距离有关的问题,但是他已经厌倦了曼哈顿距离和欧几里德距离,所以FST就定义了一种FST距离。
这种距离并不用于空间或平面中,而运用于FST发明的一些神奇的算法中(唔… …)。
设i号元素的特征值为Ai,则i和j的FST距离是 |i2 - j2|+|Ai2 - Aj2|。
为了实现某新的数据结构,FST想在一大堆元素中找出距离最大的一对元素,他不关心是哪一对元素,只想求出最大距离。

牛客上的一道题,思路很好想,就是分成四种情况,将绝对值打开之后发现只有两种情况,讨论一下即可。这道题不是重点,重点是我WA了一发还完全不知道是因为什么。后来突然想到可能是存在精度问题,在式子中唯一一个不是ll类型的变量后面乘以一个1LL,他就A了,就是这么神奇,不相信的你可以把1LL删掉去试试。

#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
const double N = 1e6+10;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const inline int read(){
    int k = 0, f = 1; char c = getchar();
    for(;!isdigit(c); c = getchar())
        if(c == '-') f = -1;
    for(;isdigit(c); c = getchar())
        k = k * 10 + c - '0';
    return k * f;
}
#define ll long long
#define CL(a,b) memset(a,b,sizeof(a))
#define MAXN 100010
long long int a[MAXN];
long long int b[MAXN];
long long int c[MAXN];
int main()
{
    int t;
    cin >> t;
    for(int i = 1 ; i <= t ; i++)
    {
    	scanf("%lld",&a[i]);
	}
	for(int i = 1 ; i <= t ; i++)
	{
		b[i] = 1LL*i*i+a[i]*a[i];
		c[i] = a[i]*a[i]-1LL*i*i;
	}
	sort(b+1,b+1+t);
	sort(c+1,c+1+t);
	long long int res = abs(b[t]-b[1]);
	if(res < abs(c[t]-c[1]))
		res = abs(c[t]-c[1]);
	printf("%lld\n",res);
	return 0;
}

  • 14
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值