제출 #850399

#제출 시각아이디문제언어결과실행 시간메모리
850399Lib봉쇄 시간 (IOI23_closing)C++17
0 / 100
105 ms48484 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; /* Mieu ta thuat toan: B1) BFS de tinh cac gia tri Cost1[i] va Cost2[i] tuong ung voi moi dinh i B2) Phan loai cac dinh dua theo Cost1[i] va Cost2[i]: - Type[i]=0 neu i la 1 dinh binh thuong (0 thuoc 2 loai con lai) - Type[i]=1 neu i la 1 dinh dac biet (Co Cost1[i]>Cost2[i] va Cost2[i]<DistX[Y]) - Type[i]=2 neu i la 1 dinh thuoc duong di tu X den Y B3) Xu li 2 truong hop: - P1: Tat ca cac dinh deu chi duoc nang cap len Lv1, 2 cay khong giao nhau: Bu code subtask 1 - P2: Ton tai it nhat 1 dinh loai 2: Tao ra 3 cai priority queue: + pq1: Dung de luu cac gia tri loai 0 va cac lan nang cap tu lv1 len lv2 cua cac dinh loai 2 + pq2: Dung de luu cac gia tri loai 1: Day nguyen ca cap -(Cost1[i]+Cost2[i]) vao trong pq + pq3: Dung de luu phan tu duy nhat duoc nang cap len Lv1 thuoc loai 1 (neu co) + pq4 ton tai de do phai pop sau khi ket thuc giai doan 1 (cam on BTC vi da cho code nhin thoang hon + Tham lam tren phan tu top cua pq1 va pq2: So sanh theo Cost Efficientcy */ long long Type[200003]; long long Check[200003]; long long BFSCheck[200003]; long long Cost1[200003]; long long Cost2[200003]; long long CPrev[200003]; long long DistX[200003]; long long DistY[200003]; long long check[200003]; long long N,X,Y,K,n,ans1,ans2; struct edge{ int first; long long second; }; vector <edge> VTemp; vector <vector <edge> > adj; vector <int> XYPath; priority_queue <pair <long long,int> > pq1,pq2,pq3; priority_queue <long long> pq4; int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { int n=N; int x=X; int y=Y; long long k=K; int q,s,e; long long tans,Budget,len; vector <int> CList; int cur,cur2; int t; long long t2; pair <long long,int> tpos; while(!pq1.empty()){ pq1.pop(); } while(!pq2.empty()){ pq2.pop(); } while(!pq3.empty()){ pq3.pop(); } while(!pq4.empty()){ pq4.pop(); } XYPath.clear(); cin>>N>>X>>Y>>K; adj.clear(); n=N; for(int i=0;i<=n+1;i++){ adj.push_back(VTemp); check[i]=0; Cost1[i]=0; Cost2[i]=0; DistX[i]=0; DistY[i]=0; Type[i]=0; } ans1=0; ans2=0; for(int i=1;i<n;i++){ cin>>s>>e>>len; adj[s].push_back({e,len}); adj[e].push_back({s,len}); } //BFS tu X CList.clear(); cur=0; cur2=0; for(int i=0;i<=n+1;i++){ BFSCheck[i]=0; CPrev[i]=0; } CList.push_back(X); BFSCheck[X]=1; DistX[X]=0; CPrev[X]=-1; while(cur<CList.size()){ t=CList[cur]; for(int i=0;i<adj[t].size();i++){ if(BFSCheck[adj[t][i].first]==0){ BFSCheck[adj[t][i].first]=1; DistX[adj[t][i].first]=DistX[t]+adj[t][i].second; CPrev[adj[t][i].first]=t; CList.push_back(adj[t][i].first); if(adj[t][i].first==Y){ XYPath.push_back(Y); cur2=Y; while(CPrev[cur2]>=0){ cur2=CPrev[cur2]; XYPath.push_back(cur2); } } } } cur++; } //BFS tu Y CList.clear(); cur=0; cur2=0; for(int i=0;i<=n+1;i++){ BFSCheck[i]=0; CPrev[i]=0; } CList.push_back(Y); BFSCheck[Y]=1; DistY[Y]=0; while(cur<CList.size()){ t=CList[cur]; for(int i=0;i<adj[t].size();i++){ if(BFSCheck[adj[t][i].first]==0){ BFSCheck[adj[t][i].first]=1; DistY[adj[t][i].first]=DistY[t]+adj[t][i].second; CList.push_back(adj[t][i].first); } } cur++; } for(int i=0;i<n;i++){ Cost1[i]=min(DistX[i],DistY[i]); Cost2[i]=max(DistX[i],DistY[i])-Cost1[i]; if(Cost2[i]<Cost1[i]){ Type[i]=1; } } for(int i=0;i<XYPath.size();i++){ Type[XYPath[i]]=2; } //Phase 1: Chi nang cap len loai 1 for(int i=0;i<n;i++){ pq4.push(-Cost1[i]); //cout<<Cost1[i]<<" "; // cout<<Type[i]<<" "; } Budget=K; while(Budget>0&&!pq4.empty()){ Budget+=pq4.top(); if(Budget>=0){ ans1++; pq4.pop(); } } //Phase 2: Ton tai it nhat 1 dinh duoc nang cap len loai 2 Budget=K; // cout<<Budget<<" "; for(int i=0;i<XYPath.size();i++){ Budget-=Cost1[XYPath[i]]; check[XYPath[i]]=1; ans2++; } tans=ans1; //cout<<Budget<<" "; if(Budget>0){ for(int i=0;i<n;i++){ if(Type[i]==0){ pq1.push({-Cost1[i],i}); pq1.push({-Cost2[i],i}); }else if(Type[i]==1){ pq2.push({-(Cost1[i]+Cost2[i]),i}); pq3.push({-Cost1[i],i}); }else{ pq1.push({-Cost2[i],i}); } } //cout<<pq2.size()<<" "; while(Budget>0&&!pq2.empty()){ if(pq1.size() <=1){ Budget+=pq2.top().first; if(Budget>=0){ check[pq2.top().second]=2; pq2.pop(); ans2+=2; goto end2; }else{ Budget-=pq2.top().first; } } tpos=pq1.top(); pq1.pop(); //cout<<tpos.first<<" "; if(pq1.top().first+tpos.first> pq2.top().first){ Budget+=(tpos.first); if(Budget>=0){ ans2+=1; // cout<<Budget<<" "; check[tpos.second]++; }else{ Budget-=tpos.first; } }else{ // cout<<Budget<<" "; Budget+=pq2.top().first; if(Budget>=0){ pq1.push(tpos); ans2+=2; check[pq2.top().second]=2; pq2.pop(); }else{ Budget-=pq2.top().first; } } end2:; // cout<<ans2<<" "; } while(!pq1.empty()&&Budget>0){ Budget+=pq1.top().first; if(Budget>=0){ ans2++; check[pq1.top().second]++; pq1.pop(); }else{ Budget-=pq1.top().first; } } while(!pq3.empty()&&check[pq3.top().second]!=0){ pq3.pop(); } //cout<<Budget<<" "<<pq3.top().first<<"\n"; if(!pq3.empty()&&pq3.top().first+Budget>=0){ ans2++; check[pq3.top().second]=1; } end:; tans=max(ans1,ans2); } return tans; }

컴파일 시 표준 에러 (stderr) 메시지

closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:96:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   96 |   while(cur<CList.size()){
      |         ~~~^~~~~~~~~~~~~
closing.cpp:98:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |    for(int i=0;i<adj[t].size();i++){
      |                ~^~~~~~~~~~~~~~
closing.cpp:127:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |   while(cur<CList.size()){
      |         ~~~^~~~~~~~~~~~~
closing.cpp:129:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  129 |    for(int i=0;i<adj[t].size();i++){
      |                ~^~~~~~~~~~~~~~
closing.cpp:145:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 |   for(int i=0;i<XYPath.size();i++){
      |               ~^~~~~~~~~~~~~~
closing.cpp:165:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  165 |   for(int i=0;i<XYPath.size();i++){
      |               ~^~~~~~~~~~~~~~
closing.cpp:42:6: warning: unused variable 'x' [-Wunused-variable]
   42 |  int x=X;
      |      ^
closing.cpp:43:6: warning: unused variable 'y' [-Wunused-variable]
   43 |  int y=Y;
      |      ^
closing.cpp:44:12: warning: unused variable 'k' [-Wunused-variable]
   44 |  long long k=K;
      |            ^
closing.cpp:45:6: warning: unused variable 'q' [-Wunused-variable]
   45 |  int q,s,e;
      |      ^
closing.cpp:50:12: warning: unused variable 't2' [-Wunused-variable]
   50 |  long long t2;
      |            ^~
closing.cpp:242:4: warning: label 'end' defined but not used [-Wunused-label]
  242 |    end:;
      |    ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...