今天嫖来的两道题

编程题解:C.EvenSubarrays与D.Valiant’sNewMap的解题思路

C. Even Subarrays
题目链接
感觉还是写点题状态比较正常一点
这个题我只能想到 n 2 n^2 n2复杂度的,但是后来想到尺取法,又不知道该咋尺取,还好可以随便看大佬的代码
思路是这样的,他们的复杂度都是 n n n了,首先处理出一个异或和的前缀数组,然后,利用这个前缀和数组往前找,就是从前向后遍历这个前缀和数组,然后把他犯规的那个异或和给减下去,容易想到奇数个因子,显然就是平方数嘛,然后你就和平方数异或呗,如果异或的这个结果在你刚才遍历过的前缀和当中你就把他给减下去,当然需要一些边界的问题
代码:

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long ll;
const int length = 2e5 + 5;
int nums[length];
int main(void)
{
	int t;
	scanf_s("%d", &t);
	for (int i = 0; i < t; i++)
	{
		//memset(t1, 0, sizeof(t1));
		
		int n;
		scanf_s("%d", &n);
		vector<int> t1(n*4+1, 0);
		for (int i = 1; i <= n; i++)
		{
			int x;
			scanf_s("%d", &x);
			nums[i] = nums[i - 1] ^ x;
		}
		ll ans = (ll)n * (n + 1) / 2;
		t1[0] = 1;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 0; j*j <= n*2 ; j++)
			{
				int tmp = nums[i] ^ (j*j);
				ans -= t1[tmp];
			}
			t1[nums[i]]++;
		}
		printf("%lld\n", ans);
	}
}

这块学到了一些,就是尽量少开全局变量,如果空间小的话,就在局部区声明即可。如果初始化一次1e5是很耗时的。
D. Valiant’s New Map
这个题我还是想到的尺取法,这个题是可以尺取的,但是之后咋做我就又不知道了,只能提取出来一堆区间,如果能把这些区间用一种数据结构给组织起来的话就好了嘤,但是我不知道应该用啥数据结构给组织起来,于是额,我就去看了大佬的代码,发现他们是一种暴力的遍历,但是好像又不太暴力,纯暴力的解法就是扩大正方形边长,然后遍历那个正方形,那么这样的话,正方形边长的复杂度是 O ( n 1 / 2 ) O(n^{1/2}) O(n1/2),然后取i,j位置是 O ( n m ) O(nm) O(nm),然后再遍历正方形复杂度是 O ( n 2 ) O(n^2) O(n2),起码得五重循环吧,,这样
但是我看的代码是:每次都取邻近小正方形的值,然后每次取得正方形都扩大一点,拿第一个点来说,第一次是左的11正方形,第二次是左的22正方形,依次扩大,这样的话才能把这个正方形给扩大。
代码:

#include<iostream>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#define min(a,b) ((a<b)?a:b)
using namespace std;
 
int main(void)
{
	int t;
	scanf_s("%d", &t);
	for (int i = 0; i < t; i++)
	{
		int n, m;
		scanf_s("%d%d", &n, &m);
		vector<vector<int>> graph(n + 5, vector<int>(m + 5));
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				scanf_s("%d", &graph[i][j]);
			}
		}
		int ans = 1;
		for (int k = 1; k < n; k++)
		{
			for (int i = 0; i < n-k; i++)
			{
				for (int j = 0; j < m-k; j++)
				{
					 
					graph[i][j] = min(graph[i][j],min(graph[i + 1][j],min(graph[i][j + 1], graph[i + 1][j + 1]) ));
					if (graph[i][j] >= k + 1)
					{
						ans = k + 1;
					}
				}
			}
		}
		printf("%d\n", ans);
	}
}

这个复杂度没太算明白,但是不超时就听离奇的
还是把变量放在局部区

