結果
| 問題 |
No.529 帰省ラッシュ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-03-30 20:28:39 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,678 bytes |
| コンパイル時間 | 2,750 ms |
| コンパイル使用メモリ | 207,204 KB |
| 実行使用メモリ | 813,768 KB |
| 最終ジャッジ日時 | 2025-03-30 20:28:48 |
| 合計ジャッジ時間 | 8,178 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 2 MLE * 1 -- * 15 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch&15);
ch=getchar();
}
return x*f;
}
inline void write(int x)
{
if(x<0)x=-x,putchar('-');
if(x>9)write(x/10);
putchar(x%10+48);
return;
}
const int N=5e4+7;
struct edge{int nxt,to;}edge[N];
int hd[N],tot;
inline void addedge(int u,int v)
{
edge[++tot].to=v;
edge[tot].nxt=hd[u];
hd[u]=tot;
}
int tim,dfn[N],low[N],bel[N],cnt,M;
vector<int>kd[N],ld[N];
//vector<vector<int>>kd,ld;
priority_queue<int,vector<int>,less<int>>val[N];
inline void Tarjan(int x,int fa)
{
dfn[x]=low[x]=++tim;
kd[x].push_back(x);
for(int i=hd[x];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(v==fa)continue;
if(!low[v])
{
Tarjan(v,x);
for(auto s:kd[v])kd[x].emplace_back(s);
}
low[x]=min(low[x],low[v]);
}
return;
}
inline bool found(int x,int fa,int pos)
{
bool fg=0;
for(auto g:kd[x])
{
if(g==fa)continue;
if(g==pos)return true;
fg|=found(g,x,pos);
}
return fg;
}
bool outl=0;
inline void dfs(int x,int fa,int pos,int&v,int&p)
{
for(auto g:kd[x])
{
if(g==pos)
{
int k;
if(val[g].empty())k=-1;
else k=val[g].top();
if(k>v)v=k,p=g;
outl=1;
return;
}
if(!found(g,x,pos))continue;
int k;
if(val[g].empty())k=-1;
else k=val[g].top();
if(k>v)v=k,p=g;
dfs(g,x,pos,v,p);
if(outl)return;
}
}
int main()
{
// freopen("visit.in","r",stdin);
// freopen("visit.out","w",stdout);
int n=read(),m=read(),q=read();M=n;
// kd.resize(n),ld.resize(n);
for(int i=1;i<=m;++i)
{
int u=read(),v=read();
addedge(u,v);
addedge(v,u);
ld[u].emplace_back(v);
ld[v].emplace_back(u);
}
Tarjan(1,0);
for(int i=1;i<=n;++i)
if(dfn[i]==low[i])
{
++cnt;
for(auto s:kd[i])bel[s]=cnt;
}
for(int i=1;i<=n;++i)kd[i].clear();
// kd.resize(cnt);
for(int i=1;i<=n;++i)for(auto s:ld[i])if(s^bel[i])kd[bel[i]].emplace_back(bel[s]);
for(int i=1;i<=cnt;++i)
{
sort(kd[i].begin(),kd[i].end());
kd[i].erase(unique(kd[i].begin(),kd[i].end()),kd[i].end());
}
while(q--)
{
int op=read();
if(op==1)
{
int u=read(),w=read();
val[bel[u]].push(w);
}
if(op==2)
{
int s=read(),t=read();
if(bel[s]==bel[t])
{
if(val[bel[s]].empty()){puts("-1");continue;}
int v=val[bel[s]].top();
val[bel[s]].pop();
write(v),puts("");
continue;
}
else
{
int v,x;
if(val[bel[s]].empty())v=-1;
else v=val[bel[s]].top();
x=bel[s];
outl=0;
dfs(bel[s],0,bel[t],v,x);
write(v),puts("");
if(!val[x].empty())val[x].pop();
continue;
}
}
}
return 0;
}