結果
問題 | No.1170 Never Want to Walk |
ユーザー | monnu |
提出日時 | 2021-07-10 19:54:56 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 367 ms / 2,000 ms |
コード長 | 1,182 bytes |
コンパイル時間 | 1,600 ms |
コンパイル使用メモリ | 171,788 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-07-02 02:47:03 |
合計ジャッジ時間 | 7,997 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 37 |
ソースコード
#include <bits/stdc++.h> using namespace std; //#include <atcoder/all> //using namespace atcoder; using ll=long long; using Graph=vector<vector<int>>; #define MAX 1000000 #define MOD 1000000007 //#define INF 1000000000 #define INF 1000000000000000000 vector<int> parent; int find(int x){ int y=parent[x]; if(y!=parent[y]){ y=find(y); } return parent[x]=y; } void unite(int a,int b){ int x=find(a); int y=find(b); if(x!=y){ parent[y]=x; } } int main(){ int N,A,B; cin>>N>>A>>B; vector<int> x(N); for(int i=0;i<N;i++){ cin>>x[i]; } vector<int> sum(N+1,0); parent.resize(N); iota(parent.begin(),parent.end(),0); for(int i=0;i<N;i++){ int k=lower_bound(x.begin(),x.end(),x[i]+A)-x.begin(); if(k==N){ continue; } if(x[k]-x[i]<=B){ unite(i,k); sum[k]++; k=upper_bound(x.begin(),x.end(),x[i]+B)-x.begin(); k--; sum[k]--; } } for(int i=1;i<N;i++){ sum[i]+=sum[i-1]; } for(int i=0;i<N-1;i++){ if(sum[i]>0){ unite(i,i+1); } } vector<int> cnt(N,0); for(int i=0;i<N;i++){ cnt[find(i)]++; } for(int i=0;i<N;i++){ cout<<cnt[find(i)]<<endl; } }