<think>首先,用户的问是关于“使用Python爬虫获取飞卢小说资源的方法”。我需要根据提供的引用和之前的上下文来回答。 回顾系统级指令: - 所有行内数学表达式用$...$格式(但这里可能不涉及数学表达式)。 - 独立公式用$$...$$格式(同样,可能不适用)。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户提供了几个引用: - [^1]: 关于网络小说热度分析,使用Python爬虫。 - [^2]: 关于爬取视频m3u8资源。 - [^3]: 关于爬虫学习日志,似乎是从某个网站抓取文本。 - [^4]: 关于下载小说的代码示例。 用户的问是:“我想查找使用Python爬虫获取飞卢小说资源的方法 请问Python爬虫获取飞卢小说资源的方法” 我需要专注于获取飞卢小说资源的方法。飞卢小说是指飞卢小说网(faloo.com),这在引用[^3]中提到,因为它使用了URL 'https://b.faloo.com/1142238_{}.html'。 参考引用[^3],它提供了一个爬虫代码: - 导入requests, re, time。 - 使用headers伪装浏览器。 - 打开文件追加写入。 - 定义函数get_info(url)来获取内容。 - 使用正则表达式提取内容。 - 主循环遍历URLs,并写入文件。 类似地,引用[^4]提供了一个更完整的示例,用于下载小说,使用BeautifulSoup解析HTML。 因此,对于飞卢小说,我可以基于引用[^3]和[^4]来构建一个方法。 结构化我的回答: 1. **介绍主**:简要解释Python爬虫如何用于获取飞卢小说资源。 2. **关键步骤**: - 分析网页结构。 - 使用requests库获取网页内容。 - 解析HTML(使用BeautifulSoup或正则表达式)。 - 提取小说内容。 - 保存到文件。 3. **示例代码**:提供一个简单的Python爬虫代码示例,针对飞卢小说网。 4. **注意事项**:提醒用户尊重版权,遵守robots.txt,避免频繁请求。 5. **生成相关问**:在回答结束时,添加几个相关问。 使用引用: - 由于引用[^3]和[^4]直接相关,我应该在回答中引用它们。 代码示例: - 基于引用[^3],它使用了正则表达式提取内容:`re.findall('<p>(.*?)</p>',res.content.decode('gbk'),re.S)` - 在引用[^4]中,使用了BeautifulSoup:`texts = bf.find('div', id='content')` - 我应该创建一个针对飞卢小说网的示例。假设飞卢小说网有类似结构。 飞卢小说网的结构: - 从引用[^3]的URL看,'https://b.faloo.com/1142238_{}.html',这表明章节是按数字索引的。 - 我需要假设小说主页和章节链接的结构。 伪代码: 1. 获取小说目录页。 2. 解析章节链接。 3. 遍历每个章节,获取内容。 4. 提取文本内容。 5. 保存到一个文件中。 示例代码: - 导入必要的库:requests, BeautifulSoup(或re),可能需要time。 - 设置headers。 - 定义函数来处理章节。 - 主循环。 确保使用中文回答。 最后,添加相关问: - 例如:如何避免被网站封禁?如何处理动态加载的内容?等。 现在,大纲回答: - **引言**:Python爬虫可以自动化获取飞卢小说网的小说内容。参考相关引用[^3]和[^4]。 - **步骤**: 1. 分析网页结构。 2. 获取网页内容。 3. 解析并提取。 4. 保存数据。 - **示例代码**:提供一个基于飞卢网的代码。 - **注意事项**:版权和道德考虑。 - **相关问**:生成3-5个问。 </think>### Python爬虫获取飞卢小说资源的方法介绍 Python爬虫是一种自动化工具,可用于从飞卢小说网(faloo.com)提取小说资源。这通常涉及分析网站结构、发送HTTP请求、解析HTML内容,并保存提取的数据到本地文件。需要注意的是,飞卢小说网可能设有反爬虫机制(如验证码或IP限制),实际操作时应遵守法律法规和网站的使用协议,避免过度请求以防止被封禁。以下步骤基于站内引用内容(特别是引用[^3]和[^4])构建方法,我会提供一个完整的示例代码。 #### 关键步骤 1. **网页结构分析**: - 飞卢小说网通常使用章节化结构。例如,小说主页列出所有章节链接(如`https://b.faloo.com/小说ID.html`),每个章节对应一个URL(如`https://b.faloo.com/小说ID_{章节号}.html`)。 - 内容通常位于HTML的`<p>`标签或特定div中(如`id="content"`)。引用[^3]中使用正则表达式提取内容,而引用[^4]则推荐BeautifulSoup解析器更稳定[^3][^4]。 2. **HTTP请求**: - 使用Python的`requests`库发送GET请求获取网页内容。 - 设置`User-Agent`头部伪装浏览器(如引用[^3]中的`headers`),以避免被识别为爬虫。 3. **内容解析**: - **解析章节链接**:从目录页提取所有章节URL(类似于引用[^4]的`find_all('a')`方法)。 - **提取文本内容**:使用BeautifulSoup或正则表达式匹配内容区域(如引用[^3]的正则`<p>(.*?)</p>`)。推荐BeautifulSoup,因为它更健壮且易于维护。 4. **数据保存**: - 将提取的文本写入本地文件(如`.txt`格式),引用[^4]展示了如何追加写入文件并添加章节标。 #### 完整示例代码 以下是一个针对飞卢小说网的简单爬虫代码示例。假设小说ID为`1142238`(从引用[^3]中提取),您可以替换为实际目标小说ID。代码使用BeautifulSoup解析器提高准确性,并添加延时(`time.sleep`)以减少请求频率。 ```python import requests import time from bs4 import BeautifulSoup # 伪装浏览器头部,避免被识别为爬虫 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36' } def get_chapter_content(url): """获取单个章节内容""" response = requests.get(url, headers=headers) if response.status_code == 200: # 解析HTML,飞卢网内容通常在div或p标签中 soup = BeautifulSoup(response.content.decode('gbk'), 'html.parser') # 飞卢常用gbk编码 content_div = soup.find('div', id='content') # 假设内容在id="content"的div中 if content_div: # 清理多余空格和换行 content = content_div.get_text().strip().replace('\xa0', ' ') return content return None if __name__ == '__main__': book_id = '1142238' # 替换为目标小说ID base_url = f'https://b.faloo.com/{book_id}_' # 基础URL格式 chapters = range(1, 45) # 假设章节1到44,需根据实际目录调整 book_name = '飞卢小说.txt' # 保存文件名 # 创建或打开文件 with open(book_name, 'a', encoding='utf-8') as f: for i in chapters: url = base_url + f'{i}.html' content = get_chapter_content(url) if content: f.write(f'章节{i}\n') # 写入章节标 f.write(content + '\n\n') print(f'已保存章节{i}') else: print(f'章节{i}获取失败') time.sleep(1.5) # 添加延时,避免高频请求 print(f'小说已保存到 {book_name}') ``` #### 注意事项 - **版权与道德**:飞卢小说网是付费平台,爬取资源仅供个人学习使用。务必遵守网站`robots.txt`(通常禁止爬虫),避免商业化用途以避免法律风险。参考引用[^2]强调尊重版权[^2]。 - **反爬应对**:如果网站有动态加载(如JavaScript),需使用Selenium库(但会增加复杂性)。引用[^4]的延时策略(`time.sleep`)可减少封禁风险。 - **编码问**:飞卢网常用GBK编码(如引用[^3]),需在代码中正确处理。 - **错误处理**:添加异常捕获(如`try-except`)以处理网络错误或页面结构变化。 通过以上方法,您可以高效获取飞卢小说资源。如果网站结构更新,需重新分析HTML标签。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九思Atopos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值