結果
| 問題 |
No.1014 competitive fighting
|
| コンテスト | |
| ユーザー |
otamay6
|
| 提出日時 | 2020-02-20 10:55:21 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,989 bytes |
| コンパイル時間 | 2,635 ms |
| コンパイル使用メモリ | 204,696 KB |
| 実行使用メモリ | 10,248 KB |
| 最終ジャッジ日時 | 2024-12-14 16:06:41 |
| 合計ジャッジ時間 | 16,903 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 49 RE * 1 TLE * 1 |
ソースコード
#include<bits/stdc++.h>
#define REP(i,n) for(int i=0,i##_len=int(n);i<i##_len;++i)
#define rep(i,a,b) for(int i=int(a);i<int(b);++i)
#define All(x) (x).begin(),(x).end()
#define rAll(x) (x).rbegin(),(x).rend()
using namespace std;
using ll = long long;
template<typename T> class SegmentTree{
private:
typedef std::function<T(T,T)> F;
int n;
T d0;
vector<T> vertex;
F f;
F g;
public:
SegmentTree(F f,F g,T d):d0(d),f(f),g(g){}
void init(int _n){
n=1;
while(n<_n) n*=2;
vertex.resize(2*n-1,d0);
}
void build(const vector<T> &v){
int n_=v.size();
init(n_);
for(int i=0;i<n_;i++) vertex[n+i-1]=v[i];
for(int i=n-2;i>=0;i--)
vertex[i]=f(vertex[2*i+1],vertex[2*i+2]);
}
void update(int i,T x){
int k=i+n-1;
vertex[k]=g(vertex[k],x);
while(k>0){
k=(k-1)/2;
vertex[k]=f(vertex[2*k+1],vertex[2*k+2]);
}
return;
}
T query(int l,int r){
T vl=d0,vr=d0;
l+=n-1;
r+=n-1;
for(;l<=r;l/=2,r=r/2-1){
if(l%2==0) vl=f(vl,vertex[l]);
if(r&1) vr=f(vr,vertex[r]);
}
return f(vl,vr);
}
};
int main(){
int N;cin>>N;
assert(1<=N&&N<=100000);
using T = tuple<ll,ll,ll,ll>;
vector<T> X(N);
vector<int> A;
const int MAX=1e9;
REP(i,N) {
int a,b,c;
cin>>a>>b>>c;
assert(1<=a&&a<=MAX);
assert(1<=b&&b<=MAX);
assert(1<=c&&c<=MAX);
X[i]=tie(a,b,c,i);
A.push_back(a);
}
sort(All(A));
sort(All(X));
vector<int> ord(N);
iota(All(ord),0);
sort(All(ord),[&](int x,int y){
if(get<0>(X[y])<=get<1>(X[x])-get<2>(X[x])) return true;
if(get<0>(X[x])<=get<1>(X[y])-get<2>(X[y])) return false;
return get<0>(X[x])>get<0>(X[y]);});
sort(All(ord),[&](int x,int y){
if(get<0>(X[y])<=get<1>(X[x])-get<2>(X[x])) return true;
if(get<0>(X[x])<=get<1>(X[y])-get<2>(X[y])) return false;
return get<0>(X[x])>get<0>(X[y]);});
const ll inf = 1LL<<50;
SegmentTree<ll> dp([](ll a,ll b){return max(a,b);},[](ll a,ll b){return b;},0);
SegmentTree<bool> bl([](bool a,bool b){return a|b;},[](bool a,bool b){return b;},false);
dp.init(N);
bl.init(N);
for(int i=N-1;i>=0;--i){
int k=upper_bound(All(A),get<1>(X[ord[i]])-get<2>(X[ord[i]]))-A.begin();
ll pl=get<1>(X[ord[i]]);
if(k>0) pl+=dp.query(0,k-1);
if(bl.query(ord[i],N-1)) pl=inf;
dp.update(ord[i],pl);
if(k>0) bl.update(k-1,true);
}
for(int i=N-1;i>=0;--i){
int k=upper_bound(All(A),get<1>(X[ord[i]])-get<2>(X[ord[i]]))-A.begin();
if(k>0) dp.update(ord[i],max(dp.query(ord[i],ord[i]),dp.query(0,k-1)));
}
vector<ll> ans(N);
REP(i,N) ans[get<3>(X[i])]=dp.query(i,i);
REP(i,N){
if(ans[i]>=inf) cout<<"BAN"<<endl;
else cout<<ans[i]<<endl;
}
}
otamay6