NOIP模拟测试19考试反思

这次考试是存在很大问题的,(如果不是T1T2出乎意料地A了,鬼知道会发生什么)

T2A是情理之中,考试的时候测的极限数据跑的很快(无论m什么范围),但是T1真的。。。。。。

T3没有分配太多的时间+没有看清题,WA0

主要想说一下T2的优化思路:

基础:二分答案+检验O(n^2*log n)

我们可以发现,在检验的时候,第一个区间是可以直接枚举的,这样就把枚举起点改成枚举第一个区间

bool check(int tim){
    register int tot=0,tl=n+1,tr=n+1;
    register int now=a[n+1],cnt;
    while(now<=tim)tl--,now+=a[tl];now-=a[tl],tl++;
    while(now<=tim)tr++,now+=a[tr];now-=a[tr],tr--;
    while(tl!=n+2){
        cnt=2;tot=0;
        for(register int j=tr+1;j<=tl+n-1;j++){
            if(j+t<=tl+n-1&&sum[j+t]-sum[j-1]+tot<=tim){tot+=(sum[j+t]-sum[j-1]);j+=t;continue;}
            tot+=a[j];if(tot>tim)tot=a[j],cnt++;if(cnt>m){cnt=m+10;break;}
        }
        if(cnt<=m)return 1;
        now-=a[tl];tl++;while(now<=tim)tr++,now+=a[tr];now-=a[tr],tr--;
    }
    return 0;
}                                    

如代码所示,

这个区间的数量是小于n的(先把左指针移动到最左,然后尽可能往右移动右指针,后面每次左指针右移一个,右指针再尽量扩展)

这样就可以跑过m较大的数据(>100都可以),要是知道数据是2333我就不优化了但追求卓越的我们还要去跑过m较小的点,如果m比较小,那么分出来的区间就是比较大的,然后分块大法就应运而生。

预处理出来前缀和,代码中的t就是根号n,即:能跳就直接跳,倍增思路也是类似。

成功AC,比正解快一倍(逃)

也许,当对正解毫无头绪的时候,优化暴力才是最好的做法。

T3并不难(本来以为会有很多AK的23333333),却没有时间去思考了。

时间分配

下次加油吧

猜你喜欢

转载自www.cnblogs.com/hzoi-kx/p/11347169.html