B_1168 @ 2020-03-27 11:10:46
如题,尝试用分块模板过,但是不知为何开了O2只能拿90,哪怕是用了从ST表模板题题面复制的快读模板也过不了……为什么不用ST表?因为我ST表模板题是靠分块过的……用了O2之后#8 和#10 都能卡在500ms左右,但是#9 就是TLE,请各位dalao们伸出援手,用更多的常数优化卡过这道题,或者让这个*山一样的万年模板能用臭氧冲过去,在此先谢过各位了
以下是极度丑陋的代码
#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
//devised from my P3372 Segment Tree I Template: only 50 points is expected this way
//First attempt with O2 gave 90; pumping ozone smashed the results to 0.
long long n,m,len,a[maxn],val_max[maxn],val_min[maxn],be[maxn];
/*
void modify(long long from,long long to,long long ad){
for(long long i=from;i<=min(to,be[from]*len);i++) a[i]+=ad,val[be[from]]+=ad;
if(be[from]!=be[to]){
for(long long i=(be[to]-1)*len+1;i<=to;i++) a[i]+=ad,val[be[to]]+=ad;
}
for(long long i=be[from]+1;i<=be[to]-1;i++) add[i]+=ad;
}
*/
inline int read(){ //This is from the ST chart template but it did NOT work sufficiently
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
long long query_min(long long from,long long to){
long long cnt=9223372036854775805;
for(long long i=from;i<=min(to,be[from]*len);i++) cnt=min(cnt, a[i]);
if(be[from]!=be[to]){
for(long long i=(be[to]-1)*len+1;i<=to;i++) cnt=min(cnt, a[i]);
}
for(long long i=be[from]+1;i<=be[to]-1;i++) cnt=min(cnt, val_min[i]);
return cnt;
}
long long query_max(long long from,long long to){
long long cnt=-9223372036854775805;
for(long long i=from;i<=min(to,be[from]*len);i++) cnt=max(cnt, a[i]);
if(be[from]!=be[to]){
for(long long i=(be[to]-1)*len+1;i<=to;i++) cnt=max(cnt, a[i]);
}
for(long long i=be[from]+1;i<=be[to]-1;i++) cnt=max(cnt, val_max[i]);
return cnt;
}
int main(){
n=read();m=read();
len=sqrt(n);
for(long long i=1;i<=n;i++) be[i]=(i-1)/len+1;
for(long long i=1;i<=n;i++) {
val_min[i]=9223372036854775805;
val_max[i]=-9223372036854775805;
}
for(long long i=1;i<=n;i++){
a[i]=read();
val_min[be[i]]=min(val_min[be[i]],a[i]);
val_max[be[i]]=max(val_max[be[i]],a[i]);
}
for(long long i=1;i<=n-m+1;i++){
printf("%d ",query_min(i,i+m-1));
}
printf("\n");
for(long long i=1;i<=n-m+1;i++){
printf("%d ",query_max(i,i+m-1));
}
}
by IntrepidStrayer @ 2020-03-27 11:18:21
学学单调队列吧
by Marser @ 2020-03-27 11:19:28
学学单调队列吧
by djwj233 @ 2020-03-27 11:23:04
建议学习指令集
by star_magic_young @ 2020-03-27 11:27:09
照你这么说 Ynoi 可以直接开1e6了/qiang
by B_1168 @ 2020-03-27 11:30:13
@拥抱渴望者 改成i++之后#8 和#10 从500ms左右下降到了约425ms,但是#9还是TLE……我怀疑这数据点就是卡分块的……
by Marser @ 2020-03-27 11:33:15
@B_1168 求求您去学个单调队列吧,分块怎么可能过啊。复杂度摆在那里,您再去交一遍ST表看看能不能过?
by Marser @ 2020-03-27 11:54:07
@B_1168 麻烦好好学习时间复杂度和单调队列之后再来尝试这道题,分块过不了ST表。
by Smile_Cindy @ 2020-03-27 11:55:13
@B_1168 现在分块过不去ST表了。
by Computer1828 @ 2020-03-27 14:48:51
@B_1168 那。。再试下fread快读,手写min和max,加个inline和register之类的?再不行就直接指令集吧。一个单调队列的模板题有必要用分块吗...
by 暴力出奇迹 @ 2020-04-07 08:59:15
应该不用 long long 吧,如果用 int 能不能卡一卡。
(话说我现在回复是不是太晚了 QwQ)