首页 > 其他分享 >CF1045G 题解

CF1045G 题解

时间:2022-10-21 20:44:39浏览次数:83  
标签:return int 题解 mid iq CF1045G include Data

前言

题目传送门!

更好的阅读体验?

和模版稍有不同的 cdq 分治。

思路

cdq 是离线算法,所以我们可以先给 \(x_i\) 离散化一下。

同时,记录下 \((x_i - r_i)\) 与 \((x_i + r_i)\) 离散化后对应的结果,即视野范围。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5 + 5;
struct Data {int pos, lpos, rpos, iq, R;} a[N], t[N];
int x[N], unq[N];
bool cmp(Data p, Data q) {return p.R > q.R;}
int n, k;
LL ans;

int idx[N]; //树状数组板子
int lowbit(int x) {return x & -x;}
void update(int i, int k) {for (; i <= n; i += lowbit(i)) idx[i] += k;}
int query(int i)
{
	int sum = 0;
	for (; i; i -= lowbit(i)) sum += idx[i];
	return sum;
}
int sum(int i, int j) {return query(j) - query(i - 1);}

void MergeSort(int l, int r) //cdq 分治!
{
	if (l >= r) return;
	int mid = (l + r) >> 1;
	MergeSort(l, mid), MergeSort(mid + 1, r);
	int L = l, R = l - 1; //类似单调队列,利用 k 的有序性不断更新 L 和 R
	for (int i = mid + 1; i <= r; i++)
	{
		while (L <= mid && a[i].iq - a[L].iq > k) update(a[L++].pos, -1);
		while (R < mid && a[R + 1].iq - a[i].iq <= k) update(a[++R].pos, 1);
		ans += sum(a[i].lpos, a[i].rpos);
	}
	for (int i = L; i <= R; i++) update(a[i].pos, -1); //清空 
	
	int i = l, j = mid + 1; //归并排序
	int cur = 0;
	while (i <= mid && j <= r)
		if (a[i].iq <= a[j].iq) t[++cur] = a[i], i++;
		else t[++cur] = a[j], j++;
	while (i <= mid) t[++cur] = a[i], i++;
	while (j <= r) t[++cur] = a[j], j++;
	for (i = l, j = 1; j <= cur; i++, j++) a[i] = t[j];
}
int main()
{
	scanf("%d%d", &n, &k);
	for (int i = 1; i <= n; i++) scanf("%d%d%d", &x[i], &a[i].R, &a[i].iq), unq[i] = x[i];
	sort(unq + 1, unq + n + 1); //离散化ing 
	int m = unique(unq + 1, unq + n + 1) - unq - 1;
	for (int i = 1; i <= n; i++)
	{
		a[i].pos = lower_bound(unq + 1, unq + m + 1, x[i]) - unq;
		a[i].lpos = lower_bound(unq + 1, unq + m + 1, x[i] - a[i].R) - unq;
		a[i].rpos = upper_bound(unq + 1, unq + m + 1, x[i] + a[i].R) - unq - 1;
	}
	sort(a + 1, a + n + 1, cmp);
	MergeSort(1, n);
	printf("%lld", ans);
	return 0;
}

希望能帮助到大家!

标签:return,int,题解,mid,iq,CF1045G,include,Data
From: https://www.cnblogs.com/liangbowen/p/16814716.html

相关文章

  • 关于LoRa常见问题解答
    前面的文章中,小编有写过LORA技术低功耗广域网络,在大大小小的行业活动中,一直都是物联网的一个热门话题。LoRa主要在全球免费频段运行,包括433、868、915MHz等。后来有很多......
  • 「题解」Codeforces 1730F Almost Sorted
    给定一个长度为\(n\)的置换\(p\),以及一个正整数\(k\).对于一个置换\(q\),要求对于所有满足\(1\leqi<j\leqn\)的\(i,j\),有以下不等式成立:\[p_{q_i}\leqp_{q_j}+......
  • accoders NOI #5014. 树上询问(query) 题解
    昨天刚刚做过一道类似的题,没想到在模拟赛当中出现了。题目描述有一棵\(n\)个结点的树,有\(m\)次询问,每次询问给你两个整数\(l,r\),问存在多少个整数\(k\)使得从\(l......
  • 顺丰科技智慧物流校园技术挑战赛 一份题解
    我只是做了代码裁缝的角色罢了目录​​试题地址​​​​1​​​​2​​​​3​​​​4​​​​5​​试题地址​​https://leetcode.cn/contest/sf-tech/​​1DFS判定有向图......
  • 题解 P5527 [Ynoi2012] NOIP2016 人生巅峰
    人生第一道Ynoi,同时也是1k通过。不卡常不难写,小清新Ynoi真的不多见了。前置知识:抽屉原理,树状数组,bitset,动态规划基础。首先考虑一个事实,当这个区间够长是必然有解的......
  • CF645E Intellectual Inquiry 题解
    传送门|无耻地宣传我的博客(矩乘代码在最后)看一眼题,没什么思路,那大概就是个dp了。先求已知序列的方案数。考虑怎么设计状态。因为本质不同,如果设\(f[i]\)表示,......
  • electron升级到20版本后,禁用第三方cookie、跨域问题解决方法
    最近公司的electron项目从13升级到最新的20版本,导致qq登录失效问题,特此记录1.qq扫码登录失效升级后之前的老版本可以扫码登录,但是新版本扫码登录后,页面直接刷新,没有登录......
  • P8251 [NOI Online 2022 提高组] 丹钓战 题解
    本文写于2022-03-2614:45:14。原博客地址题目链接算法(倍增)$O((n+q)\logn)$为简便,把元素$(a_i,b_i)$称为元素$i$。对一个区间$[l,r]$模拟一遍,从空栈开始,头......
  • wget --no-check-certificate 问题解决
    很多时候一些老旧机器因为ca证书的问题,造成下载异常,实际上解决方法很简单,一种方法是参考提示就行了解决方法添加--no-check-certificate使用.wgetrc文件(以后都就可......
  • AcCoders 10477:【省选基础数据结构 树链剖分】【GDOI2016】疯狂动物城 题解
    算法:树链剖分,可持久化线段树。题目大意给定\(n\)个结点的一棵树,\(m\)次操作,操作有三种:将\(x\)至\(y\)最短路径上的所有点的权值加上\(delta\)。对于\(x\)至......