首页 > 其他分享 >[ABC339G] Smaller Sum(分块 卡常 qwq)

[ABC339G] Smaller Sum(分块 卡常 qwq)

时间:2024-11-15 13:43:37浏览次数:1  
标签:Smaller last 分块 int Sum 2e5 2000 ABC339G 块长

link

数列分块入门 2 差不多的思路,

对每个块排序,然后就可以在上面二分,求和,发现都是在二分出来的位置前面的数,可以用前缀和预处理出来

分块按照一般分法

n, q 同阶,时间复杂度是 \(O(n\sqrt{n}\log\sqrt{n})\)

然后交上去发现最后几个点 T 了,算一下,大概是 2e5 * 450 * 8 = 7e8,时限是 3.5s,可承受的时间应该是 3.5 * 1e8 = 3.5e8 左右

超了一些

注意这里前后两个 \(\sqrt{n}\) 的意义是不同的,前面表示块数,后面的表示平均块长

注意到 \(f(x) = x\) 和 \(g(x) = \log_2x\) 的增长是有差距的,后一个显然增长更慢

那么我们考虑调整块长,让块数少一点,块长大一点,这样前一个的减少量肯定是远大于后一个的增加量的

比如调整块长为 2000,也就是 \(O(n * \frac{n}{2000} * \log(2000))\),2e5 * 100 * 10 = 2e8

