TOJ 1600 Fence Obstacle Course -- 线段树,链表

本文介绍了一个使用链表实现的优化算法案例,该算法在特定问题上表现优于线段树方法。通过具体实例展示了如何利用链表进行区间更新操作,并实现了高效的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www点2cto.com/kf/201209/153025.html

用链表居然比线段树快。。。。。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define mp make_pair
#define X first
#define Y second
#define MEMSET(a, b) memset(a, b, sizeof(a))
using namespace std;

typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
typedef pair pii;
typedef vector vi;
typedef vi::iterator vi_it;
typedef map mii;
typedef priority_queue pqi;
typedef priority_queue, greater > rpqi;
typedef priority_queue pqp;
typedef priority_queue, greater > rpqp;

const int MAX_N = 50000 + 2;
int seg[MAX_N][2];

int main(int argc, char *argv[])
{
//	freopen("D:\\in.txt", "r", stdin);
	int n, s, i;
	list coll;
	list::iterator it;
	cin >> n >> s;
	coll.push_back(mp(0, s));
	for (i = 0; i < n; ++i) scanf("%d%d", seg[i], seg[i] + 1);
	for (i = n - 1; i >= 0; --i) {
		int lcost = INT_MAX, rcost = INT_MAX;
		for (it = coll.begin(); it != coll.end();) {
//			pii tmp = *it;
			if (seg[i][0] <= it->Y && seg[i][1] >= it->Y) {
				lcost = min(lcost, it->X + it->Y - seg[i][0]);
				rcost = min(rcost, it->X + seg[i][1] - it->Y);
				it = coll.erase(it);
			}
			else {
				++it;
			}
		}
		if (lcost != INT_MAX) {
			coll.push_back(mp(lcost, seg[i][0]));
			coll.push_back(mp(rcost, seg[i][1]));
		}
	}
	
	int ans = INT_MAX;
	for (it = coll.begin(); it != coll.end(); ++it) {
		ans = min(ans, it->X + abs(it->Y));
	}
	cout << ans << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值