結果
| 問題 |
No.2242 Cities and Teleporters
|
| コンテスト | |
| ユーザー |
沙耶花
|
| 提出日時 | 2023-03-11 21:08:22 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 778 ms / 3,000 ms |
| コード長 | 1,457 bytes |
| コンパイル時間 | 3,604 ms |
| コンパイル使用メモリ | 255,652 KB |
| 最終ジャッジ日時 | 2025-02-11 10:29:01 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:20:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
20 | scanf("%d",&h[i]);
| ~~~~~^~~~~~~~~~~~
main.cpp:24:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
24 | scanf("%d",&t[i]);
| ~~~~~^~~~~~~~~~~~
main.cpp:71:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
71 | scanf("%d %d",&a,&b);
| ~~~~~^~~~~~~~~~~~~~~
ソースコード
#include <stdio.h>
#include <atcoder/all>
#include <bits/stdc++.h>
using namespace std;
using namespace atcoder;
using mint = modint998244353;
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define Inf32 1000000001
#define Inf64 4000000000000000001
int main(){
int n;
cin>>n;
vector dp(n,vector<int>(20,0));
vector<int> h(n),t(n);
rep(i,n){
scanf("%d",&h[i]);
}
vector<int> is;
rep(i,n){
scanf("%d",&t[i]);
is.push_back(i);
}
sort(is.begin(),is.end(),[&](int x,int y){
return h[x]<h[y];
});
vector<int> hs(n);
rep(i,n){
hs[i] = h[is[i]];
}
vector<int> rui(n);
rep(i,n){
rui[i] = is[i];
if(i!=0){
if(t[rui[i]]<t[rui[i-1]])rui[i] = rui[i-1];
}
}
rep(i,n){
int d = distance(hs.begin(),upper_bound(hs.begin(),hs.end(),t[i]));
if(d==0){
dp[i][0] = i;
}
else{
d--;
dp[i][0] = rui[d];
if(t[dp[i][0]]<t[i])dp[i][0] = i;
}
}
for(int i=1;i<20;i++){
rep(j,n){
if(dp[j][i-1]==-1){
dp[j][i] = -1;
}
else{
dp[j][i] = dp[dp[j][i-1]][i-1];
}
}
}
int q;
cin>>q;
rep(_,q){
int a,b;
scanf("%d %d",&a,&b);
a--,b--;
if(dp[a][0]==-1){
cout<<-1<<endl;
continue;
}
if(t[a]>=h[b]){
cout<<1<<endl;
continue;
}
int cur = 0;
int cp = a;
for(int i=19;i>=0;i--){
if(dp[cp][i]==-1)continue;
if(h[b]>t[dp[cp][i]]){
cur |= 1<<i;
cp = dp[cp][i];
}
}
cur+=2;
if(cur == (1<<20)+1)cur = -1;
cout<<cur<<endl;
}
return 0;
}
沙耶花