社区讨论

准备再捞一下这个贴子,萌新求教

P4511[CTSC2015] 日程管理参与者 154已保存回复 190

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
190 条
当前快照
1 份
快照标识符
@mi6uym0x
此快照首次捕获于
2025/11/20 11:14
4 个月前
此快照最后确认于
2025/11/20 19:00
4 个月前
查看原帖
萌新求教,刚学线段树,调不出错误来了,求大佬指教
昨天看到这个题目突然又想debug,然而还是没有debug出来,求大佬Orz
CPP
#include <iostream>
#include <cstdio>
#include <set>
#include <cctype>

using namespace std;

/*
1000 10
ADD 811 1548
DEL 811 1548
ADD 3 4978
ADD 667 2270
ADD 41 2326
DEL 3 4978
ADD 38 38
ADD 800 94
DEL 800 94
ADD 10 2978
*/

/*
对于每个任务集t,导出一个“前缀和”。
1、批量+1 -1
2、找到第一个0 
*/ 

namespace debug
{
	const int slim=1e0;
	
	const int llim=1e9;
	
	void stop(int lim)
	{
		for (int i=1;i<=lim;i++);
	}
}

using namespace debug;

struct SegTree1
{
	struct node
	{
		int left,right,value,tag;
	}t[300050<<2];
	
	void Push_Up(int id)
	{
		t[id].value=min(t[id*2].value,t[id*2+1].value);
	}
	
	void Push_Down(int id)
	{
		if (!t[id].tag)
			return;
		t[id*2].value+=t[id].tag;
		t[id*2+1].value+=t[id].tag;
		t[id*2].tag+=t[id].tag;
		t[id*2+1].tag+=t[id].tag;
		t[id].tag=0;
	}
	
	void Build(int id,int left,int right)
	{
		t[id].left=left;
		t[id].right=right;
		t[id].value=left;
		t[id].tag=0;
		if (left==right)
			return;
		int mid=(left+right)/2;
		Build(id*2,left,mid);
		Build(id*2+1,mid+1,right);
	}
	
	void Change(int id,int left,int right,int qleft,int qright,int value)
	{
		cout << "t1.Change" << " " << id << " " << left << " " << right << " " << qleft << " " << qright << " " << value << endl;
		if (qleft<=left && right<=qright)
		{
			t[id].value+=value;
			t[id].tag+=value;
			return;
		}
		Push_Down(id);
		int mid=(left+right)/2;
		if (qleft<=mid)
			Change(id*2,left,mid,qleft,qright,value);
		if (qright>mid)
			Change(id*2+1,mid+1,right,qleft,qright,value);
		Push_Up(id);
	}
	
	int QueryLeft(int id,int left,int right,int pos)
	{
		cout << "t1.QueryLeft" << " " << id << " " << left << " " << right << " " << pos << " " << t[id].value << endl;
		if (t[id].value)
			return 0;
		if (left==right)
			return left;
		Push_Down(id);
		int mid=(left+right)/2;
		if (pos<=mid)
		{
			int tmp=QueryLeft(id*2,left,mid,pos);
			if (tmp)
				return tmp;
		}
		return QueryLeft(id*2+1,mid+1,right,pos);
	}
	
	int QueryRight(int id,int left,int right)
	{
		cout << "t1.QueryRight" << " " << id << " " << left << " " << right << endl;
		if (t[id].value)
			return 0;
		if (left==right)
			return left;
		Push_Down(id);
		int mid=(left+right)/2;
		int tmp=QueryRight(id*2+1,mid+1,right);
		if (tmp)
			return tmp;
		else return QueryRight(id*2,left,mid);
	}
}t1;

struct node
{
	int left,right,value,pos;
}t[300050<<2];

回复

190 条回复,欢迎继续交流。

正在加载回复...