結果
問題 | No.2325 Skill Tree |
ユーザー |
|
提出日時 | 2023-05-28 15:39:05 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 894 ms / 3,000 ms |
コード長 | 2,270 bytes |
コンパイル時間 | 1,285 ms |
コンパイル使用メモリ | 105,056 KB |
実行使用メモリ | 25,728 KB |
最終ジャッジ日時 | 2024-12-27 07:56:13 |
合計ジャッジ時間 | 23,381 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 36 |
コンパイルメッセージ
main.cpp: In function 'int main()': main.cpp:53:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions] 53 | auto [lev,id]=pq.top(); | ^ main.cpp:75:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions] 75 | for(auto [id,lev]:minlevel){ | ^ main.cpp:83:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions] 83 | for(auto [lev,num]:cnt){ | ^
ソースコード
#include<iostream>#include<set>#include<algorithm>#include<vector>#include<string>#include<set>#include<map>#include<numeric>#include<queue>#include<tuple>#include<cmath>using namespace std;typedef long long ll;const ll INF=1LL<<60;typedef pair<int,int> P;typedef pair<int,P> PP;const ll MOD=998244353;int main(){int N;cin>>N;vector<vector<int>> G(N+1);vector<int> indeg(N+1,0);vector<int> L(N+1),A(N+1);vector<int> requiredlevel(N+1);for(int i=2;i<=N;i++){cin>>L[i]>>A[i];//state[L[i]].emplace_back(A[i],i);G[A[i]].push_back(i);//A[i]からiに辺をはるindeg[i]++;requiredlevel[i]=L[i];}priority_queue<P,vector<P>,greater<P>> pq;for(int to:G[1]){indeg[to]--;if(indeg[to]==0){pq.emplace(requiredlevel[to],to);}}map<int,int> minlevel;vector<bool> islearned(N+1,false);int nowlev=0;while(!pq.empty()){auto [lev,id]=pq.top();pq.pop();if(islearned[id]) continue;if(nowlev<lev){nowlev=lev;}minlevel[id]=nowlev;islearned[id]=true;for(int to:G[id]){indeg[to]--;if(indeg[to]==0 && !islearned[to]){pq.emplace(requiredlevel[to],to);}}}map<int,int> cnt;for(auto [id,lev]:minlevel){cnt[lev]++;//levのレベルでidの技を覚えられる}vector<pair<int,int>> ansq1;ansq1.emplace_back(0,1);int cntsum=1;for(auto [lev,num]:cnt){cntsum+=num;ansq1.emplace_back(lev,cntsum);}int Q;cin>>Q;vector<int> ans(Q);int t,x,y;for(int q=0;q<Q;q++){cin>>t;if(t==1){cin>>x;//レベルxauto it=upper_bound(ansq1.begin(),ansq1.end(),make_pair(x+1,-1));if(it==ansq1.begin()){ans[q]=-1;}else{it--;ans[q]=it->second;}}else{cin>>y;ans[q] =(minlevel.count(y)?minlevel[y]:-1);}}for(auto v:ans){cout<<v<<endl;}}