Submission #377401

#TimeUsernameProblemLanguageResultExecution timeMemory
377401ThistleCarnival Tickets (IOI20_tickets)C++14
41 / 100
711 ms57708 KiB
#include "tickets.h" #include <vector> #include<algorithm> #include<set> #include<iostream> #include<random> #include<queue> #include<cassert> using namespace std; using ll=long long; using H=pair<ll, ll>; #define vec vector #define vi vec<ll> #define pb push_back #define all(a) (a).begin(),(a).end() #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++) #define rep(i,n) rng((i),0,(n)) #define siz(a) int((a).size()) #define fs first #define sc second constexpr ll inf=1e16; constexpr ll Inf=1e9+1; long long find_maximum(int k, std::vector<std::vector<int>> x) { int n = x.size(); int m = x[0].size(); std::vector<std::vector<int>> answer(n,vec<int>(m,-1)); ll ans=0; if(m==1){ vi v; rep(i,n) v.pb(x[i][0]); sort(all(v)); rep(i,n){ if(i<n/2) ans-=v[i]; else ans+=v[i]; } rep(i,n)rep(j,m) answer[i][j]=0; } else if(k==1){ vec<int> mx(n,-Inf),mn(n,Inf); vec<int>mxi(n,-1),mni(n,-1); rep(i,n)rep(j,m){ if(mx[i]<x[i][j]){ mx[i]=max(mx[i],x[i][j]); mxi[i]=j; } if(mn[i]>x[i][j]){ mn[i]=min(mn[i],x[i][j]); mni[i]=j; } } vec<vi> dp=vec<vi>(n+1,vi(n+1,-inf)); dp[0][0]=0; rep(i,n)rep(j,n+1){ if(dp[i][j]==inf) continue; dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+mx[i]); dp[i+1][j]=max(dp[i+1][j],dp[i][j]-mn[i]); } ans=dp[n][n/2]; ll k=dp[n][n/2]; int c=n/2; for(int i=n-1;i>=0;i--){ if(c>0&&dp[i][c-1]+mx[i]==k){ answer[i][mxi[i]]=0; c--; k=dp[i][c]; } else if(dp[i][c]-mn[i]==k){ answer[i][mni[i]]=0; k=dp[i][c]; } } } else{ priority_queue<H>p; vi one(n,0); rep(i,n)rep(j,m) if(x[i][j]==1) one[i]++; rep(i,n) p.push(H{one[i],i}); vi fst(n,0),lst(n,m-1); rep(iter,k){ vi v; vec<bool>used(n,0); rep(i,n/2){ v.pb(p.top().sc); used[p.top().sc]=1; p.pop(); } int cnt1=0,cnt0=0; rep(i,n){ if(used[i]){ if(one[i]>0) { cnt1++,one[i]--; answer[i][lst[i]--]=iter; } else{ cnt0++; answer[i][fst[i]++]=iter; } } else{ if(m-iter-one[i]>0) { cnt0++; answer[i][fst[i]++]=iter; } else{ cnt1++,one[i]--; answer[i][lst[i]--]=iter; } } } ans+=min(cnt0,cnt1); for(auto g:v) p.push(H{one[g],g}); } } allocate_tickets(answer); return ans; }

Compilation message (stderr)

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:34:3: note: in expansion of macro 'rep'
   34 |   rep(i,n) v.pb(x[i][0]);
      |   ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:36:3: note: in expansion of macro 'rep'
   36 |   rep(i,n){
      |   ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:40:3: note: in expansion of macro 'rep'
   40 |   rep(i,n)rep(j,m) answer[i][j]=0;
      |   ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'j' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:40:11: note: in expansion of macro 'rep'
   40 |   rep(i,n)rep(j,m) answer[i][j]=0;
      |           ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:45:3: note: in expansion of macro 'rep'
   45 |   rep(i,n)rep(j,m){
      |   ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'j' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:45:11: note: in expansion of macro 'rep'
   45 |   rep(i,n)rep(j,m){
      |           ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:57:3: note: in expansion of macro 'rep'
   57 |   rep(i,n)rep(j,n+1){
      |   ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'j' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:57:11: note: in expansion of macro 'rep'
   57 |   rep(i,n)rep(j,n+1){
      |           ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:80:3: note: in expansion of macro 'rep'
   80 |   rep(i,n)rep(j,m) if(x[i][j]==1) one[i]++;
      |   ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'j' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:80:11: note: in expansion of macro 'rep'
   80 |   rep(i,n)rep(j,m) if(x[i][j]==1) one[i]++;
      |           ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:81:3: note: in expansion of macro 'rep'
   81 |   rep(i,n) p.push(H{one[i],i});
      |   ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'iter' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:83:3: note: in expansion of macro 'rep'
   83 |   rep(iter,k){
      |   ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:86:4: note: in expansion of macro 'rep'
   86 |    rep(i,n/2){
      |    ^~~
tickets.cpp:16:28: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   16 | #define rng(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
      |                            ^
tickets.cpp:17:18: note: in expansion of macro 'rng'
   17 | #define rep(i,n) rng((i),0,(n))
      |                  ^~~
tickets.cpp:92:4: note: in expansion of macro 'rep'
   92 |    rep(i,n){
      |    ^~~
#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...