首页 > 其他分享 >CF641E 题解

CF641E 题解

时间:2022-10-18 12:34:34浏览次数:86  
标签:MergeSort int 题解 mid CF641E include

前言

题目传送门!

更好的阅读体验?

非常套路的 cdq 分治。

思路

把所有操作统一存下来。将 \(x\) 离散化。

\(i\) 能被 \(j\) 统计,前提是 \(a_i\) 的操作时间早于 \(a_j\)。

然后分操作即可。具体参照代码。

完整代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5;
struct Data {int op, time, val, id;} a[N], t[N];
int cnt[N], ans[N];
void MergeSort(int l, int r)
{
	if (l >= r) return;
	int mid = (l + r) >> 1;
	MergeSort(l, mid), MergeSort(mid + 1, r);
	int i = l, j = mid + 1, cur = 0;
	while (i <= mid && j <= r)
		if (a[i].time <= a[j].time)
		{
			if (a[i].op == 1) cnt[a[i].val]++;
			if (a[i].op == 2) cnt[a[i].val]--;
			t[++cur] = a[i], i++;
		}
		else
		{
			if (a[j].op == 3) ans[a[j].id] += cnt[a[j].val];
			t[++cur] = a[j], j++;
		}
	while (i <= mid)
	{
		if (a[i].op == 1) cnt[a[i].val]++;
		if (a[i].op == 2) cnt[a[i].val]--;
		t[++cur] = a[i], i++;
	}
	while (j <= r)
	{
		if (a[j].op == 3) ans[a[j].id] += cnt[a[j].val];
		t[++cur] = a[j], j++;
	}
	for (int i = l; i <= mid; i++) cnt[a[i].val] = 0;
	for (int i = l, j = 1; j <= cur; i++, j++) a[i] = t[j];
}
int unq[N]; //离散化 
int main()
{
	int n, q = 0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d%d%d", &a[i].op, &a[i].time, &a[i].val);
		unq[i] = a[i].val, a[i].id = (a[i].op == 3 ? ++q : 0);
	}
	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].val = lower_bound(unq + 1, unq + m + 1, a[i].val) - unq;
	MergeSort(1, n);
	for (int i = 1; i <= q; i++) printf("%d\n", ans[i]);
	return 0;
}

希望能帮助到大家!

标签:MergeSort,int,题解,mid,CF641E,include
From: https://www.cnblogs.com/liangbowen/p/16802191.html

相关文章

  • 蓝桥杯第二次模拟赛JAVA题解
    目录​​第一题......
  • Codeforces Round #827 (Div. 4) 复盘+题解
    原比赛链接复盘:ABC签到,手速太慢了。D捣鼓了好久才想起来从更小的值域出发去做。E简单二分答案。然后就timeout了。D题搞错方向浪费太久时间了。F思维题,拐两个弯再$r......
  • P7868 VUDU 题解
    P7868VUDU题解提供一种不需要使用离散化,从\(0/1\)分数规划的角度推导的思路。然而考试的时候没想到求逆序对挂掉了分析题意很清楚了,就是求给出的序列中,对于一段任意长......
  • CF309E 题解
    11:30,过题。12:50,忘记做法。吃饭时不该看未来日记的,Ynoj害人不浅(确信)。以上为个人吐槽。题目大意不知道题目翻译是个啥。。。但讨论区有大佬给出了精确的翻译。我改得......
  • AcCoders 10692:【2022NOIP联测10 10月17日】交换(swap) 题解
    考虑把一次交换产生的贡献记录在交换的两个数字中较小的那个数字上。则构造一个好的序列的过程可以看成是:按照从小到大的顺序枚举每个数,每次选择将这个数放在序列的左边或......
  • POJ 3760. 魔兽世界(修订版) 题解
    一句话,大模拟,照着题意敲就完了。写的期间甚至因为疫情导致程序被锁在了机房www//3760.魔兽世界(修订版)#include<iostream>#include<cstring>#include<string>u......
  • 【题解】CF11D A Simple Task(状压 DP)
    【题解】CF11DASimpleTask题目链接CF11DASimpleTask题意概述给定一张\(n\)个点\(m\)条边的无向图,无重边自环,点数不超过\(19\),求无向图中环的数量。思路分......
  • [题解] Atcoder Regular Contest ARC 151 A B C D E 题解
    点我看题昨天刚打的ARC,题目质量还是不错的。A-EqualHammingDistances对于一个位置i,如果\(S_i=T_i\),那么不管\(U\)的这个位置填什么,对到\(S\)和\(T\)的海明距离增量......
  • CF463C 题解
    题目传送门题目分析贪心练手好题。首先,国际象棋中象的走法是斜着走,也就是这样:通过上面的图我们不难看出,如果一个象在黑格,另外一个在白格,那么它们之间一定不会互相攻击......
  • P3755 题解
    前言题目传送门!更好的阅读体验?为啥要用分块呀,cdq分治真好写!前置知识:三维偏序模版。思路记\(s_{i,j}\)表示:对角坐标为\((-\infty,-\infty)\)到\((i,j)\)的......