关于inline的一些小坑
之前在编译多文件的时候发现编译器一直报undefined reference to 'XXX'的错误,后来发现是inline的问题。
12345// 原先.h内的部分代码class Tools {public: int fun();}
1234// 原先.cpp内的部分代码inline int fun() { ...}
把inline去掉后才能正常编译。
具体原因参考关于 inline 函数的分析:undefined reference to。
如果将函数的实现放在头文件中,那么每一个包含该头文件的cpp文件都将得到一份关于该函数的定义,链接器会报函数重定义错误。
如果将函数的实现放在头文件中,且标记为inline,那么每个包含该头文件的cpp文件都将得到一份关于该函数的定义,链接器不会报错。
如果将函数实现放在cpp文件中,并且没有标记为inline,那么该函数可以被链接到其他编译单元中。
如果将函数实现放在cpp文件中,并且标记inline,那么该函数对其他编译单元不可见,也就是其他cpp文件不能链接该函数库。
CFRound 767(Div. 2)题解
Codeforces Round #767 (Div. 2)题解
传送门:Codeforces Round #767 (Div. 2)
A. Download More RAM
题意:商店有nnn个拓展内存的软件,第iii个软件需要使用aia_iai的内存,并给手机增加bib_ibi的内存。问手机最多能获得多少内存。
思路:贪心,直接按照aaa从小到大排序,如果当前内存足够aaa就将内存+b+b+b,否则退出循环。
代码:
1234567891011121314151617181920212223242526272829303132333435#include <bits/stdc++.h>using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int n, k; cin >> n >> k; vector<int& ...
Java基础知识之泛型程序设计
本文内容参考《Java核心技术 卷Ⅰ》
定义简单泛型
12345678910111213class Pair<T> { private T first; private T second; public Pair() { first = second = null; } public Pair(T first, T second) { this.first = first; this.second = second; } public T getFirst() { return first; } public T getSecond() { return second; } public void setFirst(T first) { this.first = first; } public void setSecond(T second) { this.second = secon ...
Java基础知识之接口、lambda表达式与内部类
本文内容参考《Java核心技术 卷Ⅰ》
接口
接口的概念
接口不是类,而是对希望符合这个接口的类的一组需求。
接口中所有方法都自动是public方法,并且所有方法都绝对不会实现。接口中不会有实例字段,但可以包含常量,并且自动被设置为public static final。
为了让类实现一个接口,需要完成下面两个步骤:
将类声明为实现给定的接口(使用implements关键字)。
对接口中的所有方法提供定义。
假设希望使用Arrays类的sort方法对Employee对象数组进行排序,Employee类就必须实现Comparable接口,假设希望根据员工工资进行比较
12345678class Employee implements Comparable<Employee> { double salary; @Override public int compareTo(Employee other) { return Double.compare(salary, other.salary); }& ...
CFRound 766(Div. 2)题解
Codeforces Round #766 (Div. 2)题解
传送门:Codeforces Round #766 (Div. 2)
A. Not Shading
题意:有一个网格,每个格子要么黑色要么白色,现在有一个操作,选择一些黑色的格子,将它们所在的行或列全变成黑色。输出使得坐标(r,c)(r, c)(r,c)变成黑色的最小操作次数。
思路:直接进行暴力,如果一个黑色的点都没有,那就输出−1-1−1;如果(r,c)(r, c)(r,c)已经为黑色,输出000;如果同行或同列有黑色,输出111;否则输出222。
代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344#include <bits/stdc++.h>using namespace std;int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) ...
Java基础知识之继承
本文内容参考《Java核心技术 卷Ⅰ》
类、超类和子类
定义子类
在Java中,通常使用extends关键字表示继承。
123public class Manager extends Employee { ...}
extends表明正在构造的新类派生于一个已存在的类。已存在的类被称为超类、基类或父类;新类被称为子类、派生类或孩子类。子类会自动继承超类的字段和方法,不过子类不能直接访问或使用超类的私有字段和方法。定义子类时,只需指出子类与超类的不同之处。
覆盖方法
超类中的一些方法在子类中不适用,我们可以将该方法进行覆盖,假设超类Employee有一个方法getSalary(),我们在Manager中也写一个和超类相同方法签名的方法
12345public class Manager extends Employee { public double getSalary() { ... }}
此时我们如果使用Manager的对象使用getSalary(),调用的是子类的方法,而不是超类的方法。如果 ...
CFRound 765(Div. 2)题解
Codeforces Round #765 (Div. 2)题解
传送门:Codeforces Round #765 (Div. 2)
A. Ancient Civilization
题意:定义d(x,y)d(x, y)d(x,y)为二进制下xxx和yyy的不同位个数,现在给了nnn个数,要找到一个xxx使得∑i=1rd(x,a[i])\sum_{i=1}^{r}d(x, a[i])∑i=1rd(x,a[i])最小。
思路:通过贪心枚举每一位,假如当前这一位111的个数比000多,那么我将让xxx这一位为111,否则为000。
代码:
1234567891011121314151617181920212223242526272829#include <bits/stdc++.h>using namespace std;int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int n, m; c ...
Java基础知识之对象与类
本文内容参考《Java核心技术 卷Ⅰ》
用户自定义类
用var声明局部变量
首先是一个正常的变量声明,这是我们常用的声明方式。
123456789class Employee { int x;}public class Main { public static void main(String[] args) { Employee a = new Employee(); }}
在Java 10中,如果可以从变量的初始值推导出它们的类型,那么可以用var关键字声明局部变量,这样可以避免重复写类名。使用var时需要注意,它只能用于方法中的局部变量,参数和字段的类型必须声明。
123456789class Employee { int x;}public class Main { public static void main(String[] args) { var a = new Employee(); }} ...
数据结构之平衡树
文艺平衡树
传送门:文艺平衡树
题意:给了一个长度为nnn序列,有mmm次操作,每次操作会翻转一个区间。打印出序列经过mmm次变换后的结果。
思路:平衡树的一道模板题,splaysplaysplay最重要的是要知道它的所有旋转,都不会改变树的中序遍历结果。假如说我当前要旋转的区间是[l,r][l, r][l,r]我们可以先将l−1l - 1l−1这个节点提到根节点,再将r+1r + 1r+1这个的节点放到l−1l - 1l−1的下方,利用splaysplaysplay操作能够很方便实现,此时的树大致呈以下形状。
红色的就是我们要翻转的区间,我们只需要在红色这个子树的根节点上打上翻转标记就行。
代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 ...
数据结构专题之杂题
查找 Search
传送门:查找 Search
题意:给了一个序列,有两个操作,分别为修改序列中的某个值,以及查询区间内是否存在两个值和为www,每次查询的www都相同,并且强制在线。
思路:首先考虑没有修改操作,我们对于所有a[i]a[i]a[i],保存一个离它最近的前一个w−a[i]w - a[i]w−a[i]的位置记作pre[i]pre[i]pre[i],查询时就判断区间内最大的一个pre[i]pre[i]pre[i]是否在区间内。如果有修改操作,我们还用刚刚这种方法,修改掉一个值可能要修改后面所有的preprepre,这样可能会超时。我们考虑下面这种情况,
当我们有一个为蓝色的查询区间的时候,我们会发现后面的xxx其实是没有用的,因为包含着一个更小的区间(红色)有xxx,也就是说我们对于一个a[i]a[i]a[i]来说,最多会有一个来自后面的w−a[i]w - a[i]w−a[i]。那么我们可以利用setsetset对每一个值存它的下标进行处理,再利用线段树维护preprepre的最大值。本题的细节比较多。
代码:
123456789101112131415161718192 ...