POJ 2886 单点更新

题意:n个小孩围一圈,他们手上卡片的数字代表下一个要出去的孩子,第K个孩子出去得到糖的数量是k的约数,输出得到糖最多的那个孩子的姓名和糖数。

首先要求反素数,也就是约数最多的,打表就行。然后线段树节点存放这个区间有多少个孩子还没走。然后模拟这个过程求出第P个孩子。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 500005
int RPrime[]= //反素数
{
    1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560,10080,15120,
    20160,25200,27720,45360,50400,55440,83160,110880,166320,221760,277200,332640,498960,
    554400
};
int fact[]= //反素数约数个数
{
    1,2,3,4,6,8,9,10,12,16,18,20,24,30,32,36,40,48,60,64,72,80,84,90,96,100,108,120,128,
    144,160,168,180,192,200,216
};
int node[maxn<<2];
struct child
{
    char name[15];
    int num;
} data[maxn];
void build(int rt,int l,int r)
{
    node[rt]=r-l+1;
    if(l==r)
    {
        node[rt]=1;
        return;
    }
    int mid=(r+l)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
}
int updata(int rt,int l,int r,int k)
{
    node[rt]--;
    if(l==r)
    {
        return l;
    }
    int mid=(l+r)>>1;
    if(k<=node[rt<<1])
        return updata(rt<<1,l,mid,k);
    else
        return updata(rt<<1|1,mid+1,r,k-node[rt<<1]);
}
int main()
{
    int n,k,p;
    while(~scanf("%d%d",&n,&k))
    {
        for(int i=1; i<=n; i++)
            scanf("%s%d",data[i].name,&data[i].num);
        for(int i=0; RPrime[i]<=n; i++) p=i;
        build(1,1,n);
        for(int i=1; i<RPrime[p]; i++)
        {
            int luck=updata(1,1,n,k),mod=node[1];
            if(data[luck].num>0)
                k=((k+data[luck].num-2)%mod+mod)%mod+1;
            else k=((k+data[luck].num-1)%mod+mod)%mod+1;
        }
        printf("%s %d\n",data[updata(1,1,n,k)].name,fact[p]);
    }
    return 0;
}
时间: 2024-08-30 12:23:03

POJ 2886 单点更新的相关文章

POJ 2828 单点更新

题意:给出N个人要查入队伍中的位置,按照输入的顺序,求最后队伍的先后顺序. 先把输入存起来,从后往前插入,前一个序号就代表前面有几个人,线段树内记录当前位置是否被占了,找低Num+1个空位坐下就行,查询函数返回空总和为num+1的位置. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define lson l,m

poj 2886 Who Gets the Most Candies?

点击打开poj 2886 思路: 求因子数+单点更新 分析: 1 题目的意思是有n个人构成一个环,刚开始是第k个人先出来.每个人有一个名字和数值A,如果A为正数,那么下一个出去的人是他左边的第A个人,如果是负数那么出去的将是右边的第A个人 2 这么我们要注意一下,因为n个人是围城一圈,那么左边就是顺时针方向,右边就是逆时针方向 3 那么我们就可以来推没一次出去的人的在剩下中是第几个.    假设当前是第k个人出去,并且这个人的值为A,并且剩下有sum个人    A > 0 , 因为这个人出去了,

HDU 1394 线段树单点更新求逆序数

题意:给出含有0 ~n-1 N个数组成的序列,有N次操作,每次把第一个数放到数列的最后,问这几次数列操作中最小的逆序数的值. 单点更新就可以,每一输入一个数,先查询有几个比这个数大的,再将这个值插入线段树中. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 5005 struct node { i

HTAP数据库 PostgreSQL 场景与性能测试之 30 - (OLTP) 秒杀 - 高并发单点更新

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

HDU 2795 单点更新查询最大值

题意:给你一个h*w的广告板,每条通知的长度为1*wi,给出n个通知,如果可以放下尽量靠上放,对应的行里尽量靠左方,对于每条通知给出存放在哪条上. 这题最多n个节点,所以不用考虑h的最大范围.线段树中每点维护当前剩余宽度,查询最大剩余宽度是否满足,满足即查询靠上的节点并更新. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace s

HDU 1166 线段树单点更新

第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50).接下来每行有一条命令,命令有4种形式:(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人

Hdu1754-线段树-单点更新

#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn=200005; int MAX[maxn<<2]; void pushup(int rt) { MAX[rt]=max(MAX[rt<<1],

poj 2828 Buy Tickets

点击打开poj 2828 思路: 树状数组/线段树单点更新 分析: 1 题目给定n个人的位置pos和id,要我们求出最后n个人的位置 2 我们先来考虑朴素的算法,假设现在进来一个人那么我们把它放到pos的位置,那么pos之后的所有的人都要向后移动一位,那么n个人的话最坏的情况是O(n^2),很显然时间效率上面是不行的 3 由于正向的插入不行,那么我们考虑反向插入的情况(就像逆向的并查集),那么我们可以马上知道第n个人的位置,那么第n-1个人的位置是基于第n个人的.假设第i个人的要插入pos的位置

poj 2481 Cows

点击打开链接poj2481 思路:线段树+单点更新 分析: 1 题目给定n头牛所在的区间,然后问每头牛都有几头牛比它强壮 2 根据题目如果牛i的区间是[Si , Ei],牛j的区间是[Sj , Ej]那么牛i要比牛j强壮的话那么就有Si <= Sj && Ei >= Ej && Si-Ei != Sj-Ej; 3 那么根据上面的条件,我们应该要先对n头牛的区间排序"按照S从小到大,相同S按照E从大到小排序",然后就可以利用线段树求了. 4 有