제출 #835373

#제출 시각아이디문제언어결과실행 시간메모리
835373Liudas친구 (IOI14_friend)C++17
27 / 100
1091 ms14972 KiB
#include <cstdio> #include <cassert> #define __MAXSIZE__ 100002 #include "friend.h" #include <vector> #include <set> #include <algorithm> #include <numeric> #define __MAXSIZE__ 100002 using namespace std; void getmax(int head, int N, vector<vector<int>> &arr, int &m, set<int> been, int score, int conf[]){ if(head == N){ m = max(m, score); return; } set<int> nbeen = been; for(int i : arr[head]){ nbeen.insert(i); } getmax(head + 1, N, arr, m, been, score, conf); if(been.find(head) == been.end()) getmax(head + 1, N, arr, m, nbeen, score + conf[head], conf); } void dfs(int head, int par, vector<vector<int>> &arr, vector<int> &val, vector<int> &bel){ int v = 0; for(int i : arr[head]){ if(i != par){ dfs(i, head, arr, val, bel); v += max(bel[i], val[i]); bel[head] += val[i]; } } val[head] = v; } struct node{ set<int> child; }; int findSample(int n,int confidence[],int host[],int protocol[]){ int N = n; if(n <= 10){ vector<vector<int>> arr(N); for(int i = 1; i < N; i ++){ int h = host[i]; if(protocol[i] == 0){ arr[i].push_back(h); arr[h].push_back(i); } if(protocol[i] == 1){ for(int j : arr[h]){ arr[i].push_back(j); arr[j].push_back(i); } } if(protocol[i] == 2){ arr[i].push_back(h); arr[h].push_back(i); for(int j : arr[h]){ arr[i].push_back(j); arr[j].push_back(i); } } } int m = 0; set<int> brr; getmax(0, N, arr, m, brr, 0, confidence); return m; } else{ if(count(protocol, protocol + n, 1) == n-1){ return accumulate(confidence, confidence + n, 0ll); } else if(count(protocol, protocol + n, 2) == n-1){ return *max_element(confidence, confidence + n); } else if(count(protocol, protocol + n, 0) == n - 1){ vector<vector<int>> arr(N); for(int i = 1; i < N; i ++){ int h = host[i]; if(protocol[i] == 0){ arr[i].push_back(h); arr[h].push_back(i); } } vector<int> val(N), bel(N); for(int i = 0; i < N; i ++){ bel[i] = confidence[i]; } dfs(0, -1, arr, val, bel); return val[0]; } else if(count(protocol, protocol + n, 0) + count(protocol, protocol + n, 1) == n - 1){ vector<node> brr(N); for(int i = 1; i < N; i ++){ int h = host[i]; if(protocol[i] == 0){ brr[i].child.insert(h); brr[h].child.insert(i); } else{ for(int j : brr[h].child){ brr[i].child.insert(j); } } } int c = 0; for(int i = 0; i < N; i ++){ int mv = 1e9; for(int j = 0; j < N; j ++){ if(brr[j].child.size()){ mv = min(mv, (int)brr[j].child.size()); } } for(int j = 0; j < N; j ++){ if(brr[i].child.size() != mv)continue; for(int k : brr[j].child){ brr[k].child.clear(); } brr[j].child.clear(); c++; break; } } return c; } } }

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

friend.cpp: In function 'int findSample(int, int*, int*, int*)':
friend.cpp:114:44: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  114 |                     if(brr[i].child.size() != mv)continue;
      |                        ~~~~~~~~~~~~~~~~~~~~^~~~~
friend.cpp:126:1: warning: control reaches end of non-void function [-Wreturn-type]
  126 | }
      | ^
#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...