关于鸡排
查看原帖
关于鸡排
330759
囧仙楼主2021/1/25 09:06

RT\mathscr{RT} ,这个屑试图用复杂度应该是 O(n)\mathcal O(n) 的基数排序试图卡这题,然后自闭了……

倒数第二个 Subtask\text{Subtask} ,因为随机访问很少,稍稍卡卡就能 500ms200–ms\text{500ms}\to\text{200--ms} ; 最后一个 Subtask\text{Subtask}500ms+350400ms\text{500ms+}\to \text{350}\sim\text{400ms} ,这事这个屑所能做到的最大的努力。记录在这

至于发出这个贴嘛,就是想看看有没有什么很好的办法能够解决由于大数组随机访问造成的巨大多常数,以及继承这份代码试图打败毒瘤出题人。

#include<bits/stdc++.h>
#define up(l,r,i) for(register int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(register int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
typedef unsigned int       u32;
typedef unsigned long long u64;
const int INF =2147483647;
const int MAXN=1e7+3;
u32 n,I[MAXN]; i64 ans=0;
int t1=-1,t2=-1; u32 P[65536],Q[65536],J[MAXN];
unsigned short M[MAXN],N[MAXN];
char buf[1<<27],*p1,*p2; u32 a,b;
signed main(){
    p2=buf+fread(buf,1,1<<27,stdin),p1=buf;
    while( isdigit(*p1)) n=n*10+((*p1)^48),++p1;
    while(!isdigit(*p1)) ++p1;
    while(b<n){
        a=(*p1)^48;
        if(*++p1>='0'){
            a=a*10+((*p1)^48);
            if(*++p1>='0'){
                a=a*10+((*p1)^48);
                if(*++p1>='0'){
                    a=a*10+((*p1)^48);
                    if(*++p1>='0'){
                        a=a*10+((*p1)^48);
                        if(*++p1>='0'){
                            a=a*10+((*p1)^48);
                            if(*++p1>='0'){
                                a=a*10+((*p1)^48);
                                if(*++p1>='0'){
                                    a=a*10+((*p1)^48);
                                    if(*++p1>='0'){
                                        a=a*10+((*p1)^48);
                                        if(*++p1>='0') a=a*10+((*p1)^48);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        M[b]=a,N[b]=a>>16,++P[M[b]],++Q[N[b]],++b,++p1;
    }
    up(1,65535,i) P[i]+=P[i-1],Q[i]+=Q[i-1];
    dn(n-1,0,i) J[--P[M[i]]]=i; dn(n-1,0,i) I[--Q[N[J[i]]]]=J[i];
    dn(n-1,0,i){
        int x=I[i];
        if(x>t1) t2=t1,t1=x,ans=max(ans,1ll*(t1+t2+2)*((int)N[x]<<16|M[x])); else
        if(x>t2) t2= x,     ans=max(ans,1ll*(t1+t2+2)*((int)N[x]<<16|M[x]));
    }
    printf("%lld\n",ans);
    return 0;
}
2021/1/25 09:06
加载中...