Submission #1132157

#TimeUsernameProblemLanguageResultExecution timeMemory
1132157StefanSebez카니발 티켓 (IOI20_tickets)C++20
14 / 100
664 ms62708 KiB
#include <bits/stdc++.h> #include "tickets.h" using namespace std; #define fi first #define se second #define pb push_back #define ll long long #define ld long double const int N=1550; int a[N][N]; vector<vector<int>>s; int n,m; ll izracunaj(vector<int>a){ sort(a.begin(),a.end()); //for(auto i:a) printf("%i ",i);printf("\n"); ll sum1=0;for(auto i:a) sum1+=i; ll res=1e18,n=a.size(); for(ll i=0,sum=0;i<n;i++){ ll x=sum1-2*sum+a[i]*(2*i-n); //printf("%lld\n",x); res=min(res,x); sum+=a[i]; } return res; } ll Izracunaj(){ int maks=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) maks=max(maks,s[i][j]); vector<int>vrednosti[maks+1]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(s[i][j]!=-1) vrednosti[s[i][j]].pb(a[i][j]); } } ll res=0;for(int i=0;i<=maks;i++) if(!vrednosti[i].empty()) res+=izracunaj(vrednosti[i]); return res; } long long find_maximum(int k, std::vector<std::vector<int>> a1){ n=a1.size(),m=a1[0].size(); for(int i=0;i<n;i++) for(int j=0;j<m;j++) a[i][j]=a1[i][j]; for(int i=0;i<n;i++){ vector<int>temp; for(int j=0;j<m;j++) temp.pb(-1); s.pb(temp); } /*vector<array<int,3>>nesto; for(int i=0;i<n;i++){ int maks=0,ind=-1; for(int j=0;j<m;j++){ if(a[i][j]>maks) maks=a[i][j],ind=j; } nesto.pb({maks,i,ind}); } sort(nesto.begin(),nesto.end()); for(int i=n-1;i>=n/2;i--) s[nesto[i][1]][nesto[i][2]]=0; for(int I=0;I<n/2;I++){ int i=nesto[I][1]; int mn=1e9,ind=-1; for(int j=0;j<m;j++){ if(mn>a[i][j]) mn=a[i][j],ind=j; } s[i][ind]=0; } ll x=Izracunaj();vector<vector<int>>s1=s; for(int i=0;i<n;i++) for(int j=0;j<m;j++) s[i][j]=-1; nesto.clear(); for(int i=0;i<n;i++){ int mn=1e9,ind=-1; for(int j=0;j<m;j++){ if(a[i][j]<mn) mn=a[i][j],ind=j; } nesto.pb({mn,i,ind}); } sort(nesto.begin(),nesto.end()); for(int i=0;i<n/2;i++) s[nesto[i][1]][nesto[i][2]]=0; for(int I=n/2;I<n;I++){ int i=nesto[I][1]; int maks=0,ind=-1; for(int j=0;j<m;j++){ if(maks<a[i][j]) maks=a[i][j],ind=j; } s[i][ind]=0; } if(Izracunaj()<x) s=s1;*/ /*bool izbrisan[n+10]={false}; while(1){ int d=0,maks=0,ind0=-1,mn=1e9,ind1=-1; pair<int,int>ubaci={-1,-1}; for(int i=0;i<n;i++){ if(izbrisan[i]) continue; if(a[i][m-1]-mn>d){ d=a[i][m-1]-mn; ubaci={ind1,i}; } if(maks-a[i][0]>d){ d=maks-a[i][0]; ubaci={i,ind0}; } if(maks<a[i][m-1]) maks=a[i][m-1],ind0=i; if(mn>a[i][0]) mn=a[i][0],ind1=i; } if(ubaci.fi==-1) break; s[ubaci.fi][0]=0; s[ubaci.se][m-1]=0; izbrisan[ubaci.fi]=izbrisan[ubaci.se]=true; }*/ int num[n+10][2],ind[n+10][2]; memset(num,0,sizeof(num)); memset(ind,0,sizeof(ind)); for(int i=0;i<n;i++) ind[i][0]=0,ind[i][1]=m-1; for(int i=0;i<n;i++) for(int j=0;j<m;j++) num[i][a[i][j]]++; set<pair<int,int>>st[2]; for(int i=0;i<n;i++) st[0].insert({num[i][0],i}),st[1].insert({num[i][1],i}); for(int c=0;c<k;c++){ int ct=n;bool was[n+10]={false}; while(ct){ if(st[0].size()&&st[1].size()){ pair<int,int>x=*st[1].rbegin();st[1].erase(x); while(was[x.se]) x=*st[1].rbegin(),st[1].erase(x); num[x.se][1]--; s[x.se][ind[x.se][1]--]=c; was[x.se]=true; x=*st[0].rbegin();st[0].erase(x); while(was[x.se]) x=*st[0].rbegin(),st[0].erase(x); num[x.se][0]--; s[x.se][ind[x.se][0]++]=c; was[x.se]=true; ct-=2; } else if(st[0].empty()){ pair<int,int>x=*st[1].rbegin();st[1].erase(x); while(was[x.se]) x=*st[1].rbegin(),st[1].erase(x); num[x.se][1]--; s[x.se][ind[x.se][1]--]=c; was[x.se]=true; ct--; } else{ pair<int,int>x=*st[0].rbegin();st[0].erase(x); while(was[x.se]) x=*st[0].rbegin(),st[0].erase(x); num[x.se][0]--; s[x.se][ind[x.se][0]++]=c; was[x.se]=true; ct--; } } st[0].clear(),st[1].clear(); for(int i=0;i<n;i++) st[0].insert({num[i][0],i}),st[1].insert({num[i][1],i}); } allocate_tickets(s); return Izracunaj(); }
#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...