首页 > 其他分享 >2024.11.9组队训练题解记录

2024.11.9组队训练题解记录

时间:2024-11-09 19:08:56浏览次数:4  
标签:2024.11 鲍勃 组队 题解 ll 房间 leq 传送 include

Teleportation

鲍勃最近访问了一个奇怪的传送系统。该系统包含 \(n\) 个房间,编号为 \(0\) 到 \(n-1\)。每个房间都安装了一个传送设备。每个传送设备都有一个看起来像钟表表面的仪表板,上面有一个指针,显示数字 \(0\) 到 \(n-1\),按顺时针顺序排列。最初,第 \(i\) 个房间的传送设备上的指针指向数字 \(a_i\)。

当鲍勃在房间 \(i\)(\(0 \leq i \leq n-1\))时,他可以进行以下操作任意次数:

  • 传送:立即传送到房间 \((i + a_i) \mod n\)。
  • 逆时针移动指针。设置 \(a_i \leftarrow a_i + 1\)。
    每次操作需要一个时间单位。鲍勃从房间 \(0\) 开始,他想尽快到达某个房间 \(x\)。他想知道需要多长时间。
    \(Input\)
    输入的第一行包含两个整数 \(n\)(\(2 \leq n \leq 10^5\))和 \(x\)(\(1 \leq x \leq n - 1\)),分别表示房间的数量和鲍勃的目的地房间。
    下一行包含 \(n\) 个整数 \(a_0, a_1, \ldots, a_{n-1}\)(\(0 \leq a_i \leq n - 1\)),其中 \(a_i\)(\(0 \leq i \leq n - 1\))表示第 \(i\) 个房间的指针指向的数字。
    \(Output\)
    输出一个整数,表示鲍勃从房间 0 到达房间 \(x\) 所需的最短时间。

\(Sample1\)
4 3
0 1 2 3


4
\(Sample2\)
4 3
0 0 0 0


4
\(Sample3\)
4 3
2 2 2 2


2
思路:这题得转换一下,不然边要建太多了,不妨设1到n-1为本,n到\(2*n-1\)为真,对于本来讲,从1到n-1做有向边,从左指向右边(注意n-1->0也要),设立边费用为1;且对于每个数建立个零费用边到其对应的真边
随后就是i+a[i]了,建立对应i的真边i+n到(i+a[i])%n的本的单向边,且设立费用为1.
随后优先队列走一个最短路就行了,从n出发
从真点集出发一是可以直接到对应连接的本点,二是可以利用本点集中单向边的指向性质,一个有向环,实现费用转移优化。
这样子既合理有实现了边集大小的控制,即3*n,最后走一遍迪杰斯特拉就可得到答案
由于迪杰斯特拉本质就是最近扩散,所以当遇以目标点扩散时,其一定为最小值,这时可以直接break

#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<cmath>
#include<string>
#define ll  long long 
#define lowbit(x) (x & -x)
#define endl "\n"
using namespace std;
vector<pair<ll,ll>>g[250000];
void fio()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}
bool vis[250000];
ll n,m;
ll ans=0;
void bfs()
{
    priority_queue<pair<ll,ll>,vector<pair<ll,ll>>,greater<pair<ll,ll>>>q;
    q.push({0,n});
    while(!q.empty())
    {
        ll x=q.top().first;
        ll y=q.top().second;
        q.pop();
        if(vis[y])
        continue;
        vis[y]=1;
        if(y==m+n)
        {
            ans=x;
            break;
        }
        for(auto j:g[y])
        {
            q.push({x+j.first,j.second});
        }
    }
}
int main() 
{
	fio();
    cin>>n>>m;
    for(ll i=0;i<n;i++)
    {
        ll x;
        cin>>x;
        g[n+i].push_back({1,(x+i)%n});
    }
    for(ll i=0;i<n-1;i++)
    {
        g[i].push_back({1,i+1});
        g[i].push_back({0,i+n});
    }
    g[n-1].push_back({1,0});
    g[n-1].push_back({0,2*n-1});
    bfs();
    cout<<ans<<endl;
}

标签:2024.11,鲍勃,组队,题解,ll,房间,leq,传送,include
From: https://www.cnblogs.com/cjcf/p/18537138

