답안 #300318

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
300318 2020-09-17T05:14:14 Z guangxuan 카니발 티켓 (IOI20_tickets) C++14
27 / 100
773 ms 60404 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;
            //printf("%d ",x[i][j]);
		}//puts("");
	}
	int st = -1e9, en =1e9;
	while(st<en){
        int mi = st+(en-st)/2;
        int pos=0,neg=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];
                lv=mi+abs(lv);
                rv=abs(rv);
                if(lv>rv || x[i][r] < 0){
                    neg++;
                    l++;
                }
                else{
                    pos++;
                    r--;
                }
            }
        }
        if(neg<n*k/2)st = mi+1;
        else en = mi;
	}
    long long ans = 0;
	int mi = st;    
    int pos=0,neg=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];
            lv=mi+abs(lv);
            rv=abs(rv);
            if(lv>rv || x[i][r] < 0){
                ans+=abs(x[i][l]);
                neg++;
                l++;
            }
            else{
                ans+=abs(x[i][r]);
                pos++;
                r--;
            }
        }
        storel[i]=l;
        storer[i]=r;
    }
    //printf("pne: %d %d\n",pos,neg);
    //printf("mi: %d \n",mi);
    vector<int> low[n], high[n];
    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];
            lv=mi+abs(lv);
            rv=abs(rv);
            if(lv-1!=rv)break;
            pos++;neg--;
            ans-=abs(x[i][l]);ans+=abs(x[i][r]);
            storel[i]--;storer[i]--;
        }
        for(int j=0;j<storel[i];j++){
            low[i].push_back(j);
        }
        for(int j=m-1;j>storer[i];j--){
            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;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 0 ms 256 KB Output is correct
3 Correct 1 ms 256 KB Output is correct
4 Correct 1 ms 360 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 3 ms 896 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 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 3 ms 512 KB Output is correct
5 Correct 52 ms 2808 KB Output is correct
6 Correct 773 ms 60404 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 288 KB Output is correct
3 Correct 1 ms 256 KB Output is correct
4 Correct 3 ms 512 KB Output is correct
5 Incorrect 29 ms 3072 KB Contestant returned 21533 but the tickets gives a total value of 23467
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Contestant returned 11 but the tickets gives a total value of 13
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 256 KB Contestant returned 11 but the tickets gives a total value of 13
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 256 KB Contestant returned 11 but the tickets gives a total value of 13
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 0 ms 256 KB Output is correct
3 Correct 1 ms 256 KB Output is correct
4 Correct 1 ms 360 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 3 ms 896 KB Output is correct
7 Correct 0 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 3 ms 512 KB Output is correct
11 Correct 52 ms 2808 KB Output is correct
12 Correct 773 ms 60404 KB Output is correct
13 Correct 1 ms 256 KB Output is correct
14 Correct 1 ms 288 KB Output is correct
15 Correct 1 ms 256 KB Output is correct
16 Correct 3 ms 512 KB Output is correct
17 Incorrect 29 ms 3072 KB Contestant returned 21533 but the tickets gives a total value of 23467
18 Halted 0 ms 0 KB -