社区讨论
准备再捞一下这个贴子,萌新求教
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 条回复,欢迎继续交流。
正在加载回复...