CF961E Tufurama 题解

这篇具有很好参考价值的文章主要介绍了CF961E Tufurama 题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CF961E Tufurama 题解

二维数点做法

题意

  给定长度为 \(n\) 的序列 \(a\),统计二元组 \((i,j)\) 的个数,使得该二元组满足 \(1 \leq i < j \leq n, a_i \geq j, a_j \geq i\)\(n\)\(2 \times 10^{5}\) 级别,\(a_i\)\(1 \times 10^{9}\) 级别。

思路分析

  我们考虑把序列中 \(n\) 个元素看成 \((i,a_i)\) 坐标的点,至于平面直角坐标系中。我们先忽略“\(1 \leq i < j \leq n\)”的条件。可以发现,对于某一个 \(i\),我们要统计的是所有的 \(j\) 中满足 \(j \leq a_i, a_j \geq i\) 的点的个数,也就是横坐标小于等于当前点、纵坐标大于等于当前点的点的个数。画出图就是下面的样子:

CF961E Tufurama 题解

  至于具体怎么处理数点过程,我们按照先横坐标再纵坐标的方式对于点排序。然后我们可以把每个询问 \((a_i,i)\) 做排序,代表查询横坐标小于等于 \(a_i\),纵坐标大于等于 \(i\) 的点的个数。我们横坐标从小到大一列一列地统计点(即一根扫描线在 x 轴上从小往大扫),用树状数组维护纵坐标上离散化过后的每个位置的已统计点的点数前缀和,统计纵坐标大于等于 \(i\) 的区间内的点数,就可以知道对应的答案了。

  那么我们怎么处理 \(1 \leq i < j \leq n\) 的条件呢?首先我们考虑在的统计中,出现的 \(i = j\) 的情况,可以发现,如果这样的情况被统计到了,(代入条件可得)就会满足 \(a_i \geq i, a_i \geq i\),于是我们直接在序列上遍历统计 \(a_i \geq i\) 的个数,在总统计答案中减掉就行。

  然后就是 \(i < j\) 的条件如何处理,我们发现 \(a_i \geq j, a_j \geq i\)\(a_j \geq i, a_i \geq j\)(即交换 \(i,j\) 后)是等效的,也就是说每一个满足条件的点对被统计了两遍。于是我们在刚刚的基础上,把统计答案除以二,就得到了正确结果。文章来源地址https://www.toymoban.com/news/detail-711794.html

代码

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 5e5 + 5;
const int M = 5e5 + 5;

int n,m;
int a[N];
int ycnt;

int qcnt;
int yrk[N];

struct quest
{
	int x,y;
}que[N*2];

int ans[N];

bool cmp1(quest xx,quest yy)
{
	return xx.x < yy.x;
}

int t[N];

int lowbit(int xx)
{
	return xx & (-xx);
}

void add(int pos,int k)
{
	for(int i = pos;i <= ycnt;i += lowbit(i))
		t[i] += k;
}

int ask(int pos)
{
	int ans = 0;
	for(int i = pos;i >= 1;i -= lowbit(i))
		ans += t[i];
	return ans;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n;
	LL samecnt = 0;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
		if(a[i] >= i)
			samecnt++;
		yrk[i] = a[i];
		que[++qcnt] = {a[i],i};
	}
	sort(que+1,que+1+n,cmp1);
	sort(yrk+1,yrk+1+n);
	ycnt = unique(yrk+1,yrk+1+n)-1-yrk;
	int idx = 1;
	LL ans = 0;
	for(int i = 1;i <= n;i++)
	{
		while(idx <= que[i].x && idx <= n)
		{
			int tmpidx = lower_bound(yrk+1,yrk+1+ycnt,a[idx])-yrk;
			add(tmpidx,+1);
			idx++;
		}
		int tmpfd = lower_bound(yrk+1,yrk+1+ycnt,que[i].y)-yrk-1;
		ans += (LL)(ask(ycnt)-ask(tmpfd));
	}
	ans -= samecnt;
	ans /= 2;
	cout << ans << "\n";
	return 0;
}

