Submission #569613

#TimeUsernameProblemLanguageResultExecution timeMemory
569613CSQ31Teams (IOI15_teams)C++17
77 / 100
4098 ms294956 KiB
#pragma GCC optimize("Ofast") #include "teams.h" #include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; #define fi first #define se second const int MAXN = 5e5+5; struct node{ int x,lf = -1,rg = -1; node(){} }; node T[MAXN*40]; int ccnt = 0; void pull(int v){ T[v].x = 0; if(T[v].lf!=-1)T[v].x+=T[T[v].lf].x; if(T[v].rg!=-1)T[v].x+=T[T[v].rg].x; } int copy(int v){ T[++ccnt] = T[v]; return ccnt; } int add(int v,int l,int r,int pos,int x){ int me = copy(v); if(l==r){ T[me].x+=x; return me; } int tm = (l+r)/2; if(pos<=tm){ if(T[v].lf == -1)T[v].lf = ++ccnt; T[me].lf = add(T[v].lf,l,tm,pos,x); }else{ if(T[v].rg == -1)T[v].rg = ++ccnt; T[me].rg = add(T[v].rg,tm+1,r,pos,x); } pull(me); return me; } int query(int v,int l,int r,int tl,int tr){ if(l<=tl && tr<=r)return T[v].x; int tm = (tl+tr)/2; if(r<=tm)return T[v].lf == -1?0:query(T[v].lf,l,r,tl,tm); if(l >tm)return T[v].rg == -1?0:query(T[v].rg,l,r,tm+1,tr); int res = 0; res += T[v].lf == -1?0:query(T[v].lf,l,tm,tl,tm); res += T[v].rg == -1?0:query(T[v].rg,tm+1,r,tm+1,tr); return res; } vector<int>seg; int n; void init(int N, int A[], int B[]) { n = N; seg.push_back(0); vector<map<int,int>>cnt(n+1); for(int i=0;i<n;i++)cnt[A[i]][B[i]]++; for(int i=1;i<=n;i++){ seg.push_back(copy(seg.back())); for(auto x:cnt[i]){ //cout<<i<<" "<<x.fi<<" "<<x.se<<'\n'; seg.back() = add(seg.back(),1,n,x.fi,x.se); } } } int can(int m, int K[]) { int sum = 0; map<int,int>cnt; for(int i=0;i<m;i++){ sum+=K[i]; cnt[K[i]]++; if(sum>n)return 0; } vector<pii>a; for(auto x:cnt)a.push_back(x); a.push_back({n+1,0}); int s = a.size(); vector<int>need(s,0); vector<int>have(s,0); for(int i=0;i<s;i++)need[i] = a[i].fi * a[i].se; for(int i=0;i<s;i++){ int l = 0,r = a[i].fi; if(i)l = a[i-1].fi; for(int j=i;j+1<s;j++){ int L = a[j].fi; int R = a[j+1].fi-1; have[j]+=query(seg[r],L,R,1,n); have[j]-=query(seg[l],L,R,1,n); } for(int j=i;j<s;j++){ if(!need[i])break; if(have[j]){ int tmp = min(have[j],need[i]); need[i]-=tmp; have[j]-=tmp; } } } for(int x:need){ if(x)return 0; } return 1; }

Compilation message (stderr)

teams.cpp: In function 'int can(int, int*)':
teams.cpp:78:16: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   78 |  int s = a.size();
      |          ~~~~~~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...