首页 > 其他分享 >题解:SP4557 ANARC08H - Musical Chairs

题解:SP4557 ANARC08H - Musical Chairs

时间:2024-10-02 17:33:15浏览次数:7  
标签:pwr target idx Chairs 题解 int 孩子 bit Musical

约瑟夫问题,由于问题涉及大量的删除和查找操作,直接用数组模拟会超时,可以用树状数组

题意

在每一轮游戏中,我们需要从当前的孩子位置开始数数,并淘汰第 \(D\) 个孩子。游戏需要不断地从剩下的孩子中进行选择并淘汰,直到只剩下最后一个孩子。

注意两个点

  1. 将树状数组的位置设为 \(1\) 表示孩子还在,删除后减 \(1\) 表示孩子没了。

  2. 使用二分 + 树状数组的前缀和查找第 \(D\) 个孩子。

代码:

#include<bits/stdc++.h>
using namespace std;
struct BIT{
	int n;
	vector<int>bit;
	BIT(int n):n(n),bit(n+1){}
	int read(int idx){
		idx--;
		int  res=0;
		while(idx>0){
			res+=bit[idx];
			idx-=idx&-idx;
		}
		return res;
	}
	int read2(int idx1,int idx2){
		return read(idx2)-read(idx1);
	}
	void update(int idx,int val){
		while(idx<=n){
			bit[idx]+=val;
			idx+=idx&-idx;
		}
	}
	int lower_bound(int target){
		if(target<=0)return 1;
		int pwr=1;
		while(2*pwr<=n)pwr*=2;
		int idx=0;
		int tot=0;
		for(;pwr;pwr>>=1){
			if(idx+pwr>n)continue;
			if(tot+bit[idx+pwr]<target){
				tot+=bit[idx+=pwr];
			}
		}
		return idx+2;
	}
	int upper_bound(int target){
		if(target<0)return 1;
		int pwr=1;
		while(2*pwr<=n)pwr*=2;
		int idx=0;
		int tot=0;
		for(;pwr;pwr>>=1){
			if(idx+pwr>n)continue;
			if(tot+bit[idx+pwr]<=target){
				tot+=bit[idx+=pwr];
			}
		}
		return idx+2;
	}
};
int main(){
	for(;;){
		int N,D;
		cin>>N>>D;
		if(N==0)return 0;
		BIT bit(N);
		for(int i=1;i<=N;i++){
			bit.update(i,1);
		}
		int target=1;
		for(int i=N;i>=1;i--){
			target=(target+D-1)%i;
			if(target==0)target=i;
			int pos=bit.lower_bound(target)-1;
			bit.update(pos,-1);
			if(i==1){
				cout<<N<<' '<<D<<' '<<pos<<endl;
			}
		}
	}
}

标签:pwr,target,idx,Chairs,题解,int,孩子,bit,Musical
From: https://www.cnblogs.com/cly312/p/18444910

相关文章

  • 59_初识搜索引擎_搜索相关参数梳理以及bouncing results问题解决方案
    1、preference决定了哪些shard会被用来执行搜索操作_primary,_primary_first,_local,_only_node:xyz,_prefer_node:xyz,_shards:2,3bouncingresults问题,两个document排序,field值相同;不同的shard上,可能排序不同;每次请求轮询打到不同的replicashard上;每次页面上看到的搜索......
  • 操作系统错题解析【软考】
    目录前言1.特殊的操作系统1.1可移植性1.2嵌入式操作系统2.进程的状态2.1调度方式2.2进程通信运行实例3.信号量的取值范围3.1PV操作中信号量分析4.信号量于PV操作4.1PV操作4.2初值5.死锁资源数计算6.进程资源图7.页式存储8.段页式存储9.磁盘管理9.1计算读取时间9.2......
  • 01 交换串 题解
    题意简述给定一个长为\(n\)的\(\tt01\)串\(s\),你需要对\(s\)进行恰好\(m\)次交换,每次只能交换相邻的不同字符,最大化操作后\(s\)的价值。\(s\)的价值被定义为,对于每一个\(i\),记\(1\simi-1\)中,和\(s_i\)不同的\(s_j\)有\(l\)个,\(r\)同理,\(f(s_i,i,l,......
  • CSP-S/NOIP提高组 真题题解总结
    DP:线性dpP1091[NOIP2004提高组]合唱队形比较简单的一道题。求出以\(i\)结尾的最长上升子序列和以\(i\)为头的最长下降子序列,相加\(-1\)即可。P1052[NOIP2005提高组]过河如果不考虑\(L\)的范围,那么就是一道简单的线性dp。但是\(L\)很大,石头数量很少,......
  • 区间 题解
    题意简述求长度为\(n\)的序列\(a\)的最长连续子序列\([l,r]\),满足\(\existsi\in[l,r],\gcd(a_l,\ldots,a_r)=a_i\)。\(1\leqn\leq4\times10^6\),\(1\leqa_i\leq10^{18}\)。题目分析根据\(\gcd(a,b)=a\)等价于\(b\bmoda=0\),这个区间的限......
  • 题解 P2726 【[SHOI2005]树的双中心】
    首先,我们会有一个很简单的想法,枚举断边,产生两棵子树,然后在两棵树内分别求带权重心,计算贡献,这样的话复杂度是\(O(n^2)\)的。那么我们要好好利用$h\leq100$的性质。考虑\(sze[u]\)为带权重量,\(g[u]\)为以\(u\)为根的树,所有点都到\(u\)的代价。所以\(g[u]=\sum\l......
  • AT_abc373_e 的题解
    (一)二分套二分。(感觉是一个很麻烦的做法。)题目问的是让额外给的票最少,考虑二分答案。设二分的答案为\(x\),该候选人原来的得票为\(v\),想要超过他至少要\(x+v+1\)。同时用前缀和维护区间和。第一种情况为该候选人在前\(m\)个人中,如下图所示。绿色箭头为被讨论的人,蓝色箭......
  • 优美函数 题解
    题意简述给你函数\(f\):\[f(x,y,u)=\left\{\begin{array}{rcl}u-y,&x=1\\u,&1<x\ley,\\gcd(x,y)=1\\-x\cdoty,&x\neq1,\\gcd(x,y)=x\\0,&\text{otherwise}.\end{array}\right.\]对于一个长度为\(n\)的序列......
  • ABC 模拟赛 | A Passing Contest 001题解记录(A,B,C,D)
    比赛链接https://www.luogu.com.cn/contest/126344[APC001]A-CT不必多说,多次取模#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<queue>#include<deque>#include<math.h>#include<map>......
  • CF1214G Feeling Good 题解
    题目链接点击打开链接题目解法我真菜啊,感觉每一步都不难,但一步都没想到/yun考虑两行\(x,y\)什么时候可以构造出合法的矩形?即\(x\)中需要有\(y\)对应位置为\(0\)的\(1\),\(y\)中需要有\(x\)对应位置为\(0\)的\(1\)归纳一下,\(x\)不是\(y\)的子集且\(y\)不......