相关文章

  • P4156 论战捆竹竿 题解
    论战捆竹竿题意:给定字符串\(s\),计数"串\(t\)的长度"可能的种数有多少种,使得\(t\)能被\(s\)作为印章印出来,且\(|t|\lew\)。\(n=|s|\le5\times10^5\),\(n\lew\le10^{18}\)。第一步:求出\(s\)的周期\(\{a_1\sima_m\}\),包含\(n\)(\(a_m=n\))。转化为求\(\suma_ib......
  • 题解:P11248 [GESP202409 七级] 矩阵移动
    笑点解析:这个人所在城市考试当天刮台风了,没考,免费送了一次12月的考试。设计这么一个东西:\(dp_{i,j}\)表示到格子\((i,j)\)的最大分数。本来还好,但现在的问题是,如果这个格子是‘?’,我哪儿知道到底可不可以变啊?万一变得太多了,那,那不就废了!万一少了,那我分不就没了?所以我们......
  • agc032 A~E 题解
    a倒推,每次删掉最后一个b[i]=i的即可b一开始发现可以构造完全二分图,使两边和同为S,这样每个点的和=对面二分图点的和=S,然后n=6和为奇数进一步发现可以直接分成A组组内和为B的组,然后组之间连边,此时S=(A-1)B,有AB=n(n+1)/2当n为奇数时取A=(n+1)/2,B=n,n单独一组其他大匹配小;n为偶数......
  • NOIP集训 P11071 「QMSOI R1」 Distorted Fate 题解
    题解:P11071「QMSOIR1」DistortedFate给定一个长度为\(n\)的数组\(A\),你需要完成以下\(q\)次操作。1.1lrx将\(A_i(l\lei\ler)\)异或上\(x\)。2.2lr求:\[(\sum_{i=l}^r\bigcup_{j=l}^iA_j)\bmod2^{30}\]其中\(\bigcup\)表示按位或。Input第一行输入......
  • [COCI2022-2023#5] Slastičarnica 题解
    前言题目链接:洛谷。题意简述一个长为\(n\)的序列\(\{a_n\}\)和\(q\)次操作,第\(i\)次操作中,你可以删除序列长为\(d_i\)的前缀或后缀,并需要保证删除的所有数\(\geqs_i\)。每次操作前,你可以选择任意长度的前缀或后缀,并将其删除,也可以不操作。请问,在你不能进行下一次操......
  • CodeforceTon Round 4 div1 + div2 题解
    题解A-EDreamissofar~A.BeautifulSequence检查每一位对应的数字是否小于等于位置,如果可以说明这个数字可以移动到对应位置上,遍历即可#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidsolve(){ intn; cin>>n; vector<int>a......
  • CF607B Zuma 题解
    CF607BZuma不知道为什么你谷会评蓝,这不是很基础的区间DP吗。Problem-607B-Codeforces题意简述消除回文子串的最小次数。思路对于区间\([i,j]\),如果它是回文的,那么消除它所需的次数是\(1\)。如果它不是回文的,但是\(a[i]==a[j]\),那么当区间\([i+1,j-1]\)被消除到只剩下......
  • [ARC158C] All Pair Digit Sums 题解
    C-AllPairDigitSums题意:设\(f(x)\)为\(x\)的数字和。例如\(f(158)=1+5+8=14\)。给定一个长度为\(N\)的正整数序列\(A\),求\(\sum_{i=1}^{N}\sum_{j=1}^{N}f(A_i+A_j)\)。分析:首先明确\(f(x)\)为\(x\)的数位和。举例情况:若有两个数分别为:\(12,21\)。\[f(......
  • 2024.11.5人工智能学记6
    人工智能(ArtificialIntelligence),引文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。(一)学科范畴人工智能是一门边沿学科,属于自然科学、社会科学、技术科学三向交叉学科。(二)涉及学科与领域哲学和认知科学,数学,神经生......
  • QT中大量数据存储至excel的问题解决
            因为这个问题困扰了我很久,所以在这里记录一下,顺便给可能会遇到类似问题的人提供一点帮助。        在qt中,如果用C++处理数据保存到excel,正常来说在pro文件中添加axcontainer 然后就能够调用到excel,但是这只能适用于数量级没那么大时的需求。  ......