Submission #669867

# Submission time Handle Problem Language Result Execution time Memory
669867 2022-12-07T14:30:16 Z victor_gao Teams (IOI15_teams) C++17
100 / 100
2221 ms 174096 KB
#include <bits/stdc++.h>
#define pii pair<int,int>
#define x first
#define y second
#define MAXN 500005
using namespace std;
pii stud[MAXN];
int n;
struct segtree{
    vector<pii>seg[4*MAXN];
    int out[4*MAXN];
    bool era[4*MAXN];
    int count(int i,int can){
        int p=(upper_bound(seg[i].begin(),seg[i].end(),make_pair(can,2))-seg[i].begin())-out[i];
        return max(p,0);
    }
    void build(int l,int r,int i){
        era[i]=0; out[i]=0;
        sort(seg[i].begin(),seg[i].end());
        if (l==r)
            return;
        int mid=(l+r)>>1;
        build(l,mid,2*i);
        build(mid+1,r,2*i+1);
    }
    void add(int l,int r,int i,int p,int c){
        if (l==r){
            seg[i].push_back({c,0});
            return;
        }
        int mid=(l+r)>>1;
        if (p<=mid){
            seg[i].push_back({c,0});
            add(l,mid,2*i,p,c);
        } 
        else {
            seg[i].push_back({c,1});
            add(mid+1,r,2*i+1,p,c);
        }
    }
    void push(int i){
        if (era[i]){
            era[2*i]=1; era[2*i+1]=1;
            out[2*i]=0; out[2*i+1]=0;
            era[i]=0;
        }
        if (out[i]!=out[2*i]+out[2*i+1]&&out[i]){
            int val=seg[i][out[i]-1].x;
            out[2*i]+=count(2*i,val-1);
            out[2*i+1]+=count(2*i+1,val-1);
            int last=out[i]-out[2*i]-out[2*i+1];
            int cl=count(2*i,val);
            out[2*i]+=min(cl,last); last-=cl;
            out[2*i+1]+=max(last,0); 
        }
    }
    void init(){ out[1]=0; era[1]=1; }
    int query(int l,int r,int i,int ll,int rr,int can){
        if (ll>rr) return 0;
        if (ll<=l&&rr>=r) return count(i,can);
        int mid=(l+r)>>1; push(i);
        if (rr<=mid) return query(l,mid,2*i,ll,rr,can);
        else if (ll>mid) return query(mid+1,r,2*i+1,ll,rr,can);
        else return query(l,mid,2*i,ll,rr,can)+query(mid+1,r,2*i+1,ll,rr,can);
    }
    void queryp(int l,int r,int i,int can,int need){
        if (l==r){
            out[i]+=need;
            return;
        }
        int mid=(l+r)>>1; push(i);
        int cl=count(2*i,can);
        if (cl>=need) queryp(l,mid,2*i,can,need);
        else {
            out[2*i]+=cl;
            queryp(mid+1,r,2*i+1,can,need-cl);
        }
        out[i]=out[2*i]+out[2*i+1];
    }
}seg;
void init(int N,int A[],int B[]){
    n=N;
    for (int i=1;i<=N;i++)
        stud[i]={A[i-1],B[i-1]};
    for (int i=1;i<=n;i++){
        seg.add(1,n,1,stud[i].y,stud[i].x);
    }
    seg.build(1,n,1);
}
bool can(int M,int K[]){
    sort(K,K+M);
    seg.init();
    for (int i=0;i<M;i++){
        int qus=K[i]+seg.query(1,n,1,1,K[i]-1,K[i]);
        if (qus>seg.count(1,K[i])) return 0;
        seg.queryp(1,n,1,K[i],qus);
    }
    return 1;
}

Compilation message

