Submission #502144

#TimeUsernameProblemLanguageResultExecution timeMemory
502144MilosMilutinovicTeams (IOI15_teams)C++14
100 / 100
3285 ms155880 KiB
#include "teams.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define ll long long const int N=500050; const int M=40*N; //namespace ST{ // int root,ls[M],rs[M],st[M],tsz; // void Set(int&c,int ss,int se,int qs,int qe,int x){ // if(!c)c=++tsz; // if(ss>qe||se<qs)return; // if(qs<=ss&&se<=qe){st[c]=x;return;} // int mid=ss+se>>1; // Set(ls[c],ss,mid,qs,qe,x); // Set(rs[c],mid+1,se,qs,qe,x); // } // int Get(int c,int ss,int se,int qi){ // if(ss==se)return st[c]; // int mid=ss+se>>1; // if(qi<=mid)return max(st[c],Get(ls[c],ss,mid,qi)); // else return max(st[c],Get(rs[c],mid+1,se,qi)); // } //} int n,ls[M],rs[M],st[M],root[N],tsz; void Set(int&c,int p,int ss,int se,int qi,int x){ c=++tsz;ls[c]=ls[p];rs[c]=rs[p];st[c]=st[p]+x; if(ss==se)return; int mid=ss+se>>1; if(qi<=mid)Set(ls[c],ls[p],ss,mid,qi,x); else Set(rs[c],rs[p],mid+1,se,qi,x); } int Get(int c,int p,int ss,int se,int qs,int qe){ if(qs>qe||ss>qe||se<qs)return 0; if(qs<=ss&&se<=qe)return st[c]-st[p]; int mid=ss+se>>1; return Get(ls[c],ls[p],ss,mid,qs,qe)+Get(rs[c],rs[p],mid+1,se,qs,qe); } vector<int> Qs[N]; void init(int N,int A[],int B[]) { n=N; for(int i=0;i<n;i++)Qs[A[i]].pb(B[i]); for(int i=1;i<=n;i++){ root[i]=root[i-1]; for(int x:Qs[i])Set(root[i],root[i],1,n,x,1); } } int cnt[N]; int can(int M,int K[]) { ll s=0; for(int i=0;i<M;i++)s+=K[i]; if(s>n)return 0; vector<int> val; for(int i=0;i<M;i++)val.pb(K[i]),cnt[K[i]]++; sort(val.begin(),val.end()); val.erase(unique(val.begin(),val.end()),val.end()); int sz=val.size(),nroot=++tsz; vector<ll> rem(sz); for(int i=0;i<sz;i++){ int v=val[i]; ll need=(ll)v*cnt[v]; for(int j=i;j<sz;j++){ int nxt=(j==sz-1?n:val[j+1]-1); ll x=min(need,Get(root[v],nroot,1,n,val[j],nxt)-rem[j]); need-=x; rem[j]+=x; if(need==0)break; //Set(nroot,1,n,val[j],); } if(need>0){ for(int x:val)cnt[x]=0; return 0; } } for(int x:val)cnt[x]=0; return 1; }

Compilation message (stderr)

teams.cpp: In function 'void Set(int&, int, int, int, int, int)':
teams.cpp:32:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   32 |  int mid=ss+se>>1;
      |          ~~^~~
teams.cpp: In function 'int Get(int, int, int, int, int, int)':
teams.cpp:39:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   39 |  int mid=ss+se>>1;
      |          ~~^~~
teams.cpp: In function 'void init(int, int*, int*)':
teams.cpp:44:15: warning: declaration of 'N' shadows a global declaration [-Wshadow]
   44 | void init(int N,int A[],int B[]) {
      |           ~~~~^
teams.cpp:7:11: note: shadowed declaration is here
    7 | const int N=500050;
      |           ^
teams.cpp: In function 'int can(int, int*)':
teams.cpp:54:13: warning: declaration of 'M' shadows a global declaration [-Wshadow]
   54 | int can(int M,int K[]) {
      |         ~~~~^
teams.cpp:8:11: note: shadowed declaration is here
    8 | const int M=40*N;
      |           ^
teams.cpp:62:17: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   62 |  int sz=val.size(),nroot=++tsz;
      |         ~~~~~~~~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...