pku2886.cpp

来自「这是ACM 方面的资料 是PKU的 北京大学的出来的」· C++ 代码 · 共 86 行

CPP
86
字号
/*
我出的题目
这个程序可是标程哦!
*/
#include <stdio.h>
#define size 510000

typedef struct Node
{
	int s, e;
	int cnt;
} Node;

Node stree[size * 3];
char Name[size][11];
int A[size];
int N, K;
const int PV[40] = {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, 665280};
const int Nu[40] = {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, 224};
void CreateTree(int s, int e, int p)
{
	stree[p].s = s;
	stree[p].e = e;
	stree[p].cnt = e - s;
	if (e - s == 1)
		return;
	CreateTree(s, (s + e + 1) / 2, p * 2 + 1);
	CreateTree((s + e + 1) / 2, e, p * 2 + 2);
}

int Find(int l, int p)
{
	stree[p].cnt--;
	if (stree[p].e - stree[p].s == 1)
	{
		return stree[p].s;
	}
	if (l < stree[p * 2 + 1].cnt)
	{
		return Find(l, p * 2 + 1);
	}
	else
	{
		return Find(l - stree[p * 2 + 1].cnt, p * 2 + 2);
	}
}

void Solve()
{
	int P, i, L, ans, num;
	CreateTree(0, N, 0);
	i = 0;
	while (PV[i + 1] <= N)
		i++;
	P = PV[i];
	num = Nu[i];
	for (i = 0; i < N; i++)
	{
		scanf("%s %d", Name[i], &A[i]);
	}
	K--;
	L = N - 1;
	ans = K;
	for (i = 0; i < P; i++)
	{
		ans = Find(K, 0);
		if (L == 0)
			break;
		if (A[ans] > 0)
			K = (K + A[ans] - 1) % L;
		else
			K = ((K + A[ans]) % L + L) % L;
		L--;
	}
	printf("%s %d\n", Name[ans], num);
}

int main()
{
	while (EOF != scanf("%d%d", &N, &K))
		Solve();
	return 0;
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?