ACM零散知识

定理与方法专区:

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.任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和(黑书上有说明)

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"));

注意事项:

  1. 注意特殊情况。
  2. G++输出double用f%。
  3. 一定要考虑0啊。
  4. 定义变量的时候注意定义的是全局还是局部。
  5. 回溯时,一定要看好是否完全回溯了。
  6. 注意visit数组的标记。
  7. Short int 数组可以存到5001*5001。
  8. 注意使用long long。
  9. 注意变量的初始化。
  10. 结果是否需要mod一个数。
  11. 求最大值的时候,看是否存在负数的情况。

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) : 虽然您的程序貌似输出了正确的结果,但是这个结果的格式有点问题。请检查程序的输出是否多了或者少了空格(‘ ‘)、制表符(‘\t‘)或者换行符(‘\n‘)。

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 : 超出比赛时间,这个信息只有在比赛的时候才会出现。

时间: 2024-10-13 00:17:39

ACM零散知识的相关文章

ACM数学知识体系

#include<iostream> #include<string> #include<stack> using namespace std; #define n 8 stack <int *> s; int * createMaze(){//初始化迷宫 int i,j; int * a; a=new int[n*n]; for(i=0;i<n;i++){ for(j=0;j<n;j++){ *(a+n*i+j)=-1;//不设置为0的原因是超

【转】ACM博弈知识汇总

博弈知识汇总 转自:http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理.下面我们来分析一下要如何才能够取胜. (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.

ACM博弈知识汇总(转)

博弈知识汇总 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理.下面我们来分析一下要如何才能够取胜. (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取

C++STL之ACM相关知识大全

vector 在STL 的头文件中定义了vector(向量容器模板类),vector容器以连续数组的方式存储元素序列,可以将vector 看作是以顺序结构实现的线性表.当我们在程序中需要使用动态数组时,vector 将会是理想的选择,vector 可以在使用过程中动态地增长存储空间. vector 模板类需要两个模板参数,第一个参数是存储元素的数据类型,第二个参数是存储分配器的类型,其中第二个参数是可选的,如果不给出第二个参数,将使用默认的分配器. 1.定义vector 向量对象的方法: vec

SAS零散知识总结

1,变量名命名规范:以字母或者下划线开始,可包含字母.下划线.数字,且不超过32个字符: 2,INFILE用于读取外部数据文件,一般于FILENAME(和LIBNAME用户一致,但路径要精确到文件名(...TXT/DAT等))连用. 3,INPUT语句用于定义字段变量,可用于读去外部文件(INFILE).CARDS.DATALINES. 4,变量类型转换规则:①赋值:以赋值目标的变量类型而定自动转化:②做运算→数值型:③做字符连接→字符型:④经过了字符处理函数→字符型: 5,字符和数值型变量在数

每天遇到的零散知识汇聚

3.14 https://zhidao.baidu.com/question/1894472665628866420.html 3.15 go语言锁 go语言驱动msyql golang判断文件或文件夹是否存在 go-import下划线的作用 golang源代码换行问题 golangerror 进一步认识golang中的并发 Go语言如何并发超时处理详解 golang超时控制

sql注入零散知识

1.order by解释: 在SQL语言中,order by语句后面加上字段名,就可以对查询结果排序.但他有一种特殊用法,就是在后面不添加字段名,而添加数字的方式.添加数字的时候,表示以该表第几个字段进行排序.只有当数字小等于字段数时,才有效.所以通过这个条件,可以判断一个表中存在多少个字段.例如order by 10 返回正常,而order by 11页面返回错误,则说明数据库存在10个字段. 2.union select 1,2,3,4,5,6,7,8,9,10,11 from 首先解释一下

Oracle数据库零散知识09 -- DBLink的创建(转)

通过创建database link实现Oracle跨数据库查询的方法 在Oracle本地数据库端执行赋权dbuser帐号 SQL> grant create database link to dbuser; 配置本地数据库服务器的tnsnames.ora文件 $ vi $ORACLE_HOME/network/admin/tnsnames.ora 增加需要远程连接服务器的连接配置,如: ORCL_REMOTE =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(

Oracle数据库零散知识05 -- 表创建,修改

1.表的创建 Create table student02(sno number); 2.表的删除 Drop table student02; 3.表的重命名 Rename student02 to student01; 4.表的修改 Alter table student01 --列的修改 Add ob number Modify ob varchar2(2) Rename column ob to obnew Drop column obnew --约束 Add constraint pk_