답안 #94053

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
94053 2019-01-15T06:41:19 Z fjzzq2002 코끼리 (Dancing Elephants) (IOI11_elephants) C++14
97 / 100
9000 ms 21856 KB
#pragma GCC optimize("-Ofast","-funroll-all-loops","-fno-stack-protector")
#include "elephants.h"
#include <bits/stdc++.h>
using namespace std;
#define SZ 305555
int n;
//B?
#define pb push_back
typedef pair<int,int> pii;
#define fi first
#define se second
int B=105,G=0;
vector<int> bl[SZ];
vector<int> seq;
set<pii> ns;
int be[SZ],x[SZ],W,blk[SZ];
int ts[SZ];
int* getseq()
{
	int tn=0;
	for(auto t:seq)
		for(int j=0;j<bl[t].size();++j)
			ts[tn++]=bl[t][j];
	return ts;
}
#define j1 ju1
int j1[SZ];
pii js[SZ];
inline void reset_block(vector<int>&v_)
{
	int j=0,vn=v_.size(),*v=v_.data();
	for(int i=0;i<vn;++i)
	{
		while(j<vn&&x[v[j]]<=x[v[i]]+W) ++j;
		if(j==vn) j1[v[i]]=-1;
		else j1[v[i]]=v[j];
	}
	for(int i=int(vn)-1;i>=0;--i)
		if(j1[v[i]]==-1) js[v[i]].fi=v[i],js[v[i]].se=0;
		else
			js[v[i]].fi=js[j1[v[i]]].fi,
			js[v[i]].se=js[j1[v[i]]].se+1;
}
inline void rebuild(int*v)
{
	int u=int(n)/B;
	if(!u) ++u;
	for(int i=1;i<=G;++i) bl[i].clear();
	seq.clear(); G=0;
	vector<int> p; p.reserve(u);
	for(int i=0;i<n;++i)
	{
		p.pb(v[i]);
		if(p.size()>=u||i==n-1)
		{
			bl[++G]=p,reset_block(p);
			for(auto t:p) blk[t]=G;
			seq.pb(G),p.clear();
			p.reserve(u);
		}
	}
}
inline int ask()
{
	int s=ns.begin()->se,cn=0;
	while(1)
	{
		if(js[s].se)
			cn+=js[s].se,s=js[s].fi;
		auto u=ns.lower_bound(pii(x[s]+W+1,0));
		++cn; if(u==ns.end()) break; s=u->se;
	}
	return cn;
}
int cnt=0;
void init(int N, int L_, int X[])
{
	n=N; W=L_;
	for(int i=0;i<n;++i) x[i]=X[i];
	vector<int> v;
	for(int i=0;i<n;++i)
		v.pb(i),ns.insert(pii(x[i],i));
	rebuild(v.data());
}
int update(int t,int y)
{
	ns.erase(pii(x[t],t));
	{
		int i=blk[t];
		vector<int>&B=bl[i];
		for(int j=0;;++j)
			if(B[j]==t)
			{
				for(int k=j;k+1<B.size();++k)
					B[k]=B[k+1];
				B.pop_back(); break;
			}
		if(B.size()) reset_block(B);
		else
		{
			for(int j=0;;++j)
				if(seq[j]==i)
				{
					for(int k=j;k+1<seq.size();++k)
						seq[k]=seq[k+1];
					seq.pop_back(); break;
				}
		}
	}
	x[t]=y; ns.insert(pii(x[t],t));
	for(int i=0;i<int(seq.size());++i)
		if(x[t]<=x[bl[seq[i]].back()]||i+1==int(seq.size()))
		{
			while(x[bl[seq[i]].back()]<=x[t]
			&&i+1!=int(seq.size())&&rand()%3) ++i;
			static int us[SZ]; int un=0;
			vector<int> &s=bl[seq[i]]; bool c=0;
			for(int j=0;j<s.size();++j)
			{
				if(x[s[j]]>x[t])
				{if(!c) us[un++]=t; c=1;}
				us[un++]=s[j];
			}
			if(!c) us[un++]=t; s.pb(0);
			for(int i=0;i<un;++i) s[i]=us[i];
			reset_block(s); blk[t]=seq[i];
			break;
		}
	++cnt;
	if(cnt%(B*4)==0) rebuild(getseq());
	return ask();
}

Compilation message

elephants.cpp: In function 'int* getseq()':
elephants.cpp:22:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=0;j<bl[t].size();++j)
               ~^~~~~~~~~~~~~
elephants.cpp: In function 'void rebuild(int*)':
elephants.cpp:54:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(p.size()>=u||i==n-1)
      ~~~~~~~~^~~
elephants.cpp: In function 'int update(int, int)':
elephants.cpp:94:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int k=j;k+1<B.size();++k)
                 ~~~^~~~~~~~~
