约瑟夫问题的升级版,每次出去的是前一个出去的人位置+手上的数字(正往前,负往后).第i个出去的人拿的糖是i的约数的个数.求拿糖最多的人和他的糖果数. 这里用到了反素数的知识,在这直接打表 题目 AC代码: #include<stdio.h> #include<string.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 ; ],n,k; ]; ]= {,,,,,,,,,,,,,,,,,,,,,, ,,…
题意  n个人顺时针围成一圈玩约瑟夫游戏  每一个人手上有一个数val[i]   開始第k个人出队  若val[k] < 0 下一个出队的为在剩余的人中向右数 -val[k]个人   val[k] > 0 时向左数val[k]个  第m出队的人能够得到m的约数个数个糖果  问得到最多糖果的人是谁 约瑟夫环问题  n比較大 直接模拟会超时   通过线段树能够让每次出队在O(logN)时间内完毕  类似上一道插队的题  线段树维护相应区间还有多少个人没出队  那么当我们知道出队的人在剩余人中排第几…
线段树可真有意思呢续集2... 区间成段的替换和增减,以及区间求和等,其中夹杂着一些神奇的操作,数据离散化,简单hash,区间异或,还需要带着脑子来写题. 有的题目对数据的操作并不是直接按照题面意思进行操作,而是换一个角度,通过对其他数据的操作得到结果,感觉真的是...啊啊啊啊啊啊,我的脑子离家出走了,他在哪啊(ಥ_ಥ)ru 写到后面的题目就感觉满满的都是套路,只要想到怎样处理数据以及如果通过线段树维护数据就可以,但是就是这个是关键(废话...),嘤嘤嘤,一拳一个嘤嘤怪,好好写题解... POJ…
题意:有一群小朋友围成一个环,编号1,2,3…N.每个人手上握着一个非0的数字,首先第K个人出列,然后看他手上的数字,假设为m,则从下一个开始第m个人出列,一直如此.并设i为小于等于N的最大反素数,问第i个出列的人得编号,i的约数个数.(设g(i)为i的约数的个数,若任意j<i,都有g(j)<g(i)则i为反素数). 首先要得到[0,N]的最大反素数(怎么得到下面再说),然后模拟出列操作,用线段树来优化使得每次出列在O(logN)时间内完成. #include <iostream>…
这道题不仅仅是在考察线段树,还他妹的在考察一个人的方向感.... 和线段树有关的那几个函数写了一遍就对了,连改都没改,一直在转圈的问题的出错.... 题意:从第K个同学开始,若K的数字为正 则往右转,否则往左转,转到的那同学出圈,知道剩下最后一个人. 输出得到蛋糕最多的人的名字和块数. 线段树的节点中存的是这一段内还有几个人没有跳出,思路很简单,详见注释. #include <iostream> #include <cstring> #include <cstdlib>…
题目链接: https://cn.vjudge.net/problem/POJ-2886 题目大意: N个人围成一圈第一个人跳出圈后会告诉你下一个谁跳出来跳出来的人(如果他手上拿的数为正数,从他左边数A个,反之,从他右边数A个) 跳出来的人所得到的糖果数量和他跳出的顺序有关 所得的糖果数为 (假设他是第k个跳出的) 则他得到的糖数为k能被多少个数整除 解题思路: 首先将因子个数打表:因子个数打表模板 然后先求出1-n中因子个数最大的为x,约瑟夫环进行x次 用线段树求出每次约瑟夫环后的具体下标.因…
Time Limit: 5000MS Memory Limit: 131072K Case Time Limit: 2000MS Description N children are sitting in a circle to play a game. The children are numbered from 1 to N in clockwise order. Each of them has a card with a non-zero integer on it in his/her…
题目: http://poj.org/problem?id=2886 左右转的果断晕,题目不难,关键是准确的转啊转.因为题目要求输出约数个数最多的数,所以预处理[1,500000]的约数的个数就行了.还有利用反素数的做法,太专业了,还是暴力预处理吧... #include <stdio.h> #include <string.h> #include <math.h> ; struct Tree_Node { int left, right, sum; Tree_Node…
1521 根据区间和 来确定第k个数在哪 #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<stdlib.h> using namespace std; #define N 100010 ],tt; void up(int w) { s[w] = s[w<<]+s[w<<|]; } void build(i…
传送门:Josephus Problem 题意:经典约瑟夫问题,有n个人,每次数到第k个人出列,求剩下的最后一人. 分析:用线段树模拟约瑟夫问题,记录区间的减少情况,然后根据每次数到的人在区间排第几位,线段树log(n)找到并更新,总复杂度为O(nlog(n)). #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define N 100010 #defin…