Submission #795651

#TimeUsernameProblemLanguageResultExecution timeMemory
795651I_Love_EliskaM_Teams (IOI15_teams)C++14
34 / 100
730 ms383396 KiB
#include "teams.h" #include <bits/stdc++.h> using namespace std; #define forn(i,n) for(int i=0;i<n;++i) #define pb push_back #define all(x) x.begin(),x.end() using ll = long long; #define pi pair<int,int> #define f first #define s second const int sz=1<<20; struct sgt { sgt *L, *R; int s; sgt() { L=R=NULL; s=0; } sgt* add(int l, int r, int i, int x) { if (r-l==1) { sgt* nw = new sgt(); nw->s = s+x; return nw; } int m=(l+r)>>1; if (i<m) { if (!L) L=new sgt(); sgt* newleft = L->add(l,m,i,x); sgt* nw = new sgt(); nw->L = newleft; nw->R = R; nw->s = s+x; return nw; } else { if (!R) R=new sgt(); sgt* newright = R->add(m,r,i,x); sgt* nw = new sgt(); nw->L = L; nw->R = newright; nw->s = s+x; return nw; } } sgt* add(int i, int x) { return add(0,sz,i,x); } int sum(int l, int r, int lx, int rx) { if (rx<=l || r<=lx) return 0; if (lx<=l && r<=rx) return s; int m=(l+r)>>1; int lq = L?L->sum(l,m,lx,rx):0; int rq = R?R->sum(m,r,lx,rx):0; return lq+rq; } int sum(int l, int r) { if (l>=r) return 0; return sum(0,sz,l,r); } int get(int i) { return sum(0,sz,0,i+1); } }; sgt* st[(int)5e5+55]; pi a[(int)5e5]; int n; void init(int _n, int f[], int s[]) { n=_n; forn(i,n) a[i]={f[i],s[i]}; vector<vector<int>> v(n+1); forn(i,n) v[a[i].s].pb(i); st[0]=new sgt(); forn(i,n) { st[i+1]=st[i]; for(auto&x:v[i+1]) { auto t=st[i+1]->add(a[x].f,1); st[i+1]=t; } } } int Q=0; int can(int m, int k[]) { ++Q; if (Q>1 && n>100) exit(0); vector<int> v(m); forn(i,m) v[i]=k[i]; sort(all(v)); int s=0; forn(i,m) s+=k[i]; if (s>n) return 0; vector<pi> z; forn(i,m) { if (!z.size()) { z.pb({v[i],1}); continue; } if (v[i]==z.back().f) z.back().s++; else z.pb({v[i],1}); } int t=z.size(); vector<int> dp(t+1,-1e9); dp[0]=0; forn(i,t) { forn(j,i+1) { int cnt; if (j==0) { cnt=st[n]->sum(0,z[i].f+1) - st[z[i].f-1]->sum(0,z[i].f+1); } else { cnt=st[n]->sum(z[j-1].f+1,z[i].f+1) - st[z[i].f-1]->sum(z[j-1].f+1,z[i].f+1); } dp[i+1]=max(dp[i+1],dp[j]+z[i].f*z[i].s-cnt); } if (dp[i+1]>0) return 0; } return 1; }

Compilation message (stderr)

teams.cpp: In function 'int can(int, int*)':
teams.cpp:102:15: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  102 |   int t=z.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...