所以,分块卡常一般就是调整块数与块长之间的大小(可能吧

#include <bits/stdc++.h>
#define re register int 
#define int long long 

using namespace std;
const int N = 2e5 + 10;

int n, m, a[N];
int pos[N], L[N], R[N], sum[1010][2010];

vector<int> v[1010];

inline void init()
{
	int t = n / 2000 + (n % 2000 ? 1 : 0);
	for (re i = 1; i <= t; i ++)
	{
		L[i] = (i - 1) * 2000 + 1;
		R[i] = i * 2000;
	}
	
	if (R[t] < n) t ++, L[t] = R[t - 1] + 1, R[t] = n;
	
	for (re i = 1; i <= t; i ++)
	{
		for (re j = L[i]; j <= R[i]; j ++)
		{
			pos[j] = i;
			v[i].push_back(a[j]);
		}
		sort(v[i].begin(), v[i].end());
		
		for (re j = 0; j < v[i].size(); j ++)
		{
			if (j == 0) sum[i][j] = v[i][j];
			else sum[i][j] = sum[i][j - 1] + v[i][j];
		}
	}
//	for (re i = 1; i <= n; i ++) cout << pos[i] << ' '; cout << '\n';	
}

inline int query(int l, int r, int c)
{
	int p = pos[l], q = pos[r];
	int res = 0;
	if (p == q)
	{
		for (re i = l; i <= r; i ++)
			if (a[i] <= c) res += a[i];
	}
	else 
	{
		for (re i = l; i <= R[p]; i ++)
			if (a[i] <= c) res += a[i];
		for (re i = L[q]; i <= r; i ++)
			if (a[i] <= c) res += a[i];
			
		for (re i = p + 1; i <= q - 1; i ++)
		{
			int x = upper_bound(v[i].begin(), v[i].end(), c) - v[i].begin();

			if (x - 1 < 0) continue;
			res += sum[i][x - 1];
		}
	}
	return res;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> n;
	for (re i = 1; i <= n; i ++) cin >> a[i];
	init();
	cin >> m;
	int last = 0;
	while (m --)
	{
		int l, r, c; cin >> l >> r >> c; l ^= last, r ^= last, c ^= last;
		int ans = query(l, r, c);
		cout << ans << '\n';
		last = ans;
	}
	
	return 0;
}

标签:Smaller,last,分块,int,Sum,2e5,2000,ABC339G,块长
From: https://www.cnblogs.com/wenzieee/p/18547801

相关文章

  • AlignSum:数据金字塔与层级微调,提升文本摘要模型性能 | EMNLP'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:AlignSum:DataPyramidHierarchicalFine-tuningforAligningwithHumanSummarizationPreference论文地址:https://arxiv.org/abs/2410.00409论文代码:https://github.com/csyanghan/AlignSum创新点发现在文本......
  • 力扣.1 两数之和 N 种解法 two-sum
    数组系列力扣数据结构之数组-00-概览力扣.53最大子数组和maximum-subarray力扣.128最长连续序列longest-consecutive-sequence力扣.1两数之和N种解法two-sum力扣.167两数之和IItwo-sum-ii力扣.170两数之和IIItwo-sum-iii力扣.653两数之和IVtwo-sum-......
  • 力扣 653. 两数之和 IV 二叉树/binary-tree two-sum IV
    数组系列力扣数据结构之数组-00-概览力扣.53最大子数组和maximum-subarray力扣.128最长连续序列longest-consecutive-sequence力扣.1两数之和N种解法two-sum力扣.167两数之和IItwo-sum-ii力扣.170两数之和IIItwo-sum-iii力扣.653两数之和IVtwo-sum-IV力......
  • Solution - Codeforces 1217E Sum Queries?
    对于这个“好的”的判定条件看起来有点奇怪,不妨结合上题目要求的“最小\(sum\)”一起考虑。因为要最小化\(s_p\),所以一个比较直观的想法是先从选的数个数入手。考虑到如果选的只有\(1\)个数\(a_i\),那么\(sum=a_i\),一定是好的,排除。如果选的是\(2\)个数\(a_i,a_j\),......
  • ResumeSDK简历解析库编程案例
    目录1、软件概述2、编程案例2.1、官网案例(阿里云)2.2、优化案例3、解析结果1、软件概述ResumeSDK简历解析是北京无奇科技有限公司研发,业界领先的智能简历解析和人岗匹配算法厂商,提供专业的AI招聘技术服务,致力于人力资源行业智能化这一进程。并已经上线阿里云或腾讯云,......
  • 力扣 170. 两数之和 III - 数据结构设计 two-sum III
    数组系列力扣数据结构之数组-00-概览力扣.53最大子数组和maximum-subarray力扣.128最长连续序列longest-consecutive-sequence力扣.1两数之和N种解法two-sum力扣.167两数之和IItwo-sum-ii力扣.170两数之和IIItwo-sum-iii力扣.653两数之和IVtwo-sum-IV力......
  • 2025年第五届消费电子与计算机工程国际学术会议(ICCECE 2025) 2025 5th International
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz三、大会介绍四、出席嘉宾五、征稿主题如想"投稿"请点击如下图片......
  • [LeetCode] 2841. Maximum Sum of Almost Unique Subarray
    Youaregivenanintegerarraynumsandtwopositiveintegersmandk.Returnthemaximumsumoutofallalmostuniquesubarraysoflengthkofnums.Ifnosuchsubarrayexists,return0.Asubarrayofnumsisalmostuniqueifitcontainsatleastmdisti......
  • 题解:AT_abc379_e [ABC379E] E - Sum of All Substrings
    很水的一道题。我们先把题目上各地的数字看成一个序列,然后考虑计算该序列分别会对答案的每一位产生多少贡献。具体的,我们从后往前考虑答案的每一位。通过简单推演可知,设你当前考虑到答案的第\(i\)个数字,那么原序列对这一位的贡献为\(\sum_{j=1}^{n-i+1}a_j\timesj\)。这个......
  • [ARC158C] All Pair Digit Sums 题解
    C-AllPairDigitSums题意:设\(f(x)\)为\(x\)的数字和。例如\(f(158)=1+5+8=14\)。给定一个长度为\(N\)的正整数序列\(A\),求\(\sum_{i=1}^{N}\sum_{j=1}^{N}f(A_i+A_j)\)。分析:首先明确\(f(x)\)为\(x\)的数位和。举例情况:若有两个数分别为:\(12,21\)。\[f(......