时间:2025-05-07 15:31
人气:
作者:admin
由于主播最近做 Ynoi 做多了,卡常卡的有点魔怔,所以写一下这个。
我常用的是 cin/cout,不怎么用 printf/scanf。
endl,用 \n,endl 会附加清空缓存区的时间。inline int read(){
int x=0,y=1;
char ch=getchar();
while (ch>'9'||ch<'0')y=(ch=='-')?-1:1,ch=getchar();
while (ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*y;
}
inline void print(int x){
if (x>9)print(x/10);
putchar(x%10+'0');
return;
}
只要不遇到恶心出题人给你每行后面加一千个空格就不会出大问题。
一般来说加了这俩就够了,但是 lxl 的题可能不太够,所以就用这个。
struct IO{
static const int S=1<<21;
char buf[S],*p1,*p2;int st[105],Top;
~IO(){clear();}
inline void clear(){fwrite(buf,1,Top,stdout);Top=0;}
inline void pc(const char c){Top==S&&(clear(),0);buf[Top++]=c;}
inline char gc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
inline IO&operator >> (char&x){while(x=gc(),x==' '||x=='\n'||x=='\r');return *this;}
template<typename T>inline IO&operator >> (T&x){
x=0;bool f=0;char ch=gc();
while(!isdigit(ch)){if(ch=='-') f^=1;ch=gc();}
while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=gc();
f?x=-x:0;return *this;
}
inline IO&operator << (const char c){pc(c);return *this;}
template<typename T>inline IO&operator << (T x){
if(x<0) pc('-'),x=-x;
do{st[++st[0]]=x%10,x/=10;}while(x);
while(st[0]) pc('0'+st[st[0]--]);return *this;
}
}fin,fout;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
其实 Ynoi 写 fread 是不是已经成传统了来着。
这俩差多少我也没测过(目移)
有时候我会去题解里抄一个快读下来什么的(目移)
long long 运算速度比 int 慢一点,所以要卡的时候先把 #define int long long 去掉,能避免 ll 运算(特别是乘法和取模)就避免掉。int 改成 short。(a+b)%mod。改成加减法会更快。inline int add(int x,int y){
return x+y>=mod?x+y-mod:x+y;
}
inline int del(int x,int y){
return x-y<0?x-y+mod:x-y;
}
for 里的变量改成 register int。inline。const int & 而不是 int。unsigned。int a=0; 改成 int a(0);(这一条不知道有没有效果)if(?)?; 改成 (?)&&(?);。for(int i=0;i<2;i++))也把循环拆掉。一般来说循环展开 4 层左右就够了。a++ 改成 ++a。swap(a,b)\(\to\)x^=y^=x^=y-x\(\to\)~x+1abs(x)\(\to\)x^(~(x>>31)+1)+(x>>31)x%2==1\(\to\)x&1x%2==0\(\to\)~x&1push_back 改成 emplace_back(不清楚效果)lower_bound/upper_bound 改用手写二分。set/map 常数比较大,遇到卡这俩的题换个做法或者手写吧。sort 对排的比较好的数组常数大,可以先打乱再排(不清楚效果)memcpy 比循环复制快。memset 把 sizeof(a) 改成 (n+5)*sizeof(int)(对于需要清空的比较少的时候)__builtin 很好用,本质其实是位运算,很快。__builtin_ctz(unsigned int x);//求 x 二进制末尾 0 的数量
__builtin_clz(unsigned int x);//求 x 二进制前导 0 的数量
__builtin_ffs(unsigned int x);//求 x 二进制末位 1 的位置
__builtin_popcount(unsigned int x);//求 x 二进制 1 的个数
__builtin_parity(unsigned int x);//求 x 二进制 1 的个数的奇偶性
vis 不要次次清空,可以用不同的值重复覆盖标记减少清空次数。vector。最后祝广大 OIer 早日脱离卡常苦海。
下一篇:P1220 关路灯 搜索剪枝