3804. 【NOIP2014模拟8.24】小X 的AK 计划 (Standard IO)

 

Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits  

Description

在小X 的家乡,有机房一条街,街上有很多机房。每个机房里都有一万个人在切题。小X 刚刷完CodeChef,准备出来逛逛。
机房一条街有n 个机房,第i 个机房的坐标为xi,小X 的家坐标为0。小X 在街上移动的速度为1,即从x1 到x2 所耗费的时间为|x1 − x2|。
每个机房的学生数量不同,ACM 题目水平也良莠不齐。小X 到达第i 个机房后,可以花ti 的时间想题,然后瞬间AK;当然,也可以过机房而不入。
小X 现在只有m 个单位时间,之后他就该赶着去打Codeforces 了。现在他想知道自己最多能在多少个机房AK,希望你帮帮他。

Input

第一行包含两个整数n;m。
接下来n 行,每行包含两个整数xi; ti。

Output

第一行包含一个整数,表示小X 最多能AK 的机房数量。

Sample Input

2 10
1 100
5 5

Sample Output

1

Data Constraint

对于30% 的数据,n ≤ 20。
对于60% 的数据,n ≤ 1000。
对于100% 的数据,1 ≤ n ≤ 10^5,0 ≤ m; xi ≤ 10^18,0 ≤ ti ≤ 10^9。

Source / Author: 常州高级中学NOIP2014夏令营 plan

 

总结:

比赛的时候最后打这道题, 想了一个n log ^2 n 的方法, 觉得能过, 就打了。结果tle, 于是我认为是时间复杂度上过不去, 就打了n log n 的方法, 结果也tle。最后调了才知道(如下图)

左右都能走的情况, 我左右都遍历, 这不是傻吗, 活活遍历了整一棵数。

板子要记清楚。

题解 : 

对于已经确定要走的几个机房, 肯定是根据x坐标从左往右走最优。

于是我们枚举最远走到那个机房。

然后log n求答案。

O(n log n) CODE

#include<bits/stdc++.h>
#define open(x) freopen(x".in", "r", stdin);freopen(x".out", "w", stdout)
#define mem(a, b) memset(a, b, sizeof(a))
#define mcy(a, b) memcpy(a, b, sizeof(a))
#define pf printf
#define sf scanf
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define fo(i, a, b) for( ll i = a; i <= b; ++i) 
#define fown(i, a, b) for( ll i = a; i >= b; --i)
#define em(p, x) for(ll p=tail[x];p;p=e[p].fr)
#define ll long long
#define wt(a, c, d, s) fo(i, c, d) pf((s), a[i]); puts("")
#define rd(a, c, d) fo(iii, c, d) in((a)[i])
#define N 200010
#define inf 2147483647
#define mod (ll)(1e9 + 7)
#define maxn (1e9+1)
using namespace std;

