题目链接:点击查看

题目大意:给出一个长度为 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-约瑟夫环+置换群的幂)相关推荐

  1. 2019 牛客多校 C Governing sand 线段树

    链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 Governing sand 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 6 ...

  2. 2021牛客多校4 - Tree Xor(线段树+异或区间拆分)

    题目链接:点击查看 题目大意:给出一棵 nnn 个点组成的树,每个点权的取值范围是 [li,ri][l_i,r_i][li​,ri​],每条边权代表的是两点的异或值,现在问这棵树有多少种有效赋值 题目 ...

  3. 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)

    题目链接:点击查看 题目大意:有 n 个球员和 m 个球迷,一个球员可能是多个球迷的粉丝,需要选择最少的球员进行比赛,使得所有的球迷都愿意观看(对于每个球迷来说,都有至少一个其喜欢的球员入选比赛) 对 ...

  4. 牛客多校7 - A National Pandemic(树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一棵树,再给出 m 次操作,每次操作分为三种类型,dist( x , y ) 代表点 x 和点 y 之间的距离: 1 pos val:将点 pos 位置的值增加 va ...

  5. Cutting Bamboos(牛客多校第九场H主席树+二分+思维)

    链接:https://ac.nowcoder.com/acm/contest/889/H 来源:牛客网 There are n bamboos arranged in a line. The i-th ...

  6. 【牛客 - 370A】签到题(线段树扫描线 或 STLset)(求线段并)

    题干: 链接:https://ac.nowcoder.com/acm/contest/370/A 来源:牛客网 恭喜你找到了本场比赛的签到题! 为了让大家都有抽奖的机会,只需要复制粘贴以下代码(并且稍 ...

  7. 牛客多校1 - Infinite Tree(虚树+换根dp+树状数组)

    题目链接:点击查看 题目大意:给出一个无穷个节点的树,对于每个大于 1 的点 i 来说,可以向点 i / minvid[ i ] 连边,这里的 mindiv[ x ] 表示的是 x 的最小质因数,现在 ...

  8. 牛客练习赛73 D 离别(线段树+右端点排序离线查询)

    牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...

  9. 牛客 - 牛牛的Link Power II(线段树)

    题目链接:点击查看 题目大意:给出一个01字符串 s ,现在规定每两个 1 的贡献为其在字符串中的距离,现在有 m 次操作,每次操作会把一个位置将 0 变成 1 或者将 1 变成 0 ,问每次操作后字 ...

最新文章

  1. 京东金融将发布重量级技术与数据产品 招募合作伙伴共拓蓝海市场
  2. redis 通过aof日志恢复_Redis之-aof恢复
  3. Linux系统下按了Ctrl+s锁定屏幕后怎么办?
  4. 通过反射越过泛型检查
  5. 计算机教室要配备空调吗,教室里不安装空调吗?如何正确安装空调?
  6. PostgreSQL 连接的问题
  7. @程序员,敏捷开发防坑指南请查收!
  8. HTML map 设置图热点
  9. 221028| STATA制图代码
  10. windows照片查看器无法显示此图片问题
  11. 下一跳配置的原则--ensp
  12. 文章集合--作者篇--上【转】
  13. 使用hexo+gitee免费搭建个人博客全网最详细
  14. 成都Uber优步司机奖励政策(3月10日)
  15. linux格式化u盘fat32,linux下格式化u盘
  16. linux gns3使用教程,《GNS3实战指南》——2.4 在Ubuntu Linux上安装
  17. WAP(wml)开发问答
  18. [Android]listview图文混排
  19. 【浙江大学C小程week1整理】
  20. SQL注入漏洞测试(报错盲注)笔记

热门文章

  1. 火星云分发全网视频_火星云矿总裁商思林:三大引擎点燃2020年超级牛市,挖矿和理财将成为资产配置必选项...
  2. ORACLE客户端jdbc连接测试,Oracle 客户端JDBC连接测试工具
  3. php网站调试出现的简单问题,调试php时网站出现502的解决方法
  4. long java 比较_Java到底是不是一种纯面向对象语言?
  5. MySQL高级 - 案例 - 系统性能优化 - 读写分离概述
  6. xml配置文件的形式 VS 配置类的形式
  7. OpenResty介绍
  8. Set集合存储元素不重复的原理
  9. SpringBoot高级-检索-SpringBoot整合Jest操作ES
  10. 21.5.8阶段四数据类型