社区讨论

关于指针的使用

学术版参与者 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 条回复,欢迎继续交流。

正在加载回复...