1.For循环:
for(int i=1;i<=n;i++)
慢于
for(int i=1;i<=n;++i)
2.读入输出
cin慢于scanf慢于ios::sync_with_stdio(false)+cin慢于基于getchar的快读
快读快写代码:
int read()
{
int s=0,t=1;
char ch;
ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') t=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
s=(s<<1)+(s<<3)+ch^48;
ch=getchar();
}
return t*s;
}
void write(int x)
{
if(x==0) return;
write(x/10);
putchar((x%10)+'0');
}
3.运算
优先使用位运算:& | ^ << >>
速度更快。
附位运算基本操作:
取二进制数n的第k位(从右到左) | n&(1<<(k-1)) |
截取二进制数n第k位后m位(从左到右) | n&((1<<m-1)<<(log2(n)+1-m)) |
求二进制数n最后一个“1”对应的数值,即lowbit函数 | n&(-n) |
将二进制数n的第k位设为“1” | n|=(1<<(k-1)) |
将二进制数n的第k位设为“0” | n&=~(1<<(k-1)) |
4.优化算法
如动态规划->四边行不等式/斜率/单调队列/高级数据结构/ 优化
如,合并石子问题使用单调队列优化:
可以将时间复杂度降至O(n^2)
未优化代码:O(n^3)
#include<bits/stdc++.h>
using namespace std;
int n,d[110][110],temp[10010],a[110];
int main()
{
cin>>n;
memset(d,63,sizeof(d));
for(int i=1;i<=n;i++)
{
cin>>a[i];
d[i][i]=0;
temp[i]=temp[i-1]+a[i];
}
for(int i=n-1;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
{
for(int k=i;k<j;k++)
{
d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]+temp[j]-temp[i-1]);
}
}
}
cout<<d[1][n];
return 0;
}
优化后代码:
#include<bits/stdc++.h>
using namespace std;
int n,sum=0,ans;
vector<int> v;
int main()
{
scanf("%d",&n);
v.push_back(2147483640);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
v.push_back(x);
}
v.push_back(2147483640);
while(n-->1)
{
int k,j;
for(k=1;k<=n;k++) if(v[k-1]<v[k+1]) break;
sum=v[k]+v[k-1];
for(j=k-1;j>=0;j--) if(v[j]>sum) break;
v.erase(v.begin()+k-1);
v.erase(v.begin()+k-1);
v.insert(v.begin()+j+1,sum);
ans+=sum;
}
cout<<ans;
return 0;
}
5.手动火车头(O1,O2,O3)
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")