koala设计了一个程序,首先他写了一个暴力算法,但是在他写完之后受到电脑病毒的影响而失忆。好在他的源代码和题面数据范围保留了下来(数据范围在输入描述中已经给出),但是现在仍然无法通过这个题目。由于电脑病毒的影响,题面已经消失,现在他希望你基于源代码做出优化来解决这道题。
C++代码:
#include <bits/stdc++.h>
using namespace std;
// 链表结构体定义
typedef struct node {
int id;
struct node *next;
} *pNode, Node;
// 循环链表头节点
pNode head;
// 按顺序删除的前n-1个节点的id构成的列表
vector<int> ans;
int main() {
// n个节点,判断值k
int n, k;
cin >> n >> k;
// 构造包含n个节点的循环链表
head = (pNode)malloc(sizeof(Node));
pNode now = head;
for (int i = 1; i <= n; ++i) {
pNode a = (pNode)malloc(sizeof(Node));
a->id = i;
now->next = a;
now = now->next;
}
now->next = head->next;
// pc为计数器
int pc = 0;
now = head;
// 当前节点的上一个节点
pNode last = nullptr;
// 程序执行到链表只剩下最后一个节点为止
while (n > 1) {
pc++;
last = now;
now = now->next;
// 当计数器pc = k时从循环链表中删除当前节点,并把被删除的节点的id添加到答案列表ans中
if (pc == k) {
last->next = now->next;
n--;
pc = 0;
ans.push_back(now->id);
}
}
// 输出最终答案
for (auto id : ans) {
cout << id << ' ';
}
return 0;
}
$ n, k (2 \le n \le 3 \times 10^5 , 1 \le k \le 3 \times 10^5) $
根据题意输出答案。