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

编程入门 行业动态 更新时间:2024-10-12 20:20:28

一些乱七八糟的思路和<a href=https://www.elefans.com/category/jswz/34/1770552.html style=语法的汇总"/>

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

上周在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)

有一个东西叫做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)

如果我反过来思考,

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

更多推荐

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

本文发布于:2024-02-06 19:13:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1751363.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:语法   思路

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!