首页 > 其他分享 >P10232 [COCI 2023/2024 #4] Roboti 题解

P10232 [COCI 2023/2024 #4] Roboti 题解

时间:2024-05-12 20:41:59浏览次数:21  
标签:Pii P10232 int 题解 ya 2023 Fi Se define

P10232 [COCI 2023/2024 #4] Roboti 题解


知识点

简单环,DFS。


题意分析

在 \(n\) 行,\(m\) 列的网格里,给定 \(k\) 个转弯点,再给定 \(Q\) 个询问,问每次从某个坐标到另一个坐标的最少转弯次数,或者判断不可能到达。


思路分析

我们发现在一个点坐标与方向确定的时候,到达的下一个点的坐标与方向一定确定,那我们把每个转弯点拆成四个方向不同的点,分别判断,那么整个图就变成了一堆简单环,那么两个点的距离就很容易得到,判断合法也只要看是不是在一个环里即可。


CODE

#include<bits/stdc++.h>
#define Fi first
#define Se second
#define endl '\n'
#define INF 0x3f3f3f3f
#define Pii pair<int,int>
#define All(a) begin(a),end(a)
#define tomax(a,b) ((a)=max((a),(b)))
#define tomin(a,b) ((a)=min((a),(b)))
#define FOR(i,a,b) for(register int i=(a);i<=(b);++i)
#define DOR(i,a,b) for(register int i=(a);i>=(b);--i)
#define main Main();signed main(){ios::sync_with_stdio(0);cin.tie(0);return Main();}signed Main
using namespace std;
constexpr int N=1e5+10,M=1e6+10,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
bool ti[N];
bool vis[N][4];
int n,m,k,Q,cnt;
int x[N],y[N],siz[N<<2];
int id[N][4],dep[N][4];
Pii p[4][2],fa[N][4];
vector< Pii > X[M],Y[M];
int nxt(int x,int y,int d){
	Pii cur={d&1?x:y,d<2?INF:0};
	auto it=d&1?lower_bound(All(Y[y]),cur):lower_bound(All(X[x]),cur);
	auto it1=d&1?Y[y].begin():X[x].begin(),it2=d&1?Y[y].end():X[x].end();
	if(d<2)swap(it1,it2);
	if(it==it1)it=it2;
	if(it==it1)return -1;
	if(d>1)--it;
	return it->Se;
}
void dfs(int u,int d){
	Pii v=fa[u][d];
	vis[u][d]=1,id[u][d]=cnt,++siz[cnt];
	if(~v.Fi&&!vis[v.Fi][v.Se])dep[v.Fi][v.Se]=dep[u][d]+1,dfs(v.Fi,v.Se);
}
int dis(Pii a,Pii b){
	if(id[a.Fi][a.Se]!=id[b.Fi][b.Se])return INF;
	return (dep[b.Fi][b.Se]-dep[a.Fi][a.Se]+siz[id[a.Fi][a.Se]])%siz[id[a.Fi][a.Se]];
}
signed main(){
	cin>>n>>m>>k;
	FOR(i,1,k){
		char c;
		cin>>x[i]>>y[i]>>c,ti[i]=(c=='L'),X[x[i]].push_back({y[i],i}),Y[y[i]].push_back({x[i],i});
	}
	FOR(i,1,n)sort(All(X[i]));
	FOR(i,1,m)sort(All(Y[i]));
	FOR(i,1,k)FOR(d,0,3){
		int _d=ti[i]?(d+3)%4:(d+1)%4;
		fa[i][d]={nxt(x[i],y[i],_d),_d};
	}
	FOR(i,1,k)FOR(d,0,3)if(!vis[i][d])++cnt,dfs(i,d);
	cin>>Q;
	while(Q--){
		int xa,ya,xb,yb,ans=INF;cin>>xa>>ya>>xb>>yb;
		FOR(d,0,3)p[d][0]={nxt(xa,ya,d),d},p[d][1]={nxt(xb-dx[d],yb-dy[d],d),d};
		FOR(d,0,3)if(~p[d][0].Fi)FOR(_d,0,3)if(~p[_d][1].Fi)tomin(ans,dis(p[d][0],p[_d][1]));
		if(xa==xb&&X[xa].empty()||ya==yb&&Y[ya].empty())ans=0;
		cout<<(ans<INF?ans:-1)<<endl;
	}
	return 0;
}
/*
首先,拆点,把每个转折点拆成 4 个方向,然后我们发现,如果一个点有出入度,那么必定是一个出度和一个入度,
所以问题就转化为了一堆简单环上判断距离,直接求解即可。
*/

标签:Pii,P10232,int,题解,ya,2023,Fi,Se,define
From: https://www.cnblogs.com/Cat-litter/p/18188151

相关文章

  • P10231 [COCI 2023/2024 #4] Putovanje 题解
    P10231[COCI2023/2024#4]Putovanje题解知识点多源BFS,bitset。题意分析在一个图上,每个点有一个权值,求满足到每个点的距离都为其权值的点(权值为\(-1\)的点除外)。思路分析Subtask1我们可以发现,这个子任务的图一定是一个有序的链,那么转换成序列问题,直接根据坐标进......
  • CF1967D Long Way to be Non-decreasing 题解
    CF1967DLongWaytobeNon-decreasing题解知识点二分答案,基环树。题意分析给定一个包含\(n\)个元素的数组\(\{a_i\}\)和一个\(m\)个元素的数组\(\{b_i\}\)。定义每次操作为:在\(\{a_i\}\)中选择任意个数,假设某个选的数为\(a_i\),那么将其变为\(b_{a_i}\)......
  • P10227 [COCI 2023/2024 #3] Slučajna Cesta 题解
    P10227[COCI2023/2024#3]SlučajnaCesta题解知识点期望DP,树形(换根)DP,组合数学。题意分析一棵树,每个点都有点权,每一条边的方向分布都是等概率的,问从每个点出发,有路走就一直走的情况下,所途径的点的权值总和的期望值。思路分析这明显是一个树形DP,且需要变成换根DP......
  • P9425 [蓝桥杯 2023 国 B] AB 路线
    P9425[蓝桥杯2023国B]AB路线一、问题简析本题是一道\(BFS\)题。与普通的广搜题不同的是,本题中,格子可以多次访问。因此,vis数组不能只用二维,要进行升维。本题中,每个节点包含以下信息:structnode{pair<int,int>loc;//坐标charch;//......
  • [ABC261E] Many Operations 题解
    [ABC261E]ManyOperations题解思路解析首先可以发现,如果直接跑肯定会炸,于是考虑优化。首先发现操作有很多重复的,所以可以考虑把每一个数经过所有操作后的值都预处理下来,但这样显然空间也会炸。然后我们又想到可以不需要求下每个数经过操作后的值,可以把每一位二进制上在开始前......
  • ABC353C Sigma Problem 题解
    ABC353CSigmaProblem题解题目链接:AT题目中的两个求和符号\(\sum_{i=1}^{N-1}\sum_{j=i+1}^{N}\)实际上是在枚举所有的有序数对\((i,j)\)。而有序数对的个数\(N(N-1)/2=O(N^{2})\),真的去枚举所有数对肯定会T。这时应该考虑去拆贡献,求出每个\(A_i\)对答案的贡献。......
  • 2024江苏省大学生程序设计大赛(JSCPC)热身赛题解(B)
    题目大意:求区间\([l,r]\)中有多少正整数满足\(\phi(\phi(n))=\phi(n)-1\),其中\(\phi\)为欧拉函数。解:设\(y=\phi(n)\),则上式变为\(\phi(y)=y-1\),易证\(y\)为质数(注意\(\phi(1)=1\),\(1\)与任何正整数都互质)。故原问题转化为求\([l,r]\)中有多少个正整数v满足\(\phi......
  • set 容器详解 附大根堆题解
    声明本文中题解部分内容大部分转载自@sonnety的这篇博客中,本文为为方便复习而写的结论类文章,读者可自行跳转至原文处阅读。PART1set什么是set——来源cppreference简言之,它就是一种存进去就可以自动按升序排列的特殊容器,通常的set还具有自动去重的功能。定义方......
  • 工作疑难问题解决4例
      记录一下工作上疑难问题解决:  一,方便的页面监控     前几天早上,负责的kettle抽取数据表的任务又报错了,早上看手机有4个未接报警电话,一看是人员表,原来昨天报表系统有个大的查询一直未查询完成,导致truncate这个人员表,无法活动meta的锁,后续执行抽取和计算的都报错......
  • U423621 [HDK - NRC] Sqen Paradox 题解
    题目描述及\(O(n^2)\)做法见这个设\(a_i\)表示以\(i\)为左端点,无重复元素的最长区间的左端点,这个直接拿双指针做就行。处理出来后,分类讨论,找\(\max(i-l+1,i-a_i+1)\),找\(i-l+1\)拿个桶维护一下左端点为\(i\)的右端点有那些就行,剩下的位置找最值即可,这个是RMQ。时间......