定理与方法专区:
1.两点间的曼哈顿距离如果为偶数,那么两点间可以走偶数步到达
2.求小于等于n 的素数的个数。(即欧拉函数)
100=(2^2)*(5^2) num[100]=(2+1)*(2+1)=9;
10=2*5 num[10]=(1+1)*(1+1)=4;
48=(2^4)*(3^1) num[48]=(4+1)*(1+1)=10;
3.以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其中,dxdy分别为线段横向占的点数和纵向占的点数。如果dx或dy为0,则覆盖的点数为dy或dx。
4.Pick公式:平面上以格子点为顶点的简单多边形,如果边上的点数为on,内部的点数为in,则它的面积为A=on/2+in-1。
5.任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和/2(黑书上有说明)
6.定理:下降子序列个数等于最长不下降子序列的长度
7.假如把树枝分成黑白二色。黑色树枝最多的生成树的黑色树枝为x个,黑色树枝最少的生成树的黑色树枝为y个,那么x~y范围内的有黑色树枝的个数的生成树都存在。
struct node
{
int u;
int v;
bool friend operator < (const node a, const node b)
{
if(a.u!=b.u)return a.u<b.u;//从小到大
else return a.v<b.v;
}
}edge[100];
sort(edge,edge+n);
3. stl的应用
1.queue(队列)
push(x) 将x压入队列的末端
pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值
front() 返回第一个元素(队顶元素)
back() 返回最后被压入的元素(队尾元素)
empty() 当队列为空时,返回true
size() 返回队列的长度
2. priority_queue(优先队列)
empty() 如果队列为空返回真
pop() 删除对顶元素
push() 加入一个元素
size() 返回优先队列中拥有的元素个数
top() 返回优先队列对顶元素
priority_queue<int>q;//通过操作,按照元素从大到小的顺序出队
struct cmp1
{
bool operator ()(int &a,int &b){
return a>b;//最小值优先
}
};
struct cmp2{
bool operator ()(int &a,int &b){
return a<b;//最大值优先
}
};
//自定义数据结构
struct number1{
int x;
bool operator < (const number1 &a) const {
return x>a.x;//最小值优先
}
};
struct number2{
int x;
bool operator < (const number2 &a) const {
return x<a.x;//最大值优先
}
};
int main()
{
priority_queue<int>que;//采用默认优先级构造队列
priority_queue<int,vector<int>,cmp1>que1;//最小值优先
priority_queue<int,vector<int>,cmp2>que2;//最大值优先
priority_queue<int,vector<int>,greater<int> >que3;//最小值优先注意“>>”
priority_queue<int,vector<int>,less<int> >que4;////最大值优先
priority_queue<number1>que5; //最小优先级队列
priority_queue<number2>que6; //最大优先级队列
}
3. 栈(stack)
push(x) 将x加入栈中,即入栈操作
pop() 出栈操作(删除栈顶),只是出栈,没有返回值
top() 返回第一个元素(栈顶元素)
size() 返回栈中的元素个数
empty() 当栈为空时,返回 true
4. 映射(map)
st.clear(); //将st置零
st.empty(); //判断st是否为空
st.erase() //删除用,可以删除关键字,或者成片删除
//比如st.erase(1); 删除关键字为1的,成功返回1,否则为0;
//比如st.erase(st.begin(),st.end());删除了整个st,删除的是前闭后 开的区间;
st.find(); //用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现 时,
//它返回数据所在位置的迭代器,如果map中没有要查找的数据,它 返回的迭代器等于
//end函数返回的迭代器,比如st.find(1);就是可以查找st->firs为1的那个元素;
st.begin(); //第一个元素的位置的迭代器
st.end(); //最后一个元素后面的位置的迭代器,实际上不存在
st.rbegin(),st.rend() //最后一个元素的迭代器,和第一个元素前面的迭代器(不存 在),可以反向访问
st.size(); //返回已经插入了多少数据
st.insert(); //插入数据,st.insert(map<int,string>::value_type(1,"student_one"));
注意事项:
- 注意特殊情况。
- G++输出double用f%。
- 一定要考虑0啊。
- 定义变量的时候注意定义的是全局还是局部。
- 回溯时,一定要看好是否完全回溯了。
- 注意visit数组的标记。
- Short int 数组可以存到5001*5001。
- 注意使用long long。
- 注意变量的初始化。
- 结果是否需要mod一个数。
- 求最大值的时候,看是否存在负数的情况。
oj中G++和C++的区别:
1、输出double类型时,如果采用G++提交,scanf采用%lf,prinf采用%f,否则会报错 2、使用GCC/G++的提醒: 对于64位整数, long long int 和 __int64 都是支持并且等价的.但是在读和写的时候只支持scanf("% I64d", ...)和printf("%I64d", ...). 不支持"%lld"是因为MinGW下的GCC和G++使用的msvcrt.dll动态链接库并不支持C99标准. 根据ISO C++标准,在G++下,main函数的返回值必须是int,否则将会导致Compile Error(编译错误)的判答 3、G++/GCC使用scanf、printf时注意引用<stdio.h>,只引用<iostream>不识别 4、提交C语言代码最好使用G++,G++兼容C和C++。C的代码可以用GCC也可用G++提交,而C++的代码不能够用GCC提交,只能用G++。因此最好一个通过不了的两个都试试,编译器的问题有的时候不好找(尤其是遇到long long 类型的和double的输入输出的时候)。 5、对于输入输出,建议不要使用cin和cout,这种输入输出方式会比较慢,在数据量大的时候容易引起超时。 6、关于main函数,定义一定要是int型,并记得加上return 0。 int main(){... return 0; } 7、当使用类似于for (int i=0;i<n;i++)这种形式对循环变量进行定义时,注意循环变量的作用域只在这个循环内。 8、输入法在敲代码和提交代码的时候一定要确保关闭,代码中(除了注释部分)有全角字符会引起CE,注释建议使用英文。
提交题目:
Q: 我提交了程序,OJ回复的那些评判结果是什么意思?
A: 下面是常见的OJ评判结果以及它们表示的意思:
Queuing : 提交太多了,OJ无法在第一时间给所有提交以评判结果,后面提交的程序将暂时处于排队状态等待OJ的评判。不过这个过程一般不会很长。
Compiling : 您提交的代码正在被编译。
Running : 您的程序正在OJ上运行。
Judging : OJ正在检查您程序的输出是否正确。
Accepted (AC) : 您的程序是正确的,恭喜!
Presentation Error (PE) : 虽然您的程序貌似输出了正确的结果,但是这个结果的格式有点问题。请检查程序的输出是否多了或者少了空格(' ')、制表符(' ')或者换行符('
')。
Wrong Answer (WA) : 输出结果错,这个一般认为是算法有问题。
Runtime Error (RE) : 运行时错误,这个一般是程序在运行期间执行了非法的操作造成的。以下列出常见的错误类型:
- ACCESS_VIOLATION 您的程序想从一些非法的地址空间读取或向其中写入内容。一般例如指针、数组下标越界都会造成这个错误的。
- ARRAY_BOUNDS_EXCEEDED 您的程序试图访问一个超出硬件支持范围的数组单元。
- FLOAT_DENORMAL_OPERAND 进行了一个非正常的浮点操作。一般是由于一个非正常的浮点数参与了浮点操作所引起的,比如这个数的浮点格式不正确。
- FLOAT_DIVIDE_BY_ZERO 浮点数除法出现除数为零的异常。
- FLOAT_OVERFLOW 浮点溢出。要表示的数太大,超出了浮点数的表示范围。
- FLOAT_UNDERFLOW 浮点下溢。要表示的数太小,超出了浮点数的表示范围。
- INTEGER_DIVIDE_BY_ZERO 在进行整数除法的时候出现了除数为零的异常。
- INTEGER_OVERFLOW 整数溢出。要表示的数值太大,超出了整数变量的范围。
- STACK_OVERFLOW 栈溢出。一般是由于无限递归或者在函数里使用了太大的数组变量的原因。
- ...... 其他错误,包括C++标准库/STL运行时库错误等,这里不再举例。
- Time Limit Exceeded (TLE) : 您的程序运行的时间已经超出了这个题目的时间限制。
Memory Limit Exceeded (MLE) : 您的程序运行的内存已经超出了这个题目的内存限制。
Output Limit Exceeded (OLE) : 您的程序输出内容太多,超过了这个题目的输出限制。
Compilation Error (CE) : 您的程序语法有问题,编译器无法编译。具体的出错信息可以点击链接察看。
System Error (SE) : OJ内部出现错误。由于我们的OJ可能存在一些小问题,所以出现这个信息请原谅,同时请及时与管理员联系。
Out Of Contest Time : 超出比赛时间,这个信息只有在比赛的时候才会出现。