teams.cpp: In member function 'int segtree::count(int, int)':
teams.cpp:14:89: warning: conversion from '__gnu_cxx::__normal_iterator<std::pair<int, int>*, std::vector<std::pair<int, int> > >::difference_type' {aka 'long int'} to 'int' may change value [-Wconversion]
   14 |         int p=(upper_bound(seg[i].begin(),seg[i].end(),make_pair(can,2))-seg[i].begin())-out[i];
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 23 ms 47188 KB Output is correct
2 Correct 23 ms 47260 KB Output is correct
3 Correct 23 ms 47292 KB Output is correct
4 Correct 23 ms 47208 KB Output is correct
5 Correct 24 ms 47188 KB Output is correct
6 Correct 23 ms 47236 KB Output is correct
7 Correct 24 ms 47244 KB Output is correct
8 Correct 25 ms 47188 KB Output is correct
9 Correct 24 ms 47252 KB Output is correct
10 Correct 25 ms 47172 KB Output is correct
11 Correct 24 ms 47268 KB Output is correct
12 Correct 25 ms 47228 KB Output is correct
13 Correct 24 ms 47248 KB Output is correct
14 Correct 25 ms 47188 KB Output is correct
15 Correct 25 ms 47192 KB Output is correct
16 Correct 24 ms 47292 KB Output is correct
17 Correct 25 ms 47188 KB Output is correct
18 Correct 24 ms 47304 KB Output is correct
19 Correct 24 ms 47188 KB Output is correct
20 Correct 24 ms 47188 KB Output is correct
21 Correct 24 ms 47188 KB Output is correct
22 Correct 24 ms 47272 KB Output is correct
23 Correct 25 ms 47248 KB Output is correct
24 Correct 28 ms 47260 KB Output is correct
25 Correct 26 ms 47188 KB Output is correct
26 Correct 24 ms 47272 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 183 ms 70036 KB Output is correct
2 Correct 180 ms 70048 KB Output is correct
3 Correct 183 ms 70092 KB Output is correct
4 Correct 183 ms 70412 KB Output is correct
5 Correct 139 ms 66492 KB Output is correct
6 Correct 138 ms 66520 KB Output is correct
7 Correct 133 ms 66404 KB Output is correct
8 Correct 135 ms 66404 KB Output is correct
9 Correct 97 ms 63848 KB Output is correct
10 Correct 102 ms 63816 KB Output is correct
11 Correct 94 ms 64744 KB Output is correct
12 Correct 95 ms 63820 KB Output is correct
13 Correct 161 ms 64888 KB Output is correct
14 Correct 144 ms 66200 KB Output is correct
15 Correct 165 ms 69964 KB Output is correct
16 Correct 165 ms 69840 KB Output is correct
17 Correct 102 ms 66196 KB Output is correct
18 Correct 107 ms 65968 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 190 ms 70504 KB Output is correct
2 Correct 189 ms 70520 KB Output is correct
3 Correct 405 ms 73524 KB Output is correct
4 Correct 180 ms 70532 KB Output is correct
5 Correct 364 ms 66440 KB Output is correct
6 Correct 330 ms 66320 KB Output is correct
7 Correct 139 ms 66340 KB Output is correct
8 Correct 300 ms 66436 KB Output is correct
9 Correct 99 ms 63852 KB Output is correct
10 Correct 163 ms 63900 KB Output is correct
11 Correct 171 ms 64812 KB Output is correct
12 Correct 237 ms 63816 KB Output is correct
13 Correct 529 ms 65356 KB Output is correct
14 Correct 486 ms 71860 KB Output is correct
15 Correct 243 ms 71432 KB Output is correct
16 Correct 241 ms 71584 KB Output is correct
17 Correct 179 ms 67872 KB Output is correct
18 Correct 178 ms 67336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1152 ms 168224 KB Output is correct
2 Correct 1127 ms 168268 KB Output is correct
3 Correct 1765 ms 174096 KB Output is correct
4 Correct 1118 ms 168276 KB Output is correct
5 Correct 1625 ms 147952 KB Output is correct
6 Correct 1521 ms 148140 KB Output is correct
7 Correct 717 ms 148176 KB Output is correct
8 Correct 1380 ms 148244 KB Output is correct
9 Correct 462 ms 135332 KB Output is correct
10 Correct 598 ms 139312 KB Output is correct
11 Correct 659 ms 139436 KB Output is correct
12 Correct 894 ms 139608 KB Output is correct
13 Correct 2221 ms 143248 KB Output is correct
14 Correct 2161 ms 172252 KB Output is correct
15 Correct 1108 ms 167624 KB Output is correct
16 Correct 1170 ms 169812 KB Output is correct
17 Correct 723 ms 162916 KB Output is correct
18 Correct 716 ms 163952 KB Output is correct