Submission #287733

#TimeUsernameProblemLanguageResultExecution timeMemory
287733b00n0rpTeams (IOI15_teams)C++17
34 / 100
4067 ms193016 KiB
#pragma GCC optimize("Ofast,unroll-loops") #include "teams.h" #include<bits/stdc++.h> using namespace std; #define pii pair<int,int> #define F first #define S second #define pb push_back const int MAXN = 500005; const int LIM = 120; const int LG = 30; int n; pii a[MAXN]; int dp[MAXN]; int root[MAXN]; int SZ = 0; struct node{ int lft,rgt,val; node(){ lft = -1; rgt = -1; val = 0; } } seg[LG*MAXN]; int build(int l,int r){ int ind = ++SZ; if(l == r) return ind; int mid = (l+r)/2; seg[ind].lft = build(l,mid); seg[ind].rgt = build(mid+1,r); return ind; } int update(int prev,int l,int r,int pos){ int ind = ++SZ; if(l == r){ seg[ind].val = seg[prev].val+1; return ind; } int mid = (l+r)/2; seg[ind] = seg[prev]; seg[ind].val++; if(pos <= mid) seg[ind].lft = update(seg[prev].lft,l,mid,pos); else seg[ind].rgt = update(seg[prev].rgt,mid+1,r,pos); return ind; } int query(int ind,int l,int r,int pos){ if(r < pos) return 0; if(l >= pos) return seg[ind].val; int mid = (l+r)/2; return query(seg[ind].lft,l,mid,pos)+query(seg[ind].rgt,mid+1,r,pos); } void init(int N, int A[], int B[]){ n = N; for(int i = 0; i < n; i ++){ a[i] = {A[i],B[i]}; } sort(a,a+n); root[0] = build(1,n); for(int i = 1; i <= n; i++){ root[i] = update(root[i-1],1,n,a[i-1].S); } assert(((double)clock() / CLOCKS_PER_SEC) < 2); } int can(int M, int K[]) { sort(K,K+M); if(M > 500){ priority_queue<int,vector<int>,greater<int> > pq; int cur = 0; for(int i = 0; i < M; i ++){ while(cur < n and a[cur].F <= K[i]){ pq.push(a[cur].S); cur++; } int cnt = 0; while(cnt < K[i] and (!pq.empty())){ int x = pq.top(); pq.pop(); if(x >= K[i]) cnt++; } if(cnt < K[i]) return 0; } return 1; } else{ dp[0] = 0; for(int i = 1; i <= M; i ++){ dp[i] = n+1; for(int j = 0; j < i; j ++){ int ind1 = (j?(lower_bound(a,a+n,make_pair(K[j-1]+1,-1))-a):0); int ind2 = (lower_bound(a,a+n,make_pair(K[i-1]+1,-1))-a); dp[i] = min(dp[i],dp[j]-K[i-1]+query(root[ind2],1,n,K[i-1])-query(root[ind1],1,n,K[i-1])); } if(dp[i] < 0) return 0; } return 1; } }

Compilation message (stderr)

teams.cpp: In function 'int can(int, int*)':
teams.cpp:106:18: warning: conversion from 'long int' to 'int' may change value [-Wconversion]
  106 |     int ind1 = (j?(lower_bound(a,a+n,make_pair(K[j-1]+1,-1))-a):0);
      |                ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
teams.cpp:107:58: warning: conversion from 'long int' to 'int' may change value [-Wconversion]
  107 |     int ind2 = (lower_bound(a,a+n,make_pair(K[i-1]+1,-1))-a);
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...