打FFT时中发现的卡常技巧
题目:洛谷P1919 A*B Problem 加强版
我的代码完全借鉴boshi,然而他380ms我880ms。。。于是我通过彻底的卡(chao)常(dai)数(ma)成功优化到了380ms,都是改了一些等效写法,所以我决定把我发现的技巧贴出来,说不定以后用得到。。。如果你有什么卡常技巧也请告诉我QwQ
1.加register
这个不必多说了吧,卡常基本操作之一,但是貌似加多了也会慢
2.运算符重载时加上取地址符
本来是这样:
class cp
{
public:
double real,imag;
cp operator+(const cp aa)
{return (cp){real+aa.real,imag+aa.imag};}
cp operator-(const cp aa)
{return (cp){real-aa.real,imag-aa.imag};}
cp operator*(const cp aa)
{return (cp){real*aa.real-imag*aa.imag,real*aa.imag+imag*aa.real};}
};
改成了这样:
class cp
{
public:
double real,imag;
cp operator+(const cp& aa)
{return (cp){real+aa.real,imag+aa.imag};}
cp operator-(const cp& aa)
{return (cp){real-aa.real,imag-aa.imag};}
cp operator*(const cp& aa)
{return (cp){real*aa.real-imag*aa.imag,real*aa.imag+imag*aa.real};}
};
原因未知,但快了不少。
3.不要重载等号
如果你写了这样的函数:
cp& operator=(const cp& aa)
{if(this!=&aa){real=aa.real,imag=aa.imag;}return *this}
除非你用等号干一些特殊的事,否则去掉吧。编译器会自动重载等号,而且绝对要更快。
4.去掉多余的构造函数
一开始我是这么写的:
class cp
{
public:
double real,imag;
cp(double x=0.0,double y=0.0)
{real=x,imag=y;}
cp operator+(const cp aa)const
{return cp(real+aa.real,imag+aa.imag);}
//......
};
//in FFT()
cp wn(cos(pi/i),f*sin(pi/i));
改成了这样后:
class cp
{
public:
double real,imag;
cp operator+(const cp aa)
{return (cp){real+aa.real,imag+aa.imag};}
//......
};
//in FFT()
cp wn=(cp){cos(pi/i),f*sin(pi/i)};
就变快了,看来构造函数耗时还是很大的,尤其是当你要设一组变量的时候。
所以说,C++这玩意真的玄学=。=如果你有别的卡常技巧请务必告诉我QwQ
打FFT时中发现的卡常技巧的更多相关文章
- Codeforces 986D - Perfect Encoding(FFT+爪巴卡常题)
题面传送门 题意:给出 \(n\),构造出序列 \(b_1,b_2,\dots,b_m\) 使得 \(\prod\limits_{i=1}^mb_i\geq n\),求 \(\sum\limits_{ ...
- BZOJ4836: [Lydsy1704月赛]二元运算【分治FFT】【卡常(没卡过)】
Description 定义二元运算 opt 满足 现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c 你需要求出有多少对 (i, j) 使 ...
- 发现一个小技巧:火狐浏览器对phpmyadmin支持更友好
这段时间ytkah正在迁移服务器(A→B),为了方便起见,直接用phpmyadmin导入数据库.一般我们是用navicat来操作数据库的,但是服务器A设置了权限,无法用navicat连接,只好在浏览器 ...
- CodeForces 327E Axis Walking(状压DP+卡常技巧)
Iahub wants to meet his girlfriend Iahubina. They both live in Ox axis (the horizontal axis). Iahub ...
- 金牌选手zzy的卡常头文件
一定要粘上去啊,亲测快两倍 #pragma GCC diagnostic error "-std=c++11" #pragma GCC optimize("-fdelet ...
- bzoj3676 [Apio2014]回文串 卡常+SAM+树上倍增
bzoj3676 [Apio2014]回文串 SAM+树上倍增 链接 bzoj luogu 思路 根据manacher可以知道,每次暴力扩展才有可能出现新的回文串. 所以推出本质不同的回文串个数是O( ...
- 从 洛谷P5309 Ynoi2011 初始化 看卡常
一般情况下,程序运行消耗时间主要与时间复杂度有关,超时与否取决于算法是否正确. 但对于某些题目,时间复杂度正确的程序也无法通过,这时我们就需要卡常数,即通过优化一些操作的常数因子减少时间消耗. 比如这 ...
- ynoi2018
题解: 全分块是啥操作啊.. 而且都好难.. 1.未来日记 这个比较简单 对每个块开个线段树维护权值 $n\sqrt{n}logn$ 这个会炸空间 并不能做... 但还是说一下做法 首先考虑分块 然后 ...
- CTSC&APIO被教做人记
DAY 0: 早早起来从衡水出发,在去火车站的路上明白了HZOI总是差点误车的真相……上了绿皮火车之后由于没网没流量就开始看政治书应付学考,然而并不是很能看进去,感觉初中学的比高中学的不知道高到哪里去 ...
随机推荐
- POJ 1062 昂贵的聘礼(最短路中等题)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 51879 Accepted: 15584 Descripti ...
- mysql列类型char,varchar,text,tinytext,mediumtext,longtext的比较与选择
储存不区分大小写的字符数据 TINYTEXT 最大长度是 255 (2^8 – 1) 个字符. TEXT 最大长度是 65535 (2^16 – 1) 个字符. MEDIUMTEXT 最大长度是 16 ...
- oracle存储过程批量插入测试数据
前几天测试中债时,自定义资产有一级类型和二级类型,一级类型下有很多分类,每个分类下又有很多二级分类,而要做的是每种类型都要建立一个自定义资产,并做一笔交易,然后测试是否出值,于是写了一个存储过程批量插 ...
- 线段树区间更新 lazy
1. hdu1698 http://acm.hdu.edu.cn/showproblem.php?pid=1698 /* x y k x~y的值变为k */ #include <cstdio&g ...
- Codeforces 468C/469E 易错点
#include <stdio.h> #include <stdlib.h> typedef long long ll; int main() { ll x=1e17; ll ...
- for循环遍历数组(数组1)
package com.mon10.day24; import java.util.Scanner; /** * 类说明 :计算学生的总成绩和平均分 * @author 作者 : chenyanlon ...
- spring boot 配置数据源
以postgreSQL为例,方便下次直接使用. 其中pom.xml引入如下依赖. <?xml version="1.0" encoding="UTF-8" ...
- oracle按照in的顺序进行排序
oracle按照in的顺序进行排序 ,,) order by case id end;
- CM记录-集群运行故障修复记录
集群运行故障分析(空间不足.时钟误差.状态不良) 调整空间.同步时间.重启 修复后: 各个数据节点容量分布情况
- python 喜马拉雅 音乐下载 演示代码
1.主程序文件 import os import json import requests from contextlib import closing from progressbar import ...