C++/竞赛


一、字符(串)读入

1)gets()。!!!!!!!字符数组!!!!!。
	用于从标准输入流stdin读入一个整行(以'\n'或EOF)结束,写入ptr指向的字符数组,并返回这个指针;出错或遇到文件结束时则返回NULL。行末的'\n'从流中取出,但不写入数组。gets()不检查被写入的数组大小。
2)getchar()。单个字符。
	用于从标准输入流stdin读入一个字符,并返回这个字符。如果读到文件结尾,则返回EOF。注意到EOF不能用char类型表示,所以getchar()函数返回的是一个int型的数。使用时也应该注意这一点。
3)getline(cin,st)。!!!!!!!字符串!!!!!!。
	st为一个字符串。此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。
	–从输入流中读入字符,存到string变量
	–直到出现以下情况为止:
	?读入了文件结束标志
	?读到一个新行
	?达到字符串的最大长度
	–如果getline没有读入字符,将返回false,可用于判断文件是否结束
4) cin。遇到回车与空格结束读取。

二、常见Ascill码

1)A的ASCII代码为65
2)a的ASCII代码为97
3)0(数字零)的ASCII代码为48

三、in&out

1、文件输入输出
  freopen("xxx.in","r",stdin);
  freopen("xxx.out","w",stdout);
  ...
  fclose(stdin);fclose(stdout);
2、输入到行末、文末
	1)输入n行,每行数量不定
	 for(int i=1;i<=n;i++){
 	     char c=' ';
 		 while(c!='\n'){
		     cin>>a[tot++];
   	        c=getchar();
   	     }
	 }
	 
 	2)到文件结束
 	while (scanf("%d%d",&a,&b) != EOF)// 一律用这种写法,把你的scanf函数写成这样子,除了return 0之外,其他的语句都要用大括号括起来 

四、快速排序

//情况一:数组排列
int A[100];
bool cmp1(int a,int b)//int为数组数据类型
{
    return a>b;//降序排列
    //return ab.id;//按照学号降序排列
    //return a.id

五、STL堆

https://blog.csdn.net/c20182030/article/details/70757660

六、读入优化
各种读入方式的速度

int read(){
	    int x=0,p=getchar();
	    while (p>'9'||p<'0') p=getchar();
	    while (p<='9'&&p>='0') x=x*10+p-'0',p=getchar();
	    return x;
	}

七、快速幂

long long quick_pow(long long a,long long b,long long k){//a^b mod k
	long long ans=1,x=a,y=b;
	while (y!=0){
		if (y&1==1) ans=(ans*x)%k;
		x=(x*x)%k;
		y>>=1;
	}
	return ans;	
}

八、二分查找

l=0,r=maxn;
while(l<=r){
	m=(l+r)/2;
	if  (check(m))  l=m+1;
	else  r=m-1;
}
最小值最大(满足条件的最大值)————>cout<cout<

九、memset

memset(a, 0, sizeof(a));//数组中的所有元素全为0
memset(a, -1, sizeof(a));//数组中的所有元素全为-1
memset(a, 127, sizeof(a));//数组中的所有元素全为2139062143

十、unique去重

unique的作用是“去掉”容器中相邻元素的重复元素,这里去掉要加一个引号,为什么呢,是因为它实质上是一个伪去除,它会把重复的元素添加到容器末尾,而返回值是去重之后的尾地址(是地址!!),举个例子:

int num[10]={1,1,2,2,2,3,4,5,5,5};
int ans=unique(num,num+10)-num;

这时,返回的ans是5,而num中前5项就是1,2,3,4,5,一般使用前需要对容器进行排序,这样才能实现对整个数组去重。

sort(t+1,t+n+1);
len=unique(t+1,t+1+n)-t-1;

十一、树状数组

https://www.luogu.org/problemnew/solution/P3368

1、实现单点修改&区间查询
2、实现区间修改&单点查询(差分)

十二、isringstream

一个比较有用的c++的输入输出控制类。
C++引入了ostringstream、istringstream、stringstream这三个类,
要使用他们创建对象就必须包含这个头文件。
istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
strstream类同时可以支持C风格的串流的输入输出操作。
istringstream的构造函数原形如下:
istringstream::istringstream(string str);
它的作用是从string对象str中读取字符。

#include  
#include        //istringstream 必须包含这个头文件
#include  
using namespace std;  
int main()  
{  
    string str="i an a boy";  
    istringstream is(str);  
    string s;  
    while(is>>s)  
    {  
        cout<