关于 CE

学术版

Spasmodic @ 2020-09-04 21:30:41

#include<bits/stdc++.h>
using namespace std;
const int N=300005;
int n,m,tot,max_len,hd[N],totQ,hdQ[N];
struct query{int u,v,lca,dist;bool operator<(const query&x)const{return dist>x.dist;}}q[N];
struct edge{int t,w,nxt;}es[N<<1],esQ[N<<1];
inline void add(register int u,register int v,register int w){es[++tot]=(edge){v,w,hd[u]};hd[u]=tot;}
inline void addQ(register int u,register int v,register int id){
    esQ[++totQ]=(edge){v,id,hdQ[u]},hdQ[u]=totQ;
}
struct IO_Tp {
    const static int _I_Buffer_Size = 2 << 20;
    char _I_Buffer[_I_Buffer_Size], *_I_pos = _I_Buffer;

    const static int _O_Buffer_Size = 2 << 20;
    char _O_Buffer[_O_Buffer_Size], *_O_pos = _O_Buffer;

    IO_Tp() { fread(_I_Buffer, 1, _I_Buffer_Size, stdin); }
    ~IO_Tp() { fwrite(_O_Buffer, 1, _O_pos - _O_Buffer, stdout); }

    IO_Tp &operator>>(int &res) {
        while (!isdigit(*_I_pos)) ++_I_pos;
        res = *_I_pos++ - '0';
        while (isdigit(*_I_pos)) res = res * 10 + (*_I_pos++ - '0');
        return *this;
    }

    IO_Tp &operator<<(int n) {
        static char _buf[10];
        char *_pos = _buf;
        do
            *_pos++ = '0' + n % 10;
        while (n /= 10);
        while (_pos != _buf) *_O_pos++ = *--_pos;
        return *this;
    }

    IO_Tp &operator<<(char ch) {
        *_O_pos++ = ch;
        return *this;
    }
} IO;
int id[N],d[N],dist[N];
int s[N],cnt,ma;
bool vst[N];
int find(register int x){return x==id[x]?x:id[x]=find(id[x]);}
void unite(register int x,register int y){register int a=find(x),b=find(y);d[a]>d[b]?id[a]=b:id[b]=a;}
void tarjan(register int x){
    id[x]=x;vst[x]=true;
    for(register int i=hd[x],y;i;i=es[i].nxt)
        if(!vst[y=es[i].t]){
            d[y]=d[x]+1,dist[y]=dist[x]+es[i].w;
            tarjan(y);
            unite(y,x);
        } 
    for(register int i=hdQ[x];i;i=esQ[i].nxt)
        if(vst[esQ[i].t]) 
            q[esQ[i].w].lca=find(esQ[i].t);
}
void dfs(register int u,register int fa){
    for(register int i=hd[u],v;i;i=es[i].nxt)
        if((v=es[i].t)!=fa)
            dfs(v,u),s[u]+=s[v];
    if(s[u]==cnt)ma=max(ma,dist[u]-dist[fa]);
} 
inline bool ok(register int len){
    memset(s,0,sizeof(s));
    cnt=ma=0;
    for(register int i=1;i<=m;i++)if(q[i].dist>len)cnt++,s[q[i].u]++,s[q[i].v]++,s[q[i].lca]-=2;
    dfs(1,0);
    if(max_len-ma>len)return 0;
    else return 1;
}
int main(){
    freopen("transport.in","r",stdin);
    freopen("transport.out","w",stdout);
    IO>>n>>m;
    for(register int i=1,a,b,t;i<n;i++)IO>>a>>b>>t,add(a,b,t),add(b,a,t);
    register int l=0,r=0,ans=0;
    for(register int i=1;i<=m;i++){
        IO>>q[i].u>>q[i].v;
        addQ(q[i].u,q[i].v,i),addQ(q[i].v,q[i].u,i);
    }
    tarjan(1);
    for(register int i=1;i<=m;i++)r=max(r,q[i].dist=dist[q[i].u]+dist[q[i].v]-dist[q[i].lca]*2);
    ans=max_len=r;
    sort(q+1,q+m+1);
    while(l<=r){
        register int mid=l+r>>1;
        if(ok(mid))ans=mid,r=mid-1;
        else l=mid+1;
    }
    IO<<ans;
    return 0;
}

这玩意为啥选 C++ 的时候 CE 了啊

咋改啊/yun


by Davi_zhao @ 2020-09-04 21:33:19

我点进来又默默的退了出去(


by Spasmodic @ 2020-09-04 21:35:07

好了不CE了,此贴终/yun


by Semsue @ 2020-09-04 21:36:24

应该是不能直接在struct里赋值


by Spasmodic @ 2020-09-04 21:37:28

@Flying_Bird 是 不知道为啥本地手动关std=c++14和你谷ide都编译通过


by __gkxx_iscas @ 2020-09-04 21:40:30

@happydef 提供类内初始值是C++11开始允许的行为

另一个问题是register,因为自C++11起register被认定为deprecated,自C++14开始register被判为CE


by Spasmodic @ 2020-09-04 21:47:17

@辗转不纪年 然而我题目里面说了是C++ CE


by Andy_chen @ 2020-09-04 22:00:01

inline void add(register int u,register int v,register int w){es[++tot]=(edge){v,w,hd[u]};hd[u]=tot;}

这种好像是C++11特性,而C++似乎不支持


by __gkxx_iscas @ 2020-09-05 11:26:02

@happydef 我说了两点

如果是C++ CE,那就是类内初始值或者列表初始化的问题

如果是C++14 CE,那就是register的问题


|