No.33 アメーバがたくさん - yukicoder
- X[i] が最大 10^9 とかなんでまともに配列を確保したりすると TLE する。T 時間後に同じ座標に到達するものたちを一つにまとめて、間と前後を埋めるようにすればよい。
- 方針はあっていたのに abs(X[i]-X[j]) と書くべきところを (X[i]-X[j]) と書いてしまい WA してしまった...orz。
class ManyAmeba {
public:
void solve(void) {
int N,D,T;
cin>>N>>D>>T;
vector<ll> X(N);
REP(i,N)
cin>>X[i];
sort(RANGE(X));
UFTree uft(N);
REP(i,N)
FOR(j,i,N)
{
if (abs(X[i]-X[j])%D==0 && abs(X[i]-X[j])/D <= 2*T)
uft.unite(i,j);
}
map<int,pair<ll,ll>> group;
REP(i,N)
{
if (!group.count(uft[i]))
group.emplace(piecewise_construct,
forward_as_tuple(uft[i]),
forward_as_tuple(X[i],X[i]));
auto &rng = group[uft[i]];
rng.first = min(rng.first, X[i]);
rng.second = max(rng.second, X[i]);
}
ll sum = 0;
for (auto g : group)
{
ll b,e;
tie(b,e) = g.second;
sum += 2*T;
sum += ((e-b)/D+1);
}
cout<<sum<<endl;
}
};