首页 > 其他分享 >[题解]CF61E Enemy is weak

[题解]CF61E Enemy is weak

时间:2024-04-25 19:34:24浏览次数:14  
标签:CF61E Enemy int 题解 weak mid long ans

CF61E Enemy is weak

如下图,第\(i\)行\(j\)列表示第\(j\)个数结尾,向前长度为\(i\)的逆序子序列个数。

image

递推方式见下图。

  • 第一行全为\(1\)。
  • 要填第\(2\)行的值,就往前找所有\(>\)当前元素的位置,把它们第\(1\)行的值加起来。
  • 要填第\(3\)行的值,就往前找所有\(>\)当前元素的位置,把它们第\(2\)行的值加起来。
    image
    最终第\(3\)行值的和就是我们要求的结果。

怎么快速找出\(>\)当前元素的答案和呢?我们可以用线段树(树状数组)。发现数据范围太大,需要离散化。

线段树/树状数组需要维护第\(1\)行和第\(2\)行,第\(3\)行不参与运算,现求现加即可。

这里用线段树实现,注意开long long

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define lc (x<<1)
#define rc (x<<1|1)
#define N 1000010
using namespace std;
int n,a[N],b[N];
int sum[2][4*N];
int ans=0;
void update(int x){
	sum[0][x]=sum[0][lc]+sum[0][rc];
	sum[1][x]=sum[1][lc]+sum[1][rc];
}
void build(int l,int r,int x){
	if(l==r){
		sum[0][x]=sum[1][x]=0;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,lc);
	build(mid+1,r,rc);
	update(x);
}
void change(int a,int v1,int v2,int l,int r,int x){
	if(l==r){
		sum[0][x]+=v1,sum[1][x]+=v2;
		return;
	}
	int mid=(l+r)>>1;
	if(a<=mid) change(a,v1,v2,l,mid,lc);
	else change(a,v1,v2,mid+1,r,rc);
	update(x);
}
pair<int,int> query(int a,int b,int l,int r,int x){
	if(a<=l&&r<=b) return {sum[0][x],sum[1][x]};
	int mid=(l+r)>>1;
	pair<int,int> ans;
	if(a<=mid){
		auto t=query(a,b,l,mid,lc);
		ans.first+=t.first,ans.second+=t.second;
	}
	if(b>mid){
		auto t=query(a,b,mid+1,r,rc);
		ans.first+=t.first,ans.second+=t.second;
	}
	return ans;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+1+n);
	int tn=unique(b+1,b+1+n)-b-1;
	for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+tn,a[i])-b;
	build(1,n,1);
	for(int i=1;i<=n;i++){
		auto q=query(a[i]+1,tn,1,n,1);
		//q.first表示第1行的和
		//q.second表示第2行的和
		change(a[i],1,q.first,1,n,1);
		ans+=q.second;
	}
	cout<<ans;
	return 0;
}

标签:CF61E,Enemy,int,题解,weak,mid,long,ans
From: https://www.cnblogs.com/Sinktank/p/18158370

相关文章

  • 「洛谷」题解:P1996 约瑟夫问题
    题目传送门先看题目:题目描述\(n\)个人围成一圈,从第一个人开始报数,数到\(m\)的人出列,再由下一个人重新从\(1\)开始报数,数到\(m\)的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰......
  • [题解] [NOIP2011 提高组] Mayan 游戏
    [题解][NOIP2011提高组]Mayan游戏题目描述有一个\(7\)行\(5\)列的格子棋盘,有的格子上有方块。方块有重力,即如果一个方块下面没有其他方块,他就会往下掉,直到触底或者下面有方块为止。每个方块都有自己的颜色,如果连着三个竖着或者横着的方块颜色相同,它们就会消除。如果出......
  • CF1774G Segment Covering 题解
    题目链接点击打开链接题目解法这么牛的题!!!我第一眼看到偶\(-\)奇想到的是LGV/xk有一堆线段的题先考虑有没有线段之间的特殊关系这道题中,如果有线段\(x\)包含线段\(y\),则线段\(x\)是无用的,因为如果选了\(x\),那么选不选\(y\)无所谓,因为是偶\(-\)奇,所以贡献抵消了......
  • 重庆软航H5 PDF签章产品经nginx代理之后在浏览器中在线打开PDF盖章时提示:签章失败:网络
    问题现象:问题描述:在系统中集成了软航H5PDF签章产品,软航H5PDF签章产品的对应服务是通过nginx代理的,在奇安信浏览器中在线打开PDF点击产品的工具栏上的盖章按钮:选定印章之后,在PDF文档上选定盖章位置之后,提示:签章失败:网络错误。最近在做这个软航H5PDF电子签章产品的测试,就简......
  • CF518F 题解
    观察到一条管道的拐点数量只有\(3\)种可能的取值:没有拐点,即管道呈现一条直线。有\(1\)个拐点。有\(2\)个拐点。分别对应了下面三种情况:....#....#.*..#*********..***...#....#*...#*.#.........
  • 2023CPCC河南省赛题解+总结
    2023CPCC河南省赛题解+总结比赛链接:https://codeforces.com/gym/104354答题情况:答题情况开题顺序是:A-F-H-K-E-B-G题面链接:https://codeforces.com/gym/104354/attachments/download/20061/statements_2.pdfProblemA.小水獭游河南签到题,队友写的题意:  给你一个字符......
  • git命令下,mac环境下载依赖相关报错问题解决方案
    1.安装fundry框架curl-Lhttps://foundry.paradigm.xyz|bash2.写入环境变量source/Users/xx/.bashrc3.foundryup问题1报错:致命错误:无法访问'https://github.com/foundry-rs/forge-std解决方案:设置hosts文件:添加指定url的ip地址:140.82.112.4github.com185.1......
  • 【题解】A566.三点共线
    题目大意,给定在平面直角坐标系中的多个点,判断有多少个三元组\((A,B,C)\)满足共线性质。题目链接:A566.三点共线。大题思路就是暴力所有的三元组,判断三个元素的斜率是否相同即可。其实还有其他方法可以做,我个人感觉用斜率法最简单。有几点需要注意:在计算斜率的时候,如果多......
  • ABC350 E - Toward 0 题解
    AtCoderBeginnerContest350E-Toward0原题地址题意给定四个数NAXY,你可以对N进行以下两种操作。花费X的代价将N变成\(\lfloor\cfrac{N}{A}\rfloor\)花费Y的代价掷一颗骰子,设掷出结果是i,将N变成\(\lfloor\cfrac{N}{i}\rfloor\)你需要执行若干次......
  • 前端调用DRI后端API出现跨域资源共享(CORS)问题解决办法
    目录1.引言2.跨源资源共享和实现方法3.在Django项目中配置django-cors-headers库Reference1.引言在进行后端API开发时,有时会遇到“跨域资源共享(CORS)请求...被阻止“的错误,如图1所示。本文讲解如何在使用DRF(DjangoRESTFramework)的后端API开发项目中解决这个问题。Ac......