제출 #227995

#제출 시각아이디문제언어결과실행 시간메모리
227995urd05친구 (IOI14_friend)C++14
46 / 100
45 ms5240 KiB
#include <bits/stdc++.h> using namespace std; int n; int co[100000]; int ho[100000]; int pro[100000]; int con[10][10]; vector<int> son[1000]; int dp[1000][2]; vector<int> adj[1000]; int ans(int now,int stat) { if (dp[now][stat]!=-1) { return dp[now][stat]; } int ret=0; if (stat==1) { ret+=co[now]; } if (stat==0) { for(int i=0;i<son[now].size();i++) { ret+=max(ans(son[now][i],0),ans(son[now][i],1)); } } else { for(int i=0;i<son[now].size();i++) { ret+=ans(son[now][i],0); } } dp[now][stat]=ret; return ret; } int p[1000]; int find(int a) { if (p[a]<0) { return a; } p[a]=find(p[a]); return p[a]; } void merge(int a,int b) { if (a>b) { swap(a,b); } a=find(a); b=find(b); if (a==b) { return; } p[a]+=p[b]; p[b]=a; } bool visited[1000]; void maketree(int v) { visited[v]=true; for(int i=0;i<adj[v].size();i++) { int next=adj[v][i]; if (!visited[next]) { son[v].push_back(next); maketree(next); } } } int getans(int now,int stat) { if (dp[now][stat]!=-1) { return dp[now][stat]; } int ret=0; if (stat==1) { ret-=p[now]; } if (stat==0) { for(int i=0;i<son[now].size();i++) { ret+=max(getans(son[now][i],0),getans(son[now][i],1)); } } else { for(int i=0;i<son[now].size();i++) { ret+=getans(son[now][i],0); } } dp[now][stat]=ret; return ret; } int findSample(int nn,int conf[],int hos[],int prot[]) { n=nn; for(int i=0;i<n;i++) { co[i]=conf[i]; ho[i]=hos[i]; pro[i]=prot[i]; } if (n<=10) { for(int i=1;i<n;i++) { if (pro[i]==0) { con[ho[i]][i]=1; con[i][ho[i]]=1; } if (pro[i]==1) { for(int j=0;j<n;j++) { if (con[ho[i]][j]==1) { con[i][j]=1; con[j][i]=1; } } } if (pro[i]==2) { for(int j=0;j<n;j++) { if (con[ho[i]][j]==1) { con[i][j]=1; con[j][i]=1; } } con[ho[i]][i]=1; con[i][ho[i]]=1; } } int ret=0; for(int i=0;i<(1<<n);i++) { bool use[10]; memset(use,0,sizeof(use)); for(int j=0;j<n;j++) { if ((i&(1<<j))!=0) { use[j]=true; } } bool flag=true; for(int j=0;j<n;j++) { for(int k=0;k<n;k++) { if (con[k][j]==1&&use[k]&&use[j]) { flag=false; break; } } } if (!flag) { continue; } int val=0; for(int j=0;j<n;j++) { if (use[j]) { val+=co[j]; } } ret=max(ret,val); } return ret; } bool flag=true; for(int i=1;i<n;i++) { if (pro[i]!=pro[1]) { flag=false; } } if (!flag) { memset(p,-1,sizeof(p)); for(int i=1;i<n;i++) { if (pro[i]==1) { merge(ho[i],i); } } for(int i=1;i<n;i++) { if (pro[i]==0) { adj[find(i)].push_back(find(ho[i])); adj[find(ho[i])].push_back(find(i)); } } maketree(0); memset(dp,-1,sizeof(dp)); return max(getans(0,0),getans(0,1)); } if (pro[1]==1) { int ret=0; for(int i=0;i<n;i++) { ret+=co[i]; } return ret; } if (pro[1]==2) { int ret=0; for(int i=0;i<n;i++) { ret=max(ret,co[i]); } return ret; } for(int i=1;i<n;i++) { son[ho[i]].push_back(i); } memset(dp,-1,sizeof(dp)); return max(ans(0,0),ans(0,1)); }

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

friend.cpp: In function 'int ans(int, int)':
friend.cpp:22:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0;i<son[now].size();i++) {
                     ~^~~~~~~~~~~~~~~~
friend.cpp:27:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0;i<son[now].size();i++) {
                     ~^~~~~~~~~~~~~~~~
friend.cpp: In function 'void maketree(int)':
friend.cpp:62:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<adj[v].size();i++) {
                 ~^~~~~~~~~~~~~~
friend.cpp: In function 'int getans(int, int)':
friend.cpp:80:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0;i<son[now].size();i++) {
                     ~^~~~~~~~~~~~~~~~
friend.cpp:85:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0;i<son[now].size();i++) {
                     ~^~~~~~~~~~~~~~~~
#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...