# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
74030 |
2018-08-29T16:09:31 Z |
edisonhello |
Teams (IOI15_teams) |
C++14 |
|
1252 ms |
525312 KB |
// #include"teams.h"
#include<bits/stdc++.h>
#pragma GCC optimize("no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
int root[500005],node[500005*45][3];
int ptr;
inline int gn(int ref=-1){
++ptr;
if(~ref)memcpy(node[ptr],node[ref],3<<2);
else memset(node[ptr],0,3<<2);
return ptr;
}
int n;
pair<int,int> p[500005];
#define mid ((l+r)>>1)
void build(int now,int l,int r){
if(l==r)return;
build(node[now][0]=gn(),l,mid);
build(node[now][1]=gn(),mid+1,r);
}
void modify(int now,int l,int r,int x){
++node[now][2];
if(l==r){ return; }
if(x<=mid)modify(node[now][0]=gn(node[now][0]),l,mid,x);
else modify(node[now][1]=gn(node[now][1]),mid+1,r,x);
}
int query(int nl,int nr,int l,int r,int ql,int qr){
if(r<ql || qr<l)return 0;
// cout<<"query range "<<l<<" to "<<r<<" cur v: "<<nl->v<<" and "<<nr->v<<endl;
if(ql<=l&&r<=qr)return node[nr][2]-node[nl][2];
return query(node[nl][0],node[nr][0],l,mid,ql,qr)+query(node[nl][1],node[nr][1],mid+1,r,ql,qr);
}
void init(int _n,int _a[],int _b[]){
n=_n;
for(int i=0;i<n;++i)p[i+1]={_a[i],_b[i]};
sort(p+1,p+n+1);
build(root[0]=gn(),1,n);
int ptr=1;
for(int i=1;i<=n;++i){
root[i]=gn(root[i-1]);
while(ptr<=n && p[ptr].first<=i)modify(root[i]=gn(root[i]),1,n,p[ptr].second),++ptr;
}
}
namespace naive{
struct node{
int l,r,sz,pri,val;
int lz();
int rz();
void pull(){ sz=lz()+rz()+1; }
node(int v=0):l(-1),r(-1),sz(1),pri(rand()),val(v){}
} pool[500005];
int root;
int node::lz(){ return ~l?pool[l].sz:0; }
int node::rz(){ return ~r?pool[r].sz:0; }
int _ptr;
int gnode(int v){
pool[_ptr].l=-1;
pool[_ptr].r=-1;
pool[_ptr].sz=1;
pool[_ptr].val=v;
return _ptr++;
}
int merge(int a,int b){
if(!~a)return b; if(!~b)return a;
if(pool[a].pri>pool[b].pri){
pool[a].r=merge(pool[a].r,b);
pool[a].pull();
return a;
}
else{
pool[b].l=merge(a,pool[b].l);
pool[b].pull();
return b;
}
}
void split_val(int now,int val,int &a,int &b){
if(!~now){ a=b=-1; return; }
if(pool[now].val<=val){
a=now;
split_val(pool[now].r,val,pool[a].r,b);
pool[a].pull();
}
else{
b=now;
split_val(pool[now].l,val,a,pool[b].l);
pool[b].pull();
}
}
void split_sz(int now,int sz,int &a,int &b){
if(!~now){ a=b=-1; return; }
if(pool[now].lz()>=sz){
b=now;
split_sz(pool[now].l,sz,a,pool[b].l);
pool[b].pull();
}
else{
a=now;
split_sz(pool[now].r,sz-1-pool[now].lz(),pool[a].r,b);
pool[a].pull();
}
}
int solve(int m,int k[]){
_ptr=0;
int ptr=1;
for(int i=0;i<m;++i){
while(ptr<=n && p[ptr].first<=k[i]){
int a,b;
split_val(root,p[ptr].second,a,b);
root=merge(merge(a,gnode(p[ptr].second)),b);
++ptr;
}
int a,b;
split_val(root,k[i]-1,a,b);
if(!~b || pool[b].sz<k[i]){
root=0;
return 0;
}
int c,d;
split_sz(b,k[i],c,d);
root=d;
}
return 1;
}
}
#define BOUND 385
int dp[BOUND+4];
int can(int m,int k[]){
sort(k,k+m);
// return naive::solve(m,k);
if(m>BOUND)return naive::solve(m,k);
else{
memset(dp,0x3f,sizeof(dp));
for(int i=0;i<m;++i){
int mn=9897788;
for(int j=0;j<=i;++j){
if(j==0)mn=query(root[0],root[k[i]],1,n,k[i],n);
else mn=min(mn,dp[j-1]+query(root[k[j-1]],root[k[i]],1,n,k[i],n));
// cout<<"j: "<<j<<" , mn: "<<mn<<endl;
}
dp[i]=mn-k[i];
// cout<<"at "<<i<<" , dp: "<<dp[i]<<endl;
if(dp[i]<0)return 0;
}
return 1;
}
}
#ifdef WEAK
int l[500005],r[500005];
int main(){
int n; cin>>n;
for(int i=0;i<n;++i)cin>>l[i]>>r[i];
init(n,l,r);
int m; cin>>m; while(m--){
int k; cin>>k;
int *a=new int[k];
for(int i=0;i<k;++i)cin>>a[i];
cout<<can(k,a)<<endl;
}
}
#endif
Compilation message
teams.cpp: In function 'void init(int, int*, int*)':
teams.cpp:46:9: warning: declaration of 'ptr' shadows a global declaration [-Wshadow]
int ptr=1;
^~~
teams.cpp:8:5: note: shadowed declaration is here
int ptr;
^~~
teams.cpp: In function 'int naive::merge(int, int)':
teams.cpp:75:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
if(!~a)return b; if(!~b)return a;
^~
teams.cpp:75:22: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
if(!~a)return b; if(!~b)return a;
^~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
16 ms |
10144 KB |
Output is correct |
2 |
Correct |
17 ms |
10144 KB |
Output is correct |
3 |
Correct |
17 ms |
10276 KB |
Output is correct |
4 |
Correct |
16 ms |
10276 KB |
Output is correct |
5 |
Correct |
19 ms |
10364 KB |
Output is correct |
6 |
Runtime error |
894 ms |
525312 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
7 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
878 ms |
525312 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
871 ms |
525312 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
1252 ms |
525312 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |