結果
| 問題 |
No.2716 Falcon Method
|
| コンテスト | |
| ユーザー |
tonegawa
|
| 提出日時 | 2024-04-05 21:44:28 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 244 ms / 2,000 ms |
| コード長 | 6,907 bytes |
| コンパイル時間 | 1,536 ms |
| コンパイル使用メモリ | 136,240 KB |
| 最終ジャッジ日時 | 2025-02-20 21:06:19 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 28 |
ソースコード
#include <iostream>
#include <string>
#include <vector>
#include <array>
#include <tuple>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <cmath>
#include <functional>
#include <cassert>
#include <climits>
#include <iomanip>
#include <numeric>
#include <memory>
#include <random>
#include <thread>
#include <chrono>
#define allof(obj) (obj).begin(), (obj).end()
#define range(i, l, r) for(int i=l;i<r;i++)
#define unique_elem(obj) obj.erase(std::unique(allof(obj)), obj.end())
#define bit_subset(i, S) for(int i=S, zero_cnt=0;(zero_cnt+=i==S)<2;i=(i-1)&S)
#define bit_kpop(i, n, k) for(int i=(1<<k)-1,x_bit,y_bit;i<(1<<n);x_bit=(i&-i),y_bit=i+x_bit,i=(!i?(1<<n):((i&~y_bit)/x_bit>>1)|y_bit))
#define bit_kth(i, k) ((i >> k)&1)
#define bit_highest(i) (i?63-__builtin_clzll(i):-1)
#define bit_lowest(i) (i?__builtin_ctzll(i):-1)
#define sleepms(t) std::this_thread::sleep_for(std::chrono::milliseconds(t))
using ll = long long;
using ld = long double;
using ul = uint64_t;
using pi = std::pair<int, int>;
using pl = std::pair<ll, ll>;
using namespace std;
template<typename F, typename S>
std::ostream &operator<<(std::ostream &dest, const std::pair<F, S> &p){
dest << p.first << ' ' << p.second;
return dest;
}
template<typename T>
std::ostream &operator<<(std::ostream &dest, const std::vector<std::vector<T>> &v){
int sz = v.size();
if(sz==0) return dest;
for(int i=0;i<sz;i++){
int m = v[i].size();
for(int j=0;j<m;j++) dest << v[i][j] << (i!=sz-1&&j==m-1?'\n':' ');
}
return dest;
}
template<typename T>
std::ostream &operator<<(std::ostream &dest, const std::vector<T> &v){
int sz = v.size();
if(sz==0) return dest;
for(int i=0;i<sz-1;i++) dest << v[i] << ' ';
dest << v[sz-1];
return dest;
}
template<typename T, size_t sz>
std::ostream &operator<<(std::ostream &dest, const std::array<T, sz> &v){
if(sz==0) return dest;
for(int i=0;i<sz-1;i++) dest << v[i] << ' ';
dest << v[sz-1];
return dest;
}
template<typename T>
std::ostream &operator<<(std::ostream &dest, const std::set<T> &v){
for(auto itr=v.begin();itr!=v.end();){
dest << *itr;
itr++;
if(itr!=v.end()) dest << ' ';
}
return dest;
}
template<typename T, typename E>
std::ostream &operator<<(std::ostream &dest, const std::map<T, E> &v){
for(auto itr=v.begin();itr!=v.end();){
dest << '(' << itr->first << ", " << itr->second << ')';
itr++;
if(itr!=v.end()) dest << '\n';
}
return dest;
}
std::ostream &operator<<(std::ostream &dest, __int128_t value) {
std::ostream::sentry s(dest);
if (s) {
__uint128_t tmp = value < 0 ? -value : value;
char buffer[128];
char *d = std::end(buffer);
do {
--d;
*d = "0123456789"[tmp % 10];
tmp /= 10;
} while (tmp != 0);
if (value < 0) {
--d;
*d = '-';
}
int len = std::end(buffer) - d;
if (dest.rdbuf()->sputn(d, len) != len) {
dest.setstate(std::ios_base::badbit);
}
}
return dest;
}
template<typename T>
vector<T> make_vec(size_t sz, T val){return std::vector<T>(sz, val);}
template<typename T, typename... Tail>
auto make_vec(size_t sz, Tail ...tail){
return std::vector<decltype(make_vec<T>(tail...))>(sz, make_vec<T>(tail...));
}
template<typename T>
vector<T> read_vec(size_t sz){
std::vector<T> v(sz);
for(int i=0;i<(int)sz;i++) std::cin >> v[i];
return v;
}
template<typename T, typename... Tail>
auto read_vec(size_t sz, Tail ...tail){
auto v = std::vector<decltype(read_vec<T>(tail...))>(sz);
for(int i=0;i<(int)sz;i++) v[i] = read_vec<T>(tail...);
return v;
}
long long max(long long a, int b){return std::max(a, (long long)b);}
long long max(int a, long long b){return std::max((long long)a, b);}
long long min(long long a, int b){return std::min(a, (long long)b);}
long long min(int a, long long b){return std::min((long long)a, b);}
long long modulo(long long a, long long m){a %= m; return a < 0 ? a + m : a;}
template<typename T>
struct safe_vector : std::vector<T>{
using std::vector<T>::vector;
T& operator [](size_t i){return this->at(i);}
};
template<typename T, int N>
struct safe_array : std::array<T, N>{
using std::array<T, N>::array;
T& operator [](size_t i){return this->at(i);}
};
ll ceil_div(ll x, ll y){
assert(y > 0);
return (x + (x > 0 ? y - 1 : 0)) / y;
}
ll floor_div(ll x, ll y){
assert(y > 0);
return (x + (x > 0 ? 0 : -y + 1)) / y;
}
void io_init(){
std::cin.tie(nullptr);
std::ios::sync_with_stdio(false);
}
template<typename Val>
struct accumulate1d{
std::vector<Val> sum;
accumulate1d(){}
accumulate1d(const std::vector<Val> &v): sum(v){
for(int i = 1; i < v.size(); i++) sum[i] = sum[i - 1] + v[i];
}
// [0, r)の和, 範囲外の部分は全て単位元
Val query(int r){
r = std::min(r, (int)sum.size());
if(r <= 0) return 0;
return sum[r - 1];
}
// [l, r)の和, 範囲外の部分は全て単位元
Val query(int l, int r){
l = std::max(l, 0);
r = std::min(r, (int)sum.size());
if(r <= l) return 0;
return (l == 0 ? sum[r - 1] : (sum[r - 1] - sum[l - 1]));
}
void push_back(Val x){
Val y = (sum.empty() ? 0 : sum.back());
sum.push_back(y + x);
}
void pop_back(){
assert(!sum.empty());
sum.pop_back();
}
// [0, k]がx以上になる最小インデックス, ない場合はn
int lower_bound(Val x){
return std::lower_bound(sum.begin(), sum.end(), x) - sum.begin();
}
// [0, k]がxより大きくなる最小インデックス, ない場合はn
int upper_bound(Val x){
return std::upper_bound(sum.begin(), sum.end(), x) - sum.begin();
}
};
int main(){
io_init();
int n, q;
std::cin >> n >> q;
string s;
std::cin >> s;
// x = h, y = wなら終了
// x = hなら右
// y = wなら下
// Siの通りに移動してi++
vector<ll> _R(n, 0), _D(n, 0);
range(i, 0, n){
if(s[i] == 'R') _R[i]++;
else _D[i]++;
}
accumulate1d<ll> R(_R), D(_D);
auto getD = [&](ll a, ll b) -> ll {
ll res = 0;
if(a + b <= n) return D.query(a, a + b);
res += D.query(a, n);
b -= n - a;
a = 0;
ll d = b / n;
res += D.query(0, n) * d;
b %= n;
return res + D.query(0, b);
};
auto getR = [&](ll a, ll b) -> ll {
ll res = 0;
if(a + b <= n) return R.query(a, a + b);
res += R.query(a, n);
b -= n - a;
a = 0;
ll d = b / n;
res += R.query(0, n) * d;
b %= n;
return res + R.query(0, b);
};
range(i, 0, q){
int h, w, p;
std::cin >> h >> w >> p;
ll l = 0, r = 2000000000;
while(r - l > 1){
ll m = (l + r) / 2;
// Sp.....S{p+m-1}にDがh個以上またはRがw個以上あるか
if(getD(p, m) >= h || getR(p, m) >= w){
r = m;
}else{
l = m;
}
}
std::cout << (p + r) % n << '\n';
}
}
tonegawa