結果
| 問題 |
No.2242 Cities and Teleporters
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-03-11 01:39:02 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 930 ms / 3,000 ms |
| コード長 | 2,154 bytes |
| コンパイル時間 | 4,152 ms |
| コンパイル使用メモリ | 263,596 KB |
| 最終ジャッジ日時 | 2025-02-11 09:44:37 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#include<atcoder/all>
using namespace atcoder;
using ll = long long;
ll n;
using TUP = tuple<ll,ll,ll>;
ll q;
ll dp[30][202020];//dp[i][j]:= 2^i解移動した時の最大の標高(未満)
using P = pair<ll,ll>;
vector<TUP> vtup;
vector<P> ab;
ll f_to(ll st,ll x){
for(ll i = 0;i<30;i++){
if(x>>i&1){
st = dp[i][st];
}
}
return st;
}
void solve(){
sort(vtup.begin(),vtup.end());
vector<ll> maxt(n);
{
vector<ll> H(n);
for(ll i = 0;i<n;i++){
auto [h,t,idx] = vtup[i];
H[i] = h;
}
for(ll i = 0;i<n;i++){
auto [h,t,idx] = vtup[i];
auto it = upper_bound(H.begin(),H.end(),t) - H.begin();
maxt[i] = it;
maxt[i]--;
if(i){
maxt[i] =max(maxt[i-1],maxt[i]);
maxt[i] =max(maxt[i],i);
}
//cout<<maxt[i]<<' ';
}
//cout<<endl;
}
for(ll i = 0;i<30;i++){
if(i==0){
for(ll j = 0;j<n;j++){
dp[i][j] = maxt[j];
}
}else{
for(ll j = 0;j<n;j++){
auto [h,t,idx] = vtup[j];
dp[i][j] = dp[i-1][dp[i-1][j]];
}
}
}
vector<ll> H(n);
for(ll i = 0;i<n;i++){
auto [h,t,idx] = vtup[i];
H[idx] = i;
}
vector<ll> T(n);
{
vector<ll> H(n);
for(ll i = 0;i<n;i++){
auto [h,t,idx] = vtup[i];
H[i] = h;
}
for(ll i = 0;i<n;i++){
auto [h,t,idx] = vtup[i];
T[idx] = upper_bound(H.begin(),H.end(),t)-H.begin();
T[idx]--;
}
}
for(ll i = 0;i<q;i++){
auto [lidx,ridx] = ab[i];
auto lH = T[lidx];
auto rH = H[ridx];
//cout<<lH<<' '<<rH<<' '<<f_to(lH,n*3)<<endl;
if(lH==-1){
cout<<-1<<endl;
continue;
}
if(lH==rH){
cout<<1<<endl;
continue;
}
if(rH<=f_to(lH,n*3)){
ll ng = -1,ok = n*3;
while(abs(ok-ng)>1){
ll mid = (ng+ok)/2;
if(rH<=f_to(lH,mid))ok = mid;
else ng = mid;
}
cout<<ok+1<<'\n';
}else{
cout<<-1<<'\n';
}
}
}
signed main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
cin >> n;
vtup = vector<TUP>(n);
for(auto &[h,t,i]:vtup)cin >> h;
for(auto &[h,t,i]:vtup)cin >> t;
for(ll i = 0;i<n;i++){
auto &[h,t,idx] = vtup[i];
idx = i;
}
cin >> q;
ab = vector<P>(q);
for(auto &[a,b]:ab)cin >> a >> b;
for(auto &[a,b]:ab)a--,b--;
solve();
}