题解 CF896E 【Welcome home, Chtholly】
众所周知welcome home是超级大优化的代名词
首先这道题的做法比较简单,可以直接超级卡常过,首先直接按题意模拟
period_code:
下文のread()视为读入数据
如果当前操作为1就在l~r这个区间找比x大的数,让它减去x
如果当前操作为2就在l~r这个区间统计恰好等于x的数并输出
int main(){
n=read(),m=read();
for(int i=1;i<=n;++i)s[i]=read();
for(;m--;){
ans=0;
op=read(),l=read(),r=read(),x=read();
if(op==1)for(register int i=l;i<=r;++i)s[i]-=(s[i]>x)?x:0;
else{
for(register int i=l;i<=r;++i)ans+=(s[i]==x);
printf("%d\n",ans);
}
}
return 0;
}
接下来就是暴力卡常了:
1.register&static&inline
1.在定义局部非char类型的变量时在前面加入register
2.在局部char类型变量前加入static
3.在非主函数和非递归函数前加入inline
4.(具体操作查看AC代码)
2.火车头打开(外网评测)
火车头传送门(外网评测)
3.快读是个好东西
inline int read(){
register int s=0,w=0;
static char ch=getchar();
for(;!isdigit(ch)ch=getchar(););
for(;isdigit(ch);ch=getchar())s=(s<<1)+(s<<3)+(ch^48);
return w?-s:s;
}
4.快读の优化
快读其实类似于字符串处理方式读取数据
由于getchar()の时间复杂度低才能提升运行速度
但是可以利用fread()这个函数读入指针,在缓存区读取数据
这样一来读取字符的速度也就提上来了
虽然只能用文件读写调试,但是能让程序跑得飞快!
inline char getchar(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
5.手动分配运行空间(手动开栈)
这是本代码最核心的部分!
#pragma comment(linker,"/stack:200000000")
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
最后你就可以暴力AC了
code:
#pragma comment(linker,"/stack:200000000")
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//此处为火车头
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int s[N],n,m,x,op,l,r,ans;
inline char getchar(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
register int s=0,w=0;
static char ch=getchar();
for(;!isdigit(ch)ch=getchar(););
for(;isdigit(ch);ch=getchar())s=(s<<1)+(s<<3)+(ch^48);
return w?-s:s;
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;++i)s[i]=read();
for(;m--;){
ans=0;
op=read(),l=read(),r=read(),x=read();
if(op==1)for(register int i=l;i<=r;++i)s[i]-=(s[i]>x)?x:0;
else{
for(register int i=l;i<=r;++i)ans+=(s[i]==x);
printf("%d\n",ans);
}
}
return 0;
}
真香