template<class T> 
T in(T &x) {
	x=0;
	char ch = getchar(); ll f = 0;
	while(ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
	while(ch >= '0' && ch <= '9') x = (x<<1) + (x<<3) + ch - '0', ch = getchar();
	x = f ? -x : x;
	return x;
}

struct cre {
	ll v, id;
}b[N];
bool cmpcre(cre a, cre b) {return a.v < b.v;}

struct room {
	ll pos, t;
}a[N];


ll n, m, ans;

#define ls k << 1, l, mid
#define rs k << 1 | 1, mid + 1, r
ll num[N * 4], SUM[N * 4], Fo[N];

void insert(ll k, ll l, ll r, ll t) {
	++num[k];
	if(l == r) 
	{
		SUM[k] += Fo[l];
		return ;
	}
	ll mid = l + r >> 1;
	if(t <= mid) insert(ls, t); else insert(rs, t);
	
	SUM[k] = SUM[k << 1] + SUM[k <<1 | 1];
	
	return ;
}

ll query(ll k, ll l, ll r, ll p) { // sum = p
	
	if(p == 0) return 0;
	if(l == r) {
		if(Fo[l] == 0 ) {
			return num[k];
		}
		return min(p / Fo[l], num[k]);
	}
	
	ll mid = l + r >> 1;
	
	ll sumls = SUM[k << 1], sumrs = SUM[k << 1 | 1];
	if(sumls >= p) return query(ls, p); else {
		return num[k << 1]+ query(rs, p - sumls);
	}
}

void init() {
	fo(i, 1, n) b[i] = (cre){a[i].t, i};
	
	sort(b + 1, b + 1 + n, cmpcre);
	b[0].v = -1;
	for(ll cnt = 0, i = 1; i <= n ; ++i) {
		if(b[i].v != b[i - 1].v)++cnt;
		Fo[cnt] = a[b[i].id].t;
		a[b[i].id].t = cnt;
	}
}

void work() {
	fo(i, 1, n) {
		ll Far = a[i].pos, rem = m - Far;
		insert(1, 1, n, a[i].t); //after cre
		if(rem <= 0) continue;
		ll tmp = query(1ll, 1ll, n, rem);
		ans = max(ans, tmp);
		
	}
}
bool cmp(room a, room b) {return a.pos < b.pos;}
int main() {
	in(n), in(m);
	
	fo(i, 1, n) in(a[i].pos), in(a[i].t);
	
	sort(a + 1, a + 1 + n, cmp);
	
	init();
	
	work();
	
	pf("%lld\n", ans);
}

O(n log n)

 

O(N log ^2 n) CODE

 

#include<bits/stdc++.h>
#define open(x) freopen(x".in", "r", stdin);freopen(x".out", "w", stdout)
#define mem(a, b) memset(a, b, sizeof(a))
#define mcy(a, b) memcpy(a, b, sizeof(a))
#define pf printf
#define sf scanf
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define fo(i, a, b) for( ll i = a; i <= b; ++i) 
#define fown(i, a, b) for( ll i = a; i >= b; --i)
#define em(p, x) for(ll p=tail[x];p;p=e[p].fr)
#define ll long long
#define wt(a, c, d, s) fo(i, c, d) pf((s), a[i]); puts("")
#define rd(a, c, d) fo(iii, c, d) in((a)[i])
#define N 100010
#define inf 2147483647
#define mod (ll)(1e9 + 7)
#define maxn (1e9+1)
using namespace std;

template<class T> 
T in(T &x) {
	x=0;
	char ch = getchar(); ll f = 0;
	while(ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
	while(ch >= '0' && ch <= '9') x = (x<<1) + (x<<3) + ch - '0', ch = getchar();
	x = f ? -x : x;
	return x;
}

struct cre {
	ll v, id;
}b[N];
bool cmpcre(cre a, cre b) {return a.v < b.v;}

struct room {
	ll pos, t;
}a[N];


ll n, m, ans;

#define ls k << 1, l, mid
#define rs k << 1 | 1, mid + 1, r
ll num[N * 4], SUM[N * 4], Fo[N];

void insert(ll k, ll l, ll r, ll t) {
	++num[k];
	if(l == r) 
	{
		SUM[k] += Fo[l];
		return ;
	}
	ll mid = l + r >> 1;
	if(t <= mid) insert(ls, t); else insert(rs, t);
	
	SUM[k] = SUM[k << 1] + SUM[k <<1 | 1];
	
	return ;
}

ll query(ll k, ll l, ll r, ll p) { // pre p small
	
	if(l == r) {
		int use = min(p, num[k]);
		return Fo[l] * use;
	}
	
	ll mid = l + r >> 1;
	
	ll numls = num[k << 1], numrs = num[k << 1 | 1];
	if(numls >= p) return query(ls, p); else {
		return SUM[k << 1] + query(rs, p - numls);
	}
}

void init() {
	fo(i, 1, n) b[i] = (cre){a[i].t, i};
	
	sort(b + 1, b + 1 + n, cmpcre);
	b[0].v = -1;
	for(ll cnt = 0, i = 1; i <= n ; ++i) {
		if(b[i].v != b[i - 1].v)++cnt;
		Fo[cnt] = a[b[i].id].t;
		a[b[i].id].t = cnt;
	}
}

ll check(ll mid, ll rem) {
	ll sum = query(1, 1, n, mid); //sum(rank-1 , rank mid)
	if(sum > rem) return 0;
	return 1;
}

void work() {
	fo(i, 1, n) {
		ll Far = a[i].pos, rem = m - Far;
		insert(1, 1, n, a[i].t); //after cre
		if(rem <= 0) continue;
		
		ll l = 0, r = i, mid = 0;
		while(l <= r) {
			mid = l + r >> 1;
			if(mid == 76001)
			{
				mid = 76001;
				l = l;
				r = r;
			}
			if(check(mid, rem)) {
				ans = max(ans, mid);
				l = mid + 1;
			} else r = mid - 1;
		}
	
	}
}
bool cmp(room a, room b) {return a.pos < b.pos;}
int main() {
	open("AK");
	in(n), in(m);
	
	fo(i, 1, n) in(a[i].pos), in(a[i].t);
	
	sort(a + 1, a + 1 + n, cmp);
	
	init();
	
	work();
	
	pf("%lld\n", ans);
}

 

<think>嗯,用户这次提出了一个非常具体的技术对比问题,涉及网络数据获取的两种核心方式(爬虫 vs RSS)以及n8n工具链中三个相关节点的区别。看来用户正在搭建自动化新闻系统,需要深入理解不同数据获取方案的适用场景。 用户的上次询问是关于n8n新闻秘书搭建的引用,这次转向技术实现细节,说明ta已从概念阶段进入实操阶段。问题聚焦在三个关键点:基础概念区分(爬虫/RSS)、工具功能对比(RSSRead/Jina AI/Firecrawl)、以及实际应用场景。需要特别注意用户提到的"区分"二字,意味着需要结构化呈现差异点。 关于爬虫与RSS的本质区别,核心在于数据获取方式:RSS是网站主动推送的结构化数据流,而爬虫需要主动解析页面。这个对比需要强调协议特性(RSS基于XML标准)和资源消耗(爬虫对服务器压力更大)。在n8n工具链部分,观察到三个节点形成技术阶梯:RSSRead属于基础数据接入,Jina AI侧重智能解析,Firecrawl则是高级采集工具。有趣的是Firecrawl作为爬虫框架,反而比传统爬虫更"轻"——它通过API抽象了底层复杂度。 用户可能隐含的真实需求是:如何在n8n里用最低成本获取最优质的新闻数据。因此回答中特别补充了组合方案建议,比如"RSSRead+Jina AI"的性价比组合。注意到用户上次引用了[^1],这次在回答中延续了该引用标记保持一致性,但新增的技术细节说明需要独立组织语言。 值得延伸的点:当用户后续处理动态网页时,可能需要补充Puppeteer节点说明;另外Firecrawl的合法性边界需要提醒(已在注意事项标注)。下次如果用户问及具体实施案例,可以展示n8n工作流中如何串联这些节点。 </think>以下是关于爬虫与RSS的区别,以及n8n中 **RSSRead**、**Jina AI**、**Firecrawl** 三大节点的详细对比分析: --- ### **一、爬虫 vs RSS 的本质区别** | **维度** | **RSS** | **爬虫** | |----------------|----------------------------------|----------------------------------| | **工作原理** | 网站主动推送结构化数据流(XML格式) | 程序主动抓取和解析网页内容 | | **数据格式** | 标准化XML(标题/摘要/链接/时间戳) | 需人工解析HTML(非结构化→结构化) | | **时效性** | ⭐⭐⭐⭐ 即时推送更新 | ⭐⭐ 依赖抓取频率(分钟级~天级) | | **资源消耗** | ⭐ 服务器压力小(被动推送) | ⭐⭐⭐ 高频请求易触发反爬 | | **技术门槛** | ⭐ 直接读取XML无需解析 | ⭐⭐⭐ 需处理动态渲染/验证码等 | | **适用场景** | 新闻博客等支持订阅的站点 | 无RSS的网站或需深度数据提取 | > 📌 核心结论: > **RSS = 轻量级“被动接收”**,**爬虫 = 定制化“主动采集”** > 若目标网站提供RSS,优先使用RSS(高效合规);否则需用爬虫。 --- ### **二、n8n中三大节点的功能定位** #### **1. RSSRead 节点** - **定位**:RSS协议专用阅读器 - **输入**:RSS订阅链接(如 `https://news.site/rss.xml`) - **输出**:结构化新闻条目(标题/摘要/发布时间/原文链接) - **优势**: - ✅ 零配置解析XML,自动提取标准化字段 - ✅ 支持定时轮询更新(如每10分钟检查新内容) - **局限**:❌ 仅适用于提供RSS源的网站 #### **2. Jina AI 节点** - **定位**:AI增强型内容理解与摘要生成 - **核心能力**: - 智能提取关键信息(如事件/人物/地点) - 多语言摘要生成(输入长文本→输出精简简报) - 语义搜索(基于内容相似性过滤新闻) - **典型工作流**: `RSSRead → Jina AI`:对订阅的新闻做智能摘要 `爬虫节点 → Jina AI`:解析非结构化网页内容后生成简报 #### **3. Firecrawl 节点** - **定位**:无代码可视化爬虫工具 - **核心功能**: - 🔍 **智能选择器**:点击网页元素自动生成XPath/CSS选择器 - 📦 **数据打包**:将表格/列表/文章转为结构化JSON - ⚡ **反绕过**:内置代理轮换+头部伪装(降低封禁风险) - **对比传统爬虫**: | 传统爬虫 | Firecrawl | |-------------------|-------------------------| | 需写代码解析HTML | 点选界面自动生成选择器 | | 手动处理验证码 | 集成第三方验证码服务 | | 独立部署爬虫集群 | 云端调度+自动扩缩容 | > 示例工作流组合: > `Firecrawl 抓取新闻页 → Jina AI 生成摘要 → 邮件发送` --- ### **三、应用场景决策树** ```mermaid graph TD A[目标网站有RSS?] -->|是| B[RSSRead节点] A -->|否| C[需抓取动态内容?] C -->|是| D[Firecrawl节点] C -->|否| E[静态文本+智能处理需求] E --> F[Jina AI节点] ``` --- ### **四、注意事项** 1. **法律边界**: - RSS读取通常合规 ✅ - 爬虫需遵守 `robots.txt` 且禁止抓取个人隐私 ❗ 2. **性能成本**: - Firecrawl按请求次数计费(深度抓取成本较高) - Jina AI依赖token用量(长文本摘要费用需评估) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值