Submission #1098505

#TimeUsernameProblemLanguageResultExecution timeMemory
1098505simona1230Olympiads (BOI19_olympiads)C++17
0 / 100
2077 ms10588 KiB
#include <bits/stdc++.h> using namespace std; long long n,k,c; long long a[501][32]; vector<long long> v[32]; long long p[32][2048]; long long used[501][2048]; long long forb[501][2048]; struct team { long long id; team() {} team(long long i) { id=i; } bool operator<(const team&t)const { long long sum=0; for(long long j=1; j<=k; j++) { long long curr=v[j][p[j][t.id]]; sum+=a[curr][j]; } long long sum2=0; for(long long j=1; j<=k; j++) { long long curr=v[j][p[j][id]]; sum2+=a[curr][j]; } return sum2<sum; } }; priority_queue<team> q; long long h; bool cmp(long long i1,long long i2) { return a[i1][h]>a[i2][h]; } void read() { cin>>n>>k>>c; for(long long i=1; i<=n; i++) { for(long long j=1; j<=k; j++) { cin>>a[i][j]; v[j].push_back(i); } } for(long long i=1; i<=k; i++) h=i,sort(v[i].begin(),v[i].end(),cmp); for(long long j=1; j<=k; j++) v[j].push_back(0); for(long long i=1; i<=k; i++) for(long long j=n; j>=1; j--) v[i][j]=v[i][j-1]; /*for(long long i=1; i<=k; i++) { for(long long j=1; j<=n; j++) cout<<v[i][j]<<" "; cout<<endl; }*/ } long long comb[501][501]; void prec() { for(long long i=0; i<=n; i++) { for(long long j=0; j<=i; j++) { if(i==0||j==0)comb[i][j]=1; else comb[i][j]=min(c,comb[i-1][j]+comb[i-1][j-1]); //cout<<i<<" "<<j<<" "<<comb[i][j]<<endl; } } } int lvl[20001]; map<set<long long> ,long long> mp; long long num=0; void solve() { num++; for(long long i=1; i<=k; i++) p[i][num]=1,used[v[i][1]][num]=1; q.push(num); while(1) { long long id=q.top().id; q.pop(); long long in=0,lf=0; for(long long i=1; i<=n; i++) if(!used[i][id]) { lf++; } set<long long> s; for(long long i=1; i<=k; i++) s.insert(v[i][p[i][id]]); /*long long hs=1; for(auto it=s.begin();it!=s.end();it++) { long long b=*it; hs*=1000; hs+=b; }*/ mp[s]++; if(mp[s]>1)continue; in=s.size(); c-=comb[lf][k-in]; long long sum=0; for(long long d=1; d<=k; d++) { sum+=a[v[d][p[d][id]]][d]; //cout<<v[d][p[d][id]]<<" "<<d<<endl; } //cout<<sum<<endl; if(c<=0) { cout<<sum<<endl; return; } for(auto it=s.begin(); it!=s.end(); it++) { num++; long long i=*it; forb[i][num]=1; for(long long j=1; j<=n; j++) forb[j][num]=max(forb[j][num],forb[j][id]), used[j][num]=used[j][id]; bool pos=1; for(long long d=1; d<=k; d++) { while(p[d][num]<=n&&forb[v[d][p[d][num]]][num])p[d][num]++; if(p[d][num]>n)pos=0; else used[v[d][p[d][num]]][num]=1; } if(lvl[id]<=2&&pos)lvl[num]=lvl[id]+1,q.push(num); } } } void slow() { vector<long long> ans; if(k==2) { for(long long i=1; i<=n; i++) { for(long long j=i+1; j<=n; j++) { long long sum=0; for(long long d=1; d<=k; d++) sum+=max(a[i][d],a[j][d]); ans.push_back(sum); } } } else { for(long long i=1; i<=n; i++) { long long sum=0; for(long long d=1; d<=k; d++) sum+=a[i][d]; ans.push_back(sum); } } sort(ans.begin(),ans.end()); cout<<ans[ans.size()-c]<<endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); read(); //slow(); prec(); solve(); return 0; } /* 9 2 7 1 4 8 3 10 3 3 2 7 5 6 9 3 7 2 4 9 3 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...