到了这里,关于CF961E Tufurama 题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CF1011A Stages 题解

    题目意思: 给你一个长度为 n n n 的字符串 a a a ,在这个字符串中选一个长度为 k k k 的好串(好串标准是啥自己去题目里看吧),问这个好串的最小价值是多少。 思路: 贪心。 首先我们将字符串 a a a 里面的字符进行排序。 因为要最小的价值,所以排好序后的 a a a 的第一个

    2024年02月12日
    浏览(31)
  • CF1145G AI Takeover 题解

    人工智能取得了进展。在这一题中,我们考虑的是石头剪刀布游戏。 然而,比赛的前一天晚上有一群人把机器人弄坏了,于是使用一个程序替代。 您需要找到一个策略,使您能够获胜。祝你好运! 为了方便,石头剪刀布分别用三个字符表示: R , P , S 。 本题有 6 个测试点,

    2024年03月26日
    浏览(44)
  • CF338D GCD Table 题解

    你有一个长度为 (k) 的数列 (a) , 询问是否存在 (xin[1,n]~~~yin[1,m]) 使得 (forall i~~~ gcd(x,y+i-1)=a_i) 。 我们转换一下可以得到: [forall i ~~left{ begin{matrix}xequiv 0pmod{a_i} \\\\y+i-1equiv 0pmod{a_i}end{matrix}right.] 前面一个 (x) 很好解决,直接 最大公倍数 。 (y) 可以转化一下:

    2024年02月07日
    浏览(38)
  • CF1178F1 Short Colorful Strip 题解

    题目描述 这是F题的第一个子任务。F1和F2的区别仅在对于m和时间的限制上 有n+1种颜色标号从0到n,我们有一条全部染成颜色0的长为m的纸带。 Alice拿着刷子通过以下的过程来给纸带染色: 我们按照从1到n的顺序进行染色,进行每次染色时,我们选取一个区间[ai,bi],0=aibi=m,并

    2024年02月01日
    浏览(37)
  • CF963B Destruction of a Tree 题解

      洛谷题目链接   这里提供一个较为朴素的 DP 想法。   给定一棵树,节点个数不超过 (2 times 10^5) ,每次可以删掉度数为偶数的点。问最后能不能删完;能删完给出删除方案。   首先可以随便选一个点作为根。   其次,我们考虑在一棵子树的删除情况,我们令

    2024年02月08日
    浏览(37)
  • CF1881F Minimum Maximum Distance 题解 贪心+DFS

    You have a tree with n n n vertices, some of which are marked. A tree is a connected undirected graph without cycles. Let f i f_i f i ​ denote the maximum distance from vertex i i i to any of the marked vertices. Your task is to find the minimum value of f i f_i f i ​ among all vertices. For example, in the tree shown in the example, vertices 2 2 2 , 6 6

    2024年02月22日
    浏览(42)
  • CF1178F2 Long Colorful Strip 题解 搜索

    题目描述 这是 F 题的第二个子任务。F1 和 F2 的区别仅在对于 m m m 和时间的限制上 有 n + 1 n+1 n + 1 种颜色标号从 0 0 0 到 n n n ,我们有一条全部染成颜色 0 0 0 的长为 m m m 的纸带。 Alice 拿着刷子通过以下的过程来给纸带染色: 我们按照从 1 1 1 到 n n n 的顺序进行染色,进行每

    2024年02月01日
    浏览(40)
  • 题解 # 二维矩阵最大矩形问题#

    小明有一张N*M的方格纸,且部分小方格中涂了颜色,部分小方格还是空白。 给出N (2Ns30)和M(2sMs30)的值,及每个小方格的状态((被涂了颜色小方格用数字1表示,空白小方格用数字0表示); 请帮助小明找出最大的矩形空白区域,并输出该矩形空白区域由多少个小方格组成。 例如

    2024年02月07日
    浏览(48)
  • 【题解】二分查找-I、二维数组中的查找

    题目链接:二分查找-I 解题思路:遍历 代码如下: 这种解题思路很明显没有很好的利用题目中强调的数组是升序的,既然是升序,那肯定前半部分偏小,后半部分偏大,如果我们能知道应该去前半部分还是后半部分寻找target,效率相对就提升很多了,于是我们有了下面的分

    2024年02月14日
    浏览(43)
  • [USACO11MAR] Brownie Slicing G题解(二分+二维前缀和+矩阵分割)

    题目地址 P3017 [USACO11MAR] Brownie Slicing G 二分最大化最小值 切割思路: 一行一行进行切割,如果这一行可以切割出b块大于等于mid的块,就开始切割下一行 如果无法切割出b块,就把正在切割的行与下一行拼起来一起切割 最后通过能切割出b块的水平块块够不够a条来判断m是否合

    2024年02月07日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包