垃圾如我,好不容易去了资本主义地区比赛观光。却依然脑子不灵光,抄歪模板,特判特判再特判,使得唯一有点机会的首A奖都完全没戏了。

但是回过来说,还好没爆零出局,那样就太尴尬了……

背完锅写正文(其实并不是),刚刚搜__gcd在哪个头文件里搜着搜着看到了一些有趣的技巧,在这记录一下。


负数下标

有的时候,我们会遇到数组下标需要是负数的情况。一般地,我们可以通过使用arr[i+offset]来使得实际下标为正。

如果不是很考虑效率的话,map<int, int>也是个不错的选择。

但是,这里其实有个更好的办法:就是用一个新的指针指到数组的中间去。

int main()
{
    const int MAX = 1000;
    int __arr[2*MAX + 1];

    // [-MAX, MAX]
    int *arr = __arr + MAX;

    arr[-1] = 3;
    printf("%d\n", arr[-1]);
    return 0;
}

全局long long

还有很多时候,我们为int所困、所坑,恨不得直接将所有的int变成long long

一般地,#define int long long并不能奏效,因为C++规定了main函数必须为int类型的。

其实呢,我们都知道,unsigned int是无符号32位整数,那么signed int就是带符号32位整数,而另一方面signed int其实就是个int,并且,它可以缩写成signed

那么,一个将所有int变成long long的方法就出现了。

#define int long long
signed main()
{
    int sum = 0;
    for(int i = 0; i < 1000000; i++)
    {
        sum += i;
    }
    cout << sum << endl;
}

然后再也不会因为int而溢出了(然后long long有的时候速度会慢的