Compare commits

..

No commits in common. "5546dd0eeda3a41bd11c8311162c304ea0fd021f" and "2e2a747e5ec53da4f277afdf7ed361a46a3d6477" have entirely different histories.

4 changed files with 63 additions and 133 deletions

View File

@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.15)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
add_compile_options(-Wall) add_compile_options(-Wall)
# add_compile_options(-fsanitize=address,pointer-compare,pointer-subtract,undefined -fno-omit-frame-pointer) add_compile_options(-fsanitize=address,pointer-compare,pointer-subtract,undefined -fno-omit-frame-pointer)
# add_link_options(-fsanitize=address,pointer-compare,pointer-subtract,undefined -fno-omit-frame-pointer) add_link_options(-fsanitize=address,pointer-compare,pointer-subtract,undefined -fno-omit-frame-pointer)
include_directories(${CMAKE_CURRENT_LIST_DIR}/include) include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
set(CMAKE_CXX_STANDARD 26) set(CMAKE_CXX_STANDARD 26)

View File

@ -1,109 +1,83 @@
#include <cstdint> #include <cstdint>
#include <cstdio>
#include <deque> #include <deque>
#include <iostream> #include <iostream>
#include <istream> #include <istream>
using ll = int64_t; using ll = int64_t;
#define sl static inline const ll maxn = 1000+5;
ll n,m;
const ll maxn = 1005; ll a[maxn][maxn];
ll n, m; struct D{
int a[maxn][maxn]; ll x,y,d;
bool vis[maxn][maxn][4][2]; bool is2,ish;
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; };
struct Q { std::deque<D> d;
Q(ll s, ll x, ll y, ll dir, bool is2) : s(s), x(x), y(y), dir(dir), is2(is2) { bool vis[maxn][maxn][4];
} const ll dir[4][2]={
ll s, x, y, dir; {1,0},
bool is2; {-1,0},
{0,1},
{0,-1}
}; };
std::deque<Q> q;
sl bool check(ll x, ll y, ll dir, bool is2) { int main(){
if (x < 1 || x > n || y < 1 || y > m)
return false;
if (a[x][y] == 0)
return false;
if (a[x][y] == 3 && !is2)
return false;
if (a[x][y] == 4) {
return !vis[x][y][dir][false];
} else {
return !vis[x][y][0][is2];
}
}
int main() {
std::iostream::sync_with_stdio(false); std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr); std::cin.tie(nullptr);
std::cin >> n >> m; std::cin>>n>>m;
for (ll i = 1; i <= n; i++) { for(ll i=1;i<=n;i++){
for (ll j = 1; j <= m; j++) { for(ll j=1;j<=m;j++){
std::cin >> a[i][j]; std::cin>>a[i][j];
} }
} }
d.emplace_back(1,1,0,false);
while (d.size()) {
auto[x,y,dd,is2,ish] = d.front();
d.pop_front();
if(ish && a[x][y]==4){
ll nx = x+dir[dd][0], ny=y+dir[dd][1];
if(a[nx][ny]==3){
if(vis[nx][ny][is2])continue;
}else if(a[nx][ny]==4){
if(vis[nx][ny][dd])continue;
}else if(vis[nx][ny][0])continue;
q.emplace_back(0, 1, 1, 0, false); if(ll na=a[nx][ny];na==0){
vis[1][1][0][false] = true;
while (q.size()) {
auto [s, x, y, dd, is2] = q.front();
q.pop_front();
if (x == n && y == m) {
std::cout << s << "\n";
return 0;
}
if (a[x][y] == 4) {
ll nx = x + dir[dd][0], ny = y + dir[dd][1];
if (nx < 1 || nx > n || ny < 1 || ny > m)
continue; continue;
}else if(na==1){
bool nis2 = (a[nx][ny] == 2); d.emplace_back(nx,ny,dd,false,false);
vis[nx][ny][0]=true;
if (!check(nx, ny, dd, nis2)) }else if(na==2){
d.emplace_back(nx,ny,dd,true,false);
vis[nx][ny][0]=true;
}else if(na==3){
continue; continue;
}else if(na==4){
if (a[nx][ny] == 4) { d.emplace_back(nx,ny,dd,false,true);
vis[nx][ny][dd]=true;
vis[nx][ny][dd][false] = true;
} else {
vis[nx][ny][0][nis2] = true;
} }
q.emplace_back(s + 1, nx, ny, dd, nis2);
continue; continue;
} }
for(ll i=0;i<4;i++){
ll nx = x + dir[i][0], ny = y+dir[i][1];
for (ll i = 0; i < 4; i++) { if(ll na = a[nx][ny];na==0){
ll nx = x + dir[i][0], ny = y + dir[i][1];
if (nx < 1 || nx > n || ny < 1 || ny > m)
continue; continue;
}else if(na==1){
bool nis2 = is2; d.emplace_back(nx,ny,i,false,false);
if (a[nx][ny] == 2) vis[nx][ny][0]=true;
nis2 = true; }else if(na==2){
if (a[nx][ny] == 4) d.emplace_back(nx,ny,i,true,false);
nis2 = false; vis[nx][ny][0]=true;
}else if(na==3){
if (!check(nx, ny, i, nis2)) if(is2){
continue; d.emplace_back(nx,ny,i,true,false);
vis[nx][ny][is2]=true;
if (a[nx][ny] == 4) { }
vis[nx][ny][i][false] = true; }else if(na==4){
} else { d.emplace_back(nx,ny,i,false,true);
vis[nx][ny][0][nis2] = true; vis[nx][ny][i]=true;
} }
q.emplace_back(s + 1, nx, ny, i, nis2);
} }
} }
std::cout << "-1\n";
} }

View File

@ -6,15 +6,15 @@ using ll = int64_t;
int main(){ int main(){
ll n=100,k=100,m=1; ll n,k,m;
// std::cin>>n>>k>>m; std::cin>>n>>k>>m;
for(ll x=25;x<=25;x++){ for(ll x=25;x<=25;x++){
ll g=0; ll g=0;
for(ll i=1;i<=k;i++){ for(ll i=1;i<=k;i++){
ll y=(n-g)/x; ll y=(n-g)/x;
y=std::max(y,m); y=std::max(y,m);
printf("(n-g)=%lld, y=%lld, x=%lld\n",n-g,y,x);
g+=y; g+=y;
printf("i=%lld, g=%lld\n",i,g);
} }
printf("-- x=%lld, g=%lld\n\n",x,g); printf("-- x=%lld, g=%lld\n\n",x,g);
} }

View File

@ -1,44 +0,0 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
using ll = int64_t;
#define sl static inline
ll n,k,m;
sl bool check(ll x){
ll g=0;
for(ll i=1;i<=k;i++){
ll y=(n-g)/x;
if(y<m){
g+=m*(k-i+1);
return g>=n;
}else{
ll nxt = ((n-g)-(y*x))/y+1;
nxt=std::min(nxt,k-i+1);
g+=y*nxt;
i+=nxt-1;
}
}
return g>=n;
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>k>>m;
ll l=1,r=n,ans=0,mid;
while(l<r){
mid=(l+r)/2;
// printf("l=%lld, mid=%lld, r=%lld\n",l,mid,r);
if(check(mid)){
ans=mid;
l=mid+1;
}else{
r=mid;
}
}
std::cout<<ans<<"\n";
}