elephants.cpp:104:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int k=j;k+1<seq.size();++k)
                  ~~~^~~~~~~~~~~
elephants.cpp:118:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int j=0;j<s.size();++j)
                ~^~~~~~~~~
elephants.cpp:124:4: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
    if(!c) us[un++]=t; s.pb(0);
    ^~
elephants.cpp:124:23: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
    if(!c) us[un++]=t; s.pb(0);
                       ^
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 7544 KB Output is correct
2 Correct 8 ms 7544 KB Output is correct
3 Correct 8 ms 7544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 7544 KB Output is correct
2 Correct 8 ms 7544 KB Output is correct
3 Correct 8 ms 7544 KB Output is correct
4 Correct 8 ms 7544 KB Output is correct
5 Correct 8 ms 7544 KB Output is correct
6 Correct 8 ms 7544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 7544 KB Output is correct
2 Correct 8 ms 7544 KB Output is correct
3 Correct 8 ms 7544 KB Output is correct
4 Correct 8 ms 7544 KB Output is correct
5 Correct 8 ms 7544 KB Output is correct
6 Correct 8 ms 7544 KB Output is correct
7 Correct 464 ms 9440 KB Output is correct
8 Correct 512 ms 9772 KB Output is correct
9 Correct 1222 ms 12224 KB Output is correct
10 Correct 852 ms 12148 KB Output is correct
11 Correct 970 ms 12112 KB Output is correct
12 Correct 2102 ms 12364 KB Output is correct
13 Correct 1513 ms 12196 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 7544 KB Output is correct
2 Correct 8 ms 7544 KB Output is correct
3 Correct 8 ms 7544 KB Output is correct
4 Correct 8 ms 7544 KB Output is correct
5 Correct 8 ms 7544 KB Output is correct
6 Correct 8 ms 7544 KB Output is correct
7 Correct 464 ms 9440 KB Output is correct
8 Correct 512 ms 9772 KB Output is correct
9 Correct 1222 ms 12224 KB Output is correct
10 Correct 852 ms 12148 KB Output is correct
11 Correct 970 ms 12112 KB Output is correct
12 Correct 2102 ms 12364 KB Output is correct
13 Correct 1513 ms 12196 KB Output is correct
14 Correct 655 ms 9892 KB Output is correct
15 Correct 936 ms 10508 KB Output is correct
16 Correct 3257 ms 12708 KB Output is correct
17 Correct 3674 ms 14260 KB Output is correct
18 Correct 3895 ms 14160 KB Output is correct
19 Correct 2436 ms 13904 KB Output is correct
20 Correct 3817 ms 14160 KB Output is correct
21 Correct 3773 ms 14288 KB Output is correct
22 Correct 2495 ms 14028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 7544 KB Output is correct
2 Correct 8 ms 7544 KB Output is correct
3 Correct 8 ms 7544 KB Output is correct
4 Correct 8 ms 7544 KB Output is correct
5 Correct 8 ms 7544 KB Output is correct
6 Correct 8 ms 7544 KB Output is correct
7 Correct 464 ms 9440 KB Output is correct
8 Correct 512 ms 9772 KB Output is correct
9 Correct 1222 ms 12224 KB Output is correct
10 Correct 852 ms 12148 KB Output is correct
11 Correct 970 ms 12112 KB Output is correct
12 Correct 2102 ms 12364 KB Output is correct
13 Correct 1513 ms 12196 KB Output is correct
14 Correct 655 ms 9892 KB Output is correct
15 Correct 936 ms 10508 KB Output is correct
16 Correct 3257 ms 12708 KB Output is correct
17 Correct 3674 ms 14260 KB Output is correct
18 Correct 3895 ms 14160 KB Output is correct
19 Correct 2436 ms 13904 KB Output is correct
20 Correct 3817 ms 14160 KB Output is correct
21 Correct 3773 ms 14288 KB Output is correct
22 Correct 2495 ms 14028 KB Output is correct
23 Correct 8135 ms 21856 KB Output is correct
24 Correct 8696 ms 21736 KB Output is correct
25 Correct 7167 ms 21476 KB Output is correct
26 Correct 6151 ms 21096 KB Output is correct
27 Correct 7192 ms 21136 KB Output is correct
28 Correct 1533 ms 9820 KB Output is correct
29 Correct 1542 ms 9760 KB Output is correct
30 Correct 1576 ms 9760 KB Output is correct
31 Correct 1426 ms 9696 KB Output is correct
32 Correct 6415 ms 21220 KB Output is correct
33 Correct 3078 ms 21124 KB Output is correct
34 Correct 5168 ms 21096 KB Output is correct
35 Correct 4744 ms 21808 KB Output is correct
36 Correct 4437 ms 21240 KB Output is correct
37 Execution timed out 9061 ms 21844 KB Time limit exceeded
38 Halted 0 ms 0 KB -