Submission #300291

# Submission time Handle Problem Language Result Execution time Memory
300291 2020-09-17T04:27:15 Z guangxuan Carnival Tickets (IOI20_tickets) C++14
41 / 100
1267 ms 75316 KB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;

long long find_maximum(int k, std::vector<std::vector<int>> x) {
	int n = x.size();
	int m = x[0].size();
	int all_x[n*m];
	for (int i = 0; i < n; i++) {
		for(int j=0;j<m;j++){
			all_x[i*m+j] = x[i][j];
		}
	}
	nth_element(all_x,all_x+n*m/2,all_x+n*m);
	int med = all_x[n*m/2];
	for (int i = 0; i < n; i++) {
		for(int j=0;j<m;j++){
			x[i][j] -= med;
		}
	}
	int st = -1e9, en =1e9;
	while(st<en){
        int mi = st+(en-st)/2;
        int pos=0,neg=0,eq=0;
        for(int i=0;i<n;i++){
            int l = 0, r = m-1;
            for(int iter=0;iter<k;iter++){
                int lv = x[i][l], rv = x[i][r];
                if(lv<0)lv=mi+abs(lv);
                if(rv<0)rv=mi+abs(rv);
                if(lv>rv){
                    if(x[i][l]>0)pos++;
                    else if(x[i][l]<0)neg++;
                    else eq++;
                    l++;
                }
                else{
                    if(x[i][r]>0)pos++;
					else if(x[i][r]<0)neg++;
					else eq++;
                    r--;
                }
            }
        }
        if(neg+eq<n*k/2)st = mi+1;
        else en = mi;
	}
    long long ans = 0;
	int mi = st;    
    int pos=0,neg=0,eq=0;
    int storel[n],storer[n];
    for(int i=0;i<n;i++){
        int l = 0, r = m-1;
        for(int iter=0;iter<k;iter++){
            int lv = x[i][l], rv = x[i][r];
            if(lv<0)lv=mi+abs(lv);
            if(rv<0)rv=mi+abs(rv);
            if(lv>rv){
                ans+=abs(x[i][l]);
                if(x[i][l]>0)pos++;
                else if(x[i][l]<0)neg++;
                else eq++;
                l++;
            }
            else{
                ans+=abs(x[i][r]);
                if(x[i][r]>0)pos++;
                else if(x[i][r]<0)neg++;
                else eq++;
                r--;
            }
        }
        storel[i]=l;
        storer[i]=r;
    }
    vector<int> low[n], high[n];
    int eqtoneg = 0;
    for(int i=0;i<n;i++){
        while((storel[i]!=0) && neg>n*k/2){
            int l = storel[i]-1, r = storer[i];
            int lv = x[i][l], rv = x[i][r];
            if(lv>=0||rv<0)break;
            lv=mi+abs(lv);
            if(lv-1!=rv)break;
            if(x[i][l]>0)pos--;
            else if(x[i][l]<0)neg--;
            else eq--;
            if(x[i][r]>0)pos++;
            else if(x[i][r]<0)neg++;
            else eq++;
            ans-=abs(x[i][l]);ans+=abs(x[i][r]);
            storel[i]--;storer[i]--;
        }
        for(int j=0;j<storel[i];j++){
            if(x[i][j]<0)low[i].push_back(j);
            else if(x[i][j]>0)high[i].push_back(j);
            else{
                if(eqtoneg<n*k/2-neg)low[i].push_back(j),eqtoneg++;
                else high[i].push_back(j);
            }
        }
        for(int j=m-1;j>storer[i];j--){
            if(x[i][j]<0)low[i].push_back(j);
            else if(x[i][j]>0)high[i].push_back(j);
            else{
                if(eqtoneg<n*k/2-neg)low[i].push_back(j),eqtoneg++;
                else high[i].push_back(j);
            }
        }
    }
	std::vector<std::vector<int>> answer(n,vector<int>(m,-1));
    pair<int,int> diff2id[n];
    /*for(int i=0;i<n;i++){
        printf("%d %d\n",storel[i],storer[i]);
        printf("lo: ");
        for(int j:low[i])printf("%d ",j);
        printf("high: ");
        for(int j:high[i])printf("%d ",j);
        puts("");
    }*/
    for(int r=0;r<k;r++){
        for(int i=0;i<n;i++)diff2id[i] = make_pair(high[i].size()-low[i].size(),i);
        sort(diff2id,diff2id+n);
        for(int i=0;i<n;i++){
            if(i<n/2){
                int x = diff2id[i].second;
                answer[x][low[x].back()] = r;
                low[x].pop_back();
            }
            else{
                int x = diff2id[i].second;
                answer[x][high[x].back()] = r;
                high[x].pop_back();
            }
        }
    }
    
	allocate_tickets(answer);
	return ans;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 256 KB Output is correct
3 Correct 1 ms 256 KB Output is correct
4 Correct 1 ms 288 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 2 ms 896 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 256 KB Output is correct
3 Correct 1 ms 256 KB Output is correct
4 Correct 4 ms 512 KB Output is correct
5 Correct 46 ms 2808 KB Output is correct
6 Correct 1038 ms 60408 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 256 KB Contestant returned 2 while correct return value is 6.
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 256 KB Output is correct
3 Correct 0 ms 256 KB Output is correct
4 Correct 4 ms 512 KB Output is correct
5 Correct 45 ms 3436 KB Output is correct
6 Correct 10 ms 768 KB Output is correct
7 Correct 10 ms 1152 KB Output is correct
8 Correct 1161 ms 75240 KB Output is correct
9 Correct 1099 ms 70928 KB Output is correct
10 Correct 1267 ms 70184 KB Output is correct
11 Correct 1248 ms 75316 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 3 ms 512 KB Output is correct
3 Correct 3 ms 512 KB Output is correct
4 Correct 3 ms 512 KB Output is correct
5 Correct 3 ms 512 KB Output is correct
6 Correct 5 ms 512 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Incorrect 1 ms 384 KB Contestant returned 160988334890 while correct return value is 160993200494.
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 3 ms 512 KB Output is correct
3 Correct 3 ms 512 KB Output is correct
4 Correct 3 ms 512 KB Output is correct
5 Correct 3 ms 512 KB Output is correct
6 Correct 5 ms 512 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Incorrect 1 ms 384 KB Contestant returned 160988334890 while correct return value is 160993200494.
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 256 KB Output is correct
3 Correct 1 ms 256 KB Output is correct
4 Correct 1 ms 288 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 2 ms 896 KB Output is correct
7 Correct 1 ms 256 KB Output is correct
8 Correct 1 ms 256 KB Output is correct
9 Correct 1 ms 256 KB Output is correct
10 Correct 4 ms 512 KB Output is correct
11 Correct 46 ms 2808 KB Output is correct
12 Correct 1038 ms 60408 KB Output is correct
13 Incorrect 0 ms 256 KB Contestant returned 2 while correct return value is 6.
14 Halted 0 ms 0 KB -