牛客多校6 - Josephus Transform(线段树求k-约瑟夫环+置换群的幂)
题目链接:点击查看
题目大意:给出一个长度为 n 的排列,初始时为 1 , 2 , 3 ... n - 1 , n,现在有 m 次操作,每次操作表示为 ( k , x ) ,即进行 x 次 k-约瑟夫变换,问最终排列
题目分析:对于每一次的 k-约瑟夫变换,都可以视为一次置换群的结合操作,所以我们首先需要求出这个置换群是什么,假设上一次被取出来的数字是第 pos 个( 初始时为 1 ),此时环内还剩下 cnt 个数字,则下一次需要被选出的数字是剩下数字的第 ( pos - 1 + k - 1 ) % cnt + 1 个,这个操作可以利用线段树上二分实现,时间复杂度为 nlogn
在求出置换群后,置换 x 次相当于置换群的 x 次幂,这个直接 O( n ) 去实现就好了,牛客二也做过一个类似的题,也是需要求置换群的幂
总的时间复杂度为 nmlogn
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;int ans[N],temp[N],p[N],n,m;bool vis[N];struct Node
{int l,r,sum;
}tree[N<<2];void build(int k,int l,int r)
{tree[k].l=l;tree[k].r=r;if(l==r){tree[k].sum=1;return;}int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}int query(int k,int pos)//找第pos大的数
{tree[k].sum--;if(tree[k].l==tree[k].r)return tree[k].l;if(tree[k<<1].sum>=pos)return query(k<<1,pos);elsereturn query(k<<1|1,pos-tree[k<<1].sum);
}void solve(int t)//O(n)实现置换群p的t次幂
{memset(vis,false,n+5);for(int i=1;i<=n;i++){if(vis[i])continue;vector<int>circle;int pos=i;while(!vis[pos]){circle.push_back(pos);vis[pos]=true;pos=p[pos];}int sz=circle.size();for(int i=0;i<sz;i++)temp[circle[i]]=ans[circle[(i+t)%sz]];}for(int i=1;i<=n;i++)ans[i]=temp[i];
}int main()
{
#ifndef ONLINE_JUDGE
// freopen("data.in.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)ans[i]=i;while(m--){build(1,1,n);int x,k,pos=1,cnt=n;scanf("%d%d",&k,&x);for(int i=1;i<=n;i++)//将k-约瑟夫变换转换为置换群{pos=(pos-1+k-1)%cnt+1;p[i]=query(1,pos);cnt--;}solve(x);}for(int i=1;i<=n;i++)printf("%d ",ans[i]);return 0;
}
牛客多校6 - Josephus Transform(线段树求k-约瑟夫环+置换群的幂)相关推荐
- 2019 牛客多校 C Governing sand 线段树
链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 Governing sand 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 6 ...
- 2021牛客多校4 - Tree Xor(线段树+异或区间拆分)
题目链接:点击查看 题目大意:给出一棵 nnn 个点组成的树,每个点权的取值范围是 [li,ri][l_i,r_i][li,ri],每条边权代表的是两点的异或值,现在问这棵树有多少种有效赋值 题目 ...
- 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)
题目链接:点击查看 题目大意:有 n 个球员和 m 个球迷,一个球员可能是多个球迷的粉丝,需要选择最少的球员进行比赛,使得所有的球迷都愿意观看(对于每个球迷来说,都有至少一个其喜欢的球员入选比赛) 对 ...
- 牛客多校7 - A National Pandemic(树链剖分+线段树)
题目链接:点击查看 题目大意:给出一棵树,再给出 m 次操作,每次操作分为三种类型,dist( x , y ) 代表点 x 和点 y 之间的距离: 1 pos val:将点 pos 位置的值增加 va ...
- Cutting Bamboos(牛客多校第九场H主席树+二分+思维)
链接:https://ac.nowcoder.com/acm/contest/889/H 来源:牛客网 There are n bamboos arranged in a line. The i-th ...
- 【牛客 - 370A】签到题(线段树扫描线 或 STLset)(求线段并)
题干: 链接:https://ac.nowcoder.com/acm/contest/370/A 来源:牛客网 恭喜你找到了本场比赛的签到题! 为了让大家都有抽奖的机会,只需要复制粘贴以下代码(并且稍 ...
- 牛客多校1 - Infinite Tree(虚树+换根dp+树状数组)
题目链接:点击查看 题目大意:给出一个无穷个节点的树,对于每个大于 1 的点 i 来说,可以向点 i / minvid[ i ] 连边,这里的 mindiv[ x ] 表示的是 x 的最小质因数,现在 ...
- 牛客练习赛73 D 离别(线段树+右端点排序离线查询)
牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...
- 牛客 - 牛牛的Link Power II(线段树)
题目链接:点击查看 题目大意:给出一个01字符串 s ,现在规定每两个 1 的贡献为其在字符串中的距离,现在有 m 次操作,每次操作会把一个位置将 0 变成 1 或者将 1 变成 0 ,问每次操作后字 ...
最新文章
- 京东金融将发布重量级技术与数据产品 招募合作伙伴共拓蓝海市场
- redis 通过aof日志恢复_Redis之-aof恢复
- Linux系统下按了Ctrl+s锁定屏幕后怎么办?
- 通过反射越过泛型检查
- 计算机教室要配备空调吗,教室里不安装空调吗?如何正确安装空调?
- PostgreSQL 连接的问题
- @程序员,敏捷开发防坑指南请查收!
- HTML map 设置图热点
- 221028| STATA制图代码
- windows照片查看器无法显示此图片问题
- 下一跳配置的原则--ensp
- 文章集合--作者篇--上【转】
- 使用hexo+gitee免费搭建个人博客全网最详细
- 成都Uber优步司机奖励政策(3月10日)
- linux格式化u盘fat32,linux下格式化u盘
- linux gns3使用教程,《GNS3实战指南》——2.4 在Ubuntu Linux上安装
- WAP(wml)开发问答
- [Android]listview图文混排
- 【浙江大学C小程week1整理】
- SQL注入漏洞测试(报错盲注)笔记
热门文章
- 火星云分发全网视频_火星云矿总裁商思林:三大引擎点燃2020年超级牛市,挖矿和理财将成为资产配置必选项...
- ORACLE客户端jdbc连接测试,Oracle 客户端JDBC连接测试工具
- php网站调试出现的简单问题,调试php时网站出现502的解决方法
- long java 比较_Java到底是不是一种纯面向对象语言?
- MySQL高级 - 案例 - 系统性能优化 - 读写分离概述
- xml配置文件的形式 VS 配置类的形式
- OpenResty介绍
- Set集合存储元素不重复的原理
- SpringBoot高级-检索-SpringBoot整合Jest操作ES
- 21.5.8阶段四数据类型