语法的汇总"/>
一些乱七八糟的思路和语法的汇总
上周在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
更多推荐
一些乱七八糟的思路和语法的汇总
发布评论