有点逆天

P2572 [SCOI2010] 序列操作

Phartial @ 2023-05-04 07:36:54

link,这位老哥直接暴力+记忆化操作 4 写的,然后还只跑了 3.81s

老哥代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
int a[N];
bool mp[4];
map<int,map<int,int> >ans;
signed main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    while(m--){
        int op,l,r;
        scanf("%d%d%d",&op,&l,&r);
        mp[op]=1;
//      for(int i=0;i<n;i++) cout<<a[i]<<" ";
//      puts("");
        if(!op) fill(a+l,a+r+1,0);
        else if(op==1) fill(a+l,a+r+1,1);
        else if(op==2) for(int i=l;i<=r;i++) a[i]=(!a[i]);
        else if(op==3){
            int ans=0;
            for(int i=l;i<=r;i++) ans+=a[i];
            printf("%d\n",ans);
        }
        else{
            if(!mp[0]&&!mp[1]&&!mp[2]&&ans[l][r]){
                printf("%d\n",ans[l][r]);
                continue;
            }
            int anss=0,t=0;
            for(int i=l;i<=r;i++){
                if(a[i]) t++;
                else t=0;
                anss=max(anss,t);
            }
            ans[l][r]=anss;
            printf("%d\n",anss);
        }
//      for(int i=0;i<n;i++) cout<<a[i]<<" ";
//      puts("");
    }
    return 0;
}

by Loic_ @ 2023-05-04 07:53:12

建议再加个 Hack。线段树正常写法应该都可以 100ms 之内过去的。


by Lynkcat @ 2023-05-04 08:36:16

开O2的原因吧,当年这个题可是没O2的。


by Lynkcat @ 2023-05-04 08:37:04

1e5能过确实正常,寻址连续再加上这个题需要做的东西常数很小


by yinhee @ 2023-05-04 09:17:21

@Loic_ 但是最优解是 250ms 的


by jijidawang @ 2023-05-04 11:39:41

@yinhee 测试点最大用时


by yinhee @ 2023-05-04 11:45:24

@jijidawang 哦

但是为啥我的要 200ms/kk


by StayAlone @ 2023-05-05 17:20:22

时限可以开 500ms,不开 O2 正常写法都是两倍以上了。


by StayAlone @ 2023-05-05 17:21:53

可以加上 O2 标签然后时限 100ms


|