Основное
 
 
Отправитель Задача Язык Вердикт Время Память Отослано Протест.  
175103412 Дорешивание:
hzr
1566G - 81 C++20 (GCC 11-64) Полное решение 1699 мс 61288 КБ 2022-10-08 11:40:30 2022-10-08 11:40:30
→ Исходный код
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=100010;
struct edge{
    int x,y,w;
};
bool operator<(edge x,edge y){
    return x.w<y.w || (x.w==y.w && x.x<y.x) || (x.w==y.w && x.x==y.x && x.y<y.y);
}
int i,j,k,n,m,q;
multiset<edge>All,D[maxn];
set<edge>use;
map<pair<int,int>,int>M;
multiset<ll>ANS;
void work(){
    // 三条边
    long long Ans=0;
    Ans=0ll+(*All.begin()).w+(*++All.begin()).w+(*++++All.begin()).w;

    // 用了最小边
    auto E=*use.begin();
    int Num=0;
    for(auto t:use){
        ++Num;if(Num>=12)exit(1);
        // cerr<<"t:"<<t.x<<' '<<t.y<<" | "<<E.x<<' '<<E.y<<endl;
        if(t.x!=E.x && t.y!=E.x && t.x!=E.y && t.y!=E.y){
            Ans=min(Ans,0ll+E.w+t.w);
            break;
        }
    }
    // cerr<<"OK! "<<Ans<<endl;

    // 没有
    int X=E.x,Y=E.y,Cnt0=1;
    for(auto e1=D[X].begin();e1!=D[X].end()&&Cnt0<=3;Cnt0++,++e1){
        int Cnt1=1;
        for(auto e2=D[Y].begin();e2!=D[Y].end()&&Cnt1<=3;Cnt1++,++e2){
            if((*e1).x!=(*e2).x && (*e1).y!=(*e2).x && (*e1).x!=(*e2).y && (*e1).y!=(*e2).y)
                Ans=min(Ans,0ll+(*e1).w+(*e2).w);
        }
    }

    printf("%lld\n",Ans);
}
bool check(edge t){
    int Num=0,Cnt;
    Cnt=1;for(auto e=D[t.x].begin();e!=D[t.x].end()&&Cnt<=3;Cnt++,++e)if((*e).y==t.y)++Num;
    Cnt=1;for(auto e=D[t.y].begin();e!=D[t.y].end()&&Cnt<=3;Cnt++,++e)if((*e).x==t.x)++Num;
    // cerr<<"Check "<<t.x<<' '<<t.y<<" Num="<<Num<<endl;
    return Num==2;
}
void INSERT(int x,int y,int z){
    All.insert((edge){x,y,z});
    M[make_pair(x,y)]=z;int Cnt;
    Cnt=1;for(auto e=D[x].begin();e!=D[x].end()&&Cnt<=3;Cnt++,++e)if(check(*e))if(use.find(*e)!=use.end())use.erase(*e);
    Cnt=1;for(auto e=D[y].begin();e!=D[y].end()&&Cnt<=3;Cnt++,++e)if(check(*e))if(use.find(*e)!=use.end())use.erase(*e);
    D[x].insert((edge){x,y,z});D[y].insert((edge){x,y,z});
    Cnt=1;for(auto e=D[x].begin();e!=D[x].end()&&Cnt<=3;Cnt++,++e)if(check(*e))use.insert(*e);
    Cnt=1;for(auto e=D[y].begin();e!=D[y].end()&&Cnt<=3;Cnt++,++e)if(check(*e))use.insert(*e);
}
void ERASE(int x,int y,int z){
    // cerr<<"ERASE."<<endl;
    All.erase(All.find((edge){x,y,z}));int Cnt;
    Cnt=1;for(auto e=D[x].begin();e!=D[x].end()&&Cnt<=3;Cnt++,++e)if(check(*e))if(use.find(*e)!=use.end())use.erase(*e);
    Cnt=1;for(auto e=D[y].begin();e!=D[y].end()&&Cnt<=3;Cnt++,++e)if(check(*e))if(use.find(*e)!=use.end())use.erase(*e);
    D[x].erase((edge){x,y,z});D[y].erase((edge){x,y,z});
    // cerr<<"------"<<endl;
    Cnt=1;for(auto e=D[x].begin();e!=D[x].end()&&Cnt<=3;Cnt++,++e)if(check(*e))use.insert(*e);
    Cnt=1;for(auto e=D[y].begin();e!=D[y].end()&&Cnt<=3;Cnt++,++e)if(check(*e))use.insert(*e);
}
int main(){
    cin>>n>>m;
    for(i=1;i<=m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        if(x>y)swap(x,y);
        INSERT(x,y,z);
    }
    work();
    cin>>q;
    for(i=1;i<=q;i++){
        int op;
        scanf("%d",&op);
        if(op==0){
            int x,y,z;
            scanf("%d%d",&x,&y);
            if(x>y)swap(x,y);
            z=M[make_pair(x,y)];
            ERASE(x,y,z);
        }else{
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            if(x>y)swap(x,y);
            INSERT(x,y,z);
        }
        work();
    }
}
?
Время: ? ms, память: ? КБ
Вердикт: ?
Ввод
?
Вывод участника
?
Ответ жюри
?
Комментарий чекера
?
Диагностика
?
Показать детали тестирования