社区讨论
关于指针的使用
学术版参与者 4已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @lo29m0iq
- 此快照首次捕获于
- 2023/10/23 10:14 2 年前
- 此快照最后确认于
- 2023/11/03 10:27 2 年前
在做
这道题
时,脑子一抽,尝试用指针实现,于是:跑样例的时候锅掉了,但是我对于指针了并不深入,求大佬赐教
实现思路为,将更改看做是对于树的加点,对于询问,将其记录后进行全树的DFS求解。
该程序第一次崩溃位于27行
CPP#include<iostream>
#include<vector>
using namespace std;
struct OperationContent {
int version_operation;
int position;
int ans;
OperationContent*nextOperation;
};
struct TreeNode {
TreeNode*father;
pair<int, int>change;
vector<TreeNode*>son;
OperationContent*query;
};
class DFSTree {
private:
vector<TreeNode>tree;
public:
void AddChange(TreeNode*Before, const pair<int, int>&newChange) {
TreeNode newNode;
newNode.change = newChange;
newNode.father = Before;
newNode.query=NULL;
tree.push_back(newNode);
if (Before!=NULL) {
Before->son.push_back(&tree.back());
}
}
TreeNode*Root() {
return &tree.front();
}
};
vector<OperationContent>query;
DFSTree tree;
int N, M;
vector<TreeNode*>versions;
vector<int>A;
void DFS(const TreeNode*node) {
int backups=A[node->change.first];
A[node->change.first] = node->change.second;
for(OperationContent*i=node->query;i!=NULL;i=i->nextOperation){
i->ans=A[i->position];
}
for (const TreeNode* son : node->son) {
DFS(son);
}
A[node->change.first] = backups;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> N >> M;
A.assign(N+1,0);
for (int i = 1; i <= N; i++) {
cin >> A[i];
}
tree.AddChange(NULL, make_pair(0, 0));
versions.push_back(tree.Root());
int version, q, position, content;
for (int i = 1; i <= M; i++) {
cin >> version
>> q
>> position;
if (q == 1) {
cin >> content;
}
if (q == 2) {
OperationContent newQuery={version,position,0,versions[version]->query};
query.push_back(newQuery);
(*versions[version]).query=&query.back();
}
tree.AddChange(versions[version], make_pair(position, content)); //将操作记录
versions.push_back(versions[version]->son.back());
}
DFS(tree.Root());
for(int i=0;i<query.size();i++){
cout<<query[i].ans<<"\n";
}
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...