一些乱七八糟的思路和语法的汇总

文章介绍了C++中的几个高效函数和编程技巧,如iota用于快速初始化数组,hypot用于计算几何中的斜边长度,正确使用swap交换数组元素时的注意事项,以及unique和erase结合进行数组去重的方法。此外,文章还提到了basic_string的使用,它允许直接添加不同类型的数值到string中,并提供了一种反向思考问题的解决策略。

上周在atc的题解里看到一个很高端的函数,

vector<int> p(n);
iota(p.begin, p.end(), 0);

iota,注意是ot不是to

他可以做一个什么样的事情呢,可以从begin开始,从0开始依次递增赋值一个数组,也就是说这个函数执行完之后,p数组会变成0, 1, 2, 3,4, ... n - 1

这样一个是不用写一个for循环,还有一个是

很帅。

还一个在计算几何里学到的函数,hypot(x, y)

他等于sqrt(x*x+y*y)

就是说可以快速的用勾股定理计算斜边

使用swap函数的时候需要注意的一些事情:

比如abc150 c

我如果用两个数组,一个数组记录值,一个数组记录每个值的pos

那么我用swap函数交换a的时候,

需要注意的是,

要反过来赋值,这个很容易会没想到

什么叫做反过来赋值呢

比如a[i]的位置p = pos[a[i]];

然后我swap(a[i], a[i + 1]);

那么pos[a[i]] = p, pos[a[i + 1]] = p + 1;

我第一次写的时候,想着交换位置,所以就把a[i] 的位置变成p + 1, a[i + 1]的位置变成p;

但实际上这样才是反了的

因为a[i]和a[i+1]已经交换了,对pos数组来说, a[i + 1]才是之前的a[i], 而a[i]才是之前的a[i+1]

还有一个我已经见到好几次的数组去重的方法

unique和erase结合来实现数组去重

a.erase(unique(a.begin(), a.end()), a.end());

unique函数返回的是去重后的数组的下一位,然后一直到a.end()被erase掉,就同时实现了去重和删除,

不过需要注意的是

这样之后的数据好像只是被滚动到了后面,并没有在内存中被删掉,也就是说,你用a[i]依然是可以访问到已经被删除的数

but这个时候a.size()已经是被改变了的,他变成了去重之后的长度

所以用这个方法去重之后,要注意写for循环的时候要写i < a.size(),而不是i < n

参见fjut洛谷手速赛第四场d题

Filya and Homework - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

有一个东西叫做basic_string,

正常的string,他往后相加,只能加一个字符或者字符串

但是如果用这个,就可以直接往后添加各种类型的数

比如说,我要往一个string后面添加100,但是这个100是一个int类型

那我如果用string的话,

可能要先把这个100转换成一个字符串,然后再加上去

但是如果是basic_string

s = s + basic_string<int>{100};

就加上了

非常的神奇

想要体验basic_string 的神奇,参见abc247 c

这是我用这个写法的代码

#include <bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define endl "\n"
#define PII pair<int,int>
#define fs first
#define sc second
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define YES {cout<<"YES"<<endl;return;}
#define NO {cout<<"NO"<<endl;return;}
using ull = unsigned long long;
using namespace std;
// head
basic_string<int> s;
void solve() {
    int n;
    cin >> n;
    s = {1};
    for (int i = 2; i <= n; i++) {
        s = s + basic_string<int>{i} + s;
    }
    for (auto x : s) cout << x << ' ';
    cout << endl;
    
}

signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int tt = 1;
    // cin >> tt;
    while (tt--) { solve(); }
    return 0;
}

还有就是我学会了一个思路,在碰见把一个数a通过某些操作变成一个数b的题目的时候

通常是考虑反过来操作,把b变成a,很多限制条件会没掉

参见fjut洛谷手速赛第四场c

Transformation: from A to B - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

如果我反过来思考,

那么如果遇到尾数为1的时候,必定执行的是操作1,尾数为偶数的时候,必定执行的是x2,如果不是1又不是偶数,那么直接就完成不了,输出no

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值