为什么手动开O3还会TLE?

P1440 求m区间内的最小值

richardchen @ 2017-11-08 23:25:34

#include<cstdio>
#include<algorithm>
#define M 2000005
#define ENDL putchar('\n');
using namespace std;
int n,m,tree[M<<2],size=1;
void Build(int tmp)
{
    while(size<tmp+2) size<<=1;
    for(int i=size+1;i<=size+tmp;i++) scanf("%d",&tree[i]);
    for(int i=size-1;i>0;i--) tree[i]=min(tree[i<<1],tree[i<<1|1]);
}
int query(int l,int r)
{
    int ret=0x7fffffff;
    for(l=l+size-1,r=r+size+1;l^r^1;l>>=1,r>>=1)
    {
        if(~l&1) ret=min(ret,tree[l^1]);
        if(r&1) ret=min(ret,tree[r^1]);
    }
    return ret;
}
int main()
{
    scanf("%d%d",&n,&m);
    Build(n);
    putchar('0');putchar('\n');
    for(int i=2;i<=n;i++) printf("%d",query(max(1,i-m),i-1)),putchar('\n'); 
    return 0;
}
本来AC,在开头写上%:pragma optimize("o3").或#pragma GCC optimize(3)后TLE两个点(#2,#10),而且开O2都不会AC了,求dalao解释。。。

by Hades18 @ 2017-11-09 07:19:01

1.洛谷机子不支持手动开O2,O3,想开的可以上大牛分站。

2.你的代码可能卡在时限附近,由于评测机波动T了

3.O2的优化可能会将你的一些源码优化成莫名其妙(AC->WA)


by 微雨燕双飞 @ 2018-02-24 16:06:37

哇,真是大佬,zkw线段树蒟蒻现在都没学会


|