加载中...

看懂算法竞赛的一些特殊又常见操作

让cin变快

std::ios::sync_with_stdio(false);//这条语句可以使用cin,和cout几乎和scanf和printf一样快
cin.tie(0),cout.tie(0);//解除cin和cout的绑定

ACM中的无穷大常量 0x4个3f

const int INF=0x3f3f3f3f;//*2依然不会溢出
const int INF=0x7fffffff;//真正的无穷大量

避免浮点数的缺少

double bielv=1.5;
原来:money*100*(beilv-1)
后来:money*10*(beilv*10-10)

或者:将小数变成相似的小数
原来:min(10000,(int)(money*100*(beilv-0.1))//另外min函数的使用需要两边你都为同类型的
变成:min(10000,(int)(money*100*(beilv-0.999999999999))



auto代替长长的迭代器进行容器遍历

vector<int >vec;
vector<int >::iterator it =vec.begin();

auto it =vec.begin;

sign main()主函数

这样的代码是因为上面有人
#define int  long long 
所以下面用int main()会变成long long main()
又因为int main等价于signed main 所以不会影响


读入二维字符串

可能因为题目给的输入数据不规范scanf()读到了'\n',那么需要cin>>就可以安全通过
或者
for(int i=1;i<=n;i++){
  scanf("%s",a[i]+1);//不管m列,直接读入每一行
}

温馨提示,对于多组侧是样例t的题

记得将队列的定义,数组的定义放在这不然就超时

结构化绑定

typedef pair<int, int> PII;
vector<PII> v;
for(auto & [x,y] : v)//[]里面自动找到v的两个元素
        {
            cout<<x<<' '<<y<<' ';
        }

位运算

for (int i = h[u]; ~i; i=ne[i]) {
        dfs(e[i],depth+1);
    }
//等价于 因为~a =-a+1,所以当i==-1 ,~a会等于0,for循环退出
for (int i = h[u]; i != -1; i=ne[i]) {
        dfs(e[i],depth+1);
    }

----
if(dep&1)
        ++ans;

//当dep==奇数的时候 ans++
等价于 if(dep%2!=0) ++ans


posted @ 2022-01-22 00:38  liang302  阅读(78)  评论(0编辑  收藏  举报