제출 #561947

#제출 시각아이디문제언어결과실행 시간메모리
561947tae826팀들 (IOI15_teams)C++17
100 / 100
3749 ms389184 KiB
#include "teams.h"
#include <bits/stdc++.h>
using namespace std;

struct data{
    int s, e;
    bool operator < (const data &r) const {
        if(e == r.e) return s < r.s;
        return e < r.e;
    }
} a[500100];

struct Node {
    int gap;
    Node *lf, *rg;
    Node() {
        gap = 0; lf = rg = NULL;
    }
} *tree[500100];

Node* add(Node* now, int s, int e, int target, int v) {
    if(now == NULL) { now = new Node(); }
    if(s > target || e < target) return now;
    if(s == e) { Node *ret = new Node(); ret->gap = now->gap + 1; return ret; }
    int m = s+e>>1;
    Node* ret = new Node();
    Node* lch = add(now->lf, s, m, target, v);
    Node* rch = add(now->rg, m+1, e, target, v);
    ret->gap = lch->gap + rch->gap; ret->lf = lch; ret->rg = rch;
    return ret;
}

int query(Node* now, int s, int e, int si, int ei){
    if(now == NULL) return 0;
    if(s > ei || e < si) return 0;
    if(s >= si && e <= ei) return now->gap;
    int m = s+e>>1;
    return query(now->lf, s, m, si, ei) + query(now->rg, m+1, e, si, ei);
}

int p[500100], q[500100], num[500100], K[500100], ptr[500100], N;
int Cnt[801][801], qQ[500100];

int Count(int xs, int xe, int ys, int ye) {
    return query(tree[xe], 1, N, ys, ye) - query(tree[xs-1], 1, N, ys, ye);
}

void init(int _N, int A[], int B[]) {
    N = _N;
    int i;
    for(i=1; i<=N; i++) a[i].s = A[i-1], a[i].e = B[i-1];
    sort(a+1, a+N+1);
    for(i=1; i<=N; i++) p[i] = a[i].s, q[i] = a[i].e;
    tree[0] = new Node();
    for(i=1; i<=N; i++) {
        tree[i] = new Node();
        tree[i]->gap = tree[i-1]->gap; tree[i]->lf = tree[i-1]->lf; tree[i]->rg = tree[i-1]->rg;
        tree[i] = add(tree[i], 1, N, p[i], 1);
    }
    for(i=1; i<=N; i++) qQ[i] = lower_bound(q+1, q+N+1, i) - q;
}

int can(int M, int k[]) {
    int i, j;
    for(i=1; i<=M; i++) K[i] = k[i-1];
	sort(K+1, K+M+1);
    for(i=1; i<=M; i++) num[K[i]] = 0;
    for(i=1; i<=M; i++) num[K[i]] += K[i];
    M = unique(K+1, K+M+1) - K - 1;
    int now = 0, ans = 1;
    for(i=1; i<=M; i++) {
        int numHap = 0;
        ptr[i] = qQ[K[i]];
        for(j=1; j<i; j++) {
            if(num[K[j]] == 0) continue;
            int numCnt = Count(ptr[i-1], ptr[i]-1, 1, K[j]) - numHap;
            now -= min(numCnt, num[K[j]]);
            numHap += min(numCnt, num[K[j]]);
            num[K[j]] -= min(numCnt, num[K[j]]);
        }
        now += num[K[i]];
        int cnt = Count(ptr[i], N, 1, K[i]);
        if(cnt < now) ans = 0;
    }
    return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

teams.cpp: In function 'Node* add(Node*, int, int, int, int)':
teams.cpp:25:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   25 |     int m = s+e>>1;
      |             ~^~
teams.cpp: In function 'int query(Node*, int, int, int, int)':
teams.cpp:37:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   37 |     int m = s+e>>1;
      |             ~^~
teams.cpp: In function 'void init(int, int*, int*)':
teams.cpp:60:60: warning: conversion from 'long int' to 'int' may change value [-Wconversion]
   60 |     for(i=1; i<=N; i++) qQ[i] = lower_bound(q+1, q+N+1, i) - q;
      |                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
teams.cpp: In function 'int can(int, int*)':
teams.cpp:69:32: warning: conversion from 'long int' to 'int' may change value [-Wconversion]
   69 |     M = unique(K+1, K+M+1) - K - 1;
      |         ~~~~~~~~~~~~~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...