C++模板
说明这些是我平时攒下来的模板,现在送给大家! 火车头1234567891011121314151617181920212223242526272829303132333435363738394041424344#include <algorithm>#include <bitset>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <deque>#include <map>#include <iostream>#include <queue>#include <set>#include <stack>#include <vector>#include <array>#include <unordered_map>#include <numeric&g...
程C指针学习笔记
单纯的指针最简单的指针带*的:野指针(确信) 1int *p; //一只快乐的野指针,未初始化的指针,指向随机地址(野指针) 这个表示定义了指针,不过注意,前面的类型是要自己设定的,不能乱写但是提到指针,就不得不提到&(取地址符)了 &的用法:&表示取地址符,比如这样: 12int a=1;cout<<&a<<endl;//输出a的地址 这一句表示输出a变量对应的地址位置,详细见书上的解释,获取地址的开头方便输出 然后指针所能存储的恰好是地址,所以可以这么写:1int *p=&a; 表示p指向a对应的地址 指针的初始化可以把指针设定为NULL,这里表示p不指向任何一个地址要是没有初始化,p可能指向任何一个位置,可能导致代码错误,所以被称作野指针 1234567int *p = NULL; // 未初始化指针(野指针)*p = 10; // 段错误// 解引用前应检查if(p != NULL) { *p = 10;} 指针的多种含义在实际程序中,*p,可能有多种含义: 表示p...
C++几何计算(保姆级教程)
版权说明此文章的所有代码均由qinye_leaf 勤叶大佬收集整理,感谢喵Orz Orz Orz 初始化由于双精度和单精度存在精度问题,所以补能直接判断是否为0或者相等,那么怎么办呢?我们可以取绝对值,然后和一个非常小的数字比较 代码示例:12// 浮点数精度阈值(根据题目要求调整,通常1e-8)const double EPS = 1e-8; 符号函数判断正负号的函数,但是是浮点数数版本的 12345// 符号函数:判断浮点数正负int sgn(double x) { if (fabs(x) < EPS) return 0; return x > 0 ? 1 : -1;} 构造函数介绍解释一下构造函数的用法,这里可以直接赋初始值,方便初始化 1234Point(double x_ = 0, double y_ = 0) : x(x_), y(y_) {}//那么我们可以这么来定义一个变量Point p1(2.0,3.0);Point p2; 如果不传参数,那么就是直接得到初始值0,0,要是有值的化就是直接赋值,这样...
DP习题笔记
循环的遍历 注意一下最内层的循环是什么,他决定了这一步的决策是什么。 例题纸币问题 2 这一题要我们求完全背包的方案数(考虑顺序) 那么内层循环应该放的是面额的遍历,因为最后一步的面额是不一定的。 正确写法✔: 1234for(int i=1;i<=w;i++) for(int j=1;j<=n;j++) if(i>=a[j]) dp[i]=(dp[i-a[j]]+dp[i])%mod; 错误写法❌: 123456for(int i=1;i<=n;i++){ ll x; cin>>x; for(int j=x;j<=w;j++){ dp[j]=(dp[j-x]+dp[j])%mod; }} 为什么下面那个是错误的? 因为把当前面额作为内层循环,相当于固定了最后一步只能是这个面额,没法考虑到顺序问题。这样的话第二次只能在第一次的基础上增加。实际上,第一次的面额也可以在第二次的基础上增加。因此这个做法是不正确的。注意:下面那个方法因为只考...
我这学期犯过的唐
不知道vector的size是size_t类型 因为是size_t所以直接加减会出错,比如减成负数的时候。 内层循环变量写错 这个会导致外层循环少了几次 sort里面的数据范围没开正确 例如要对’n*m’的数据排序,却只写了n 不看清读入顺序 看清读入的是有序的还是乱序的,不要被样例蒙蔽了双眼 位运算不写ll 区分以下代码的区别: 12(1<<i) //得到int(1ll<<i) //得到ll
构造操作类题目
定义 构造一些操作,使得数据满足操作要求,通常还会有次数限制 方法此类题目现在遇到过三种做法: 一种是直接操作,不关心部分值,直接对全局操作,使得再让全局满足要求的同时,使得部分也满足要求 另一种是进行操作,最后只改变一个量,每次用多步做一步(和魔方有点像?) 例题1.B. Siga ta Kymata 题目描述:给你一个排列 $^{\text{∗}}$ 。从 $1$ 到 $n$ 的每个整数的排列 $p$ 。您还拥有一个大小为 $n$ 的二进制 $^{\text{†}}$ 字符串 $s$ ,其中 $s_i = \mathtt{0}$ 代表所有 $1 \le i \le n$ 。您最多可以执行以下操作 $5$ 次:选择任意两个整数 $l$ 和 $r$ ,使得 $1 \le l \le r \le n$ .然后,对于每一个 $i$ 使得 $l< i< q$ 和 $\min(p_l, p_r) < p_i < \max(p_l, p_r)$ 同时成立,你将把 $s_i$设为 $\mathtt{1}$ 。您还会得到一个大小为 $n$ 的二进制字符串 $x$...
程C笔记2
递归函数的定义注意一下在命名函时,可以不写参数的名称,比如:1void fun(int,int) 结构体排序12345678910111213void mySwap(Data *p1,Data *p2){//交换函数 Data t=*p1; *p1=*p2; *p2=t;}for(int i=0;i<n-1;i++){ for(int j=0;j<n-i-1;j++){ if(a[j].num>a[j+1].num || (a[j].num==a[j+1].num && a[j].value>a[j+1].value)){ mySwap(&a[j],&a[j+1]); } }} 传入时注意,要加上&,传入地址,使得函数可以交换地址。 数组的定义 使用new和delete一起运算。 基本方法1234// 创建一维动态数组数据类型* 指针名 = n...
不定积分习题
第一类有理积分主要方法 放入分子 放入分子的部分 放入分母 放入分母的部分 特殊构造|—商的导数求积分部分|—两个函数相乘求导$e^x$|—三角函数构造$\tan x$ 最后复习一下一些特殊的积分公式放入分子 这一中方法比较基础。 如果是放入分子的,那么必然是如下形式的\int \frac{f'(x)}{f(x)}\,dx 这样就能得到\int \frac{df(x)}{f(x)} 所以先看一下分母求导的结果有没有可能等于分子,如果是,那么就可以用这种方法 例题\int \frac{\sin x+\cos x}{\sqrt[3]{\sin x-\cos x}}\,dx放入分子的部分 这个通常出现在三角函数中,因为这样可以把所有三角函数化程同名。 然后放入时注意一下和分子的形式要对上。例题\int \frac{\sin x\cos x^3}{1+\cos x^2}\,dx 这题直接放入$\sin x$还不行,因为要注意一下分母的形式。所以注意到可以凑出$\sin 2x$,这样放入时形式就一样了 放入分母 放入分母的实际上是这种形式$\int f’(x)f(x)\,dx$ 然后被...
几何计算习题笔记
凹凸多边形的判断重要知识:叉积几何意义:符号代表了叉积两个向量的转向: > 0 逆时针 < 0 顺时针 = 0 共线 基本原理对于连续三个点A、B、C:叉积 = (B.x - A.x) (C.y - B.y) - (B.y - A.y) (C.x - B.x)要是是向量的话是:a.x b.y- a.y b.x 这个叉积实际上计算的是向量 AB 到向量 BC 的旋转方向。 实现方法可视化解释考虑四边形$ABCD$,我们按顺序(如逆时针)检查每个顶点: 如果所有顶点的叉积都保持同号(全部为正或全部为负),说明多边形所有顶点都朝同一个方向”拐弯”,这就是凸多边形。 1234C(2,2) ────── D(0,2)│ ││ │B(2,0) ────── A(0,0) 在顶点A处: 向量DA = A - D = (0-0, 0-2) = (0, -2) 向量AB = B - A = (2-0, 0-0) = (2, 0) DA × AB = 0 0 - (-2) 2 = 4 > 0(逆时针) 在顶点B处: 向量A...
程C笔记
1. 头文件和命名空间C++ 中的 string 类定义在头文件 string 中,通常使用 std 命名空间。 123456s3=strcat(s1,s2);//加在后面int x=strcmp(s1,s2)//返回三种情况,见下面cout<<strlen(s1)<<endl;//输出的是长度,等同于s1.length()strcpy(s1+x1,s2+x2);//把前面的对应部分添加到前面去,完全覆盖之前的内容memcpy(a+x1,b+x2,sizeof(int)*8);//也是把后面的放到前面,只不过需要规定放入的内容sizeof(s1);//考虑后面的'\0',比strlen大1. x=strcmp(s1,s2)= \begin{cases} -1 \ \ \ \ \ s1 \leq s2\\ 0\ \ \ \ s1=s2\\ 1\ \ \ \ s1 \geq s2 \end{cases}memcpy例子:12345int a[8]={1,2,3,4,5,6,7,8};int b[10]={...