首页 > 其他分享 >P9290 Luna likes Love 题解

P9290 Luna likes Love 题解

时间:2023-10-15 20:15:20浏览次数:29  
标签:GCC 题解 sum lst large vis Luna P9290 likes

原题:[洛谷P9310]([P9310 EGOI2021] Luna likes Love / 卢娜爱磕 cp - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

题目大意

给定一个长度为 \(\large 2n(n\leq 10^5)\) 的序列,序列中 \(\large 1\sim n\) 的每一个数都恰好出现两次。

可进行两种操作:

  1. 交换两个相邻的数的位置。
  2. 若两个相邻的数相同,则删去这两个数。

问最少进行多少次操作可使序列为空。

思路

显然对于序列中一个在前面出现过的数 \(\large a_i\),我们应该把它交换到与它上一次出现的位置 \(\large lst_{a_i}\) 相邻,并删掉它们,那么代价就是 它们之间剩余的数的数量 \(\large +1\)。

暴力的话,用 \(\large vis_i\) 标记第 \(\large i\) 个数是否已被删去。如果 \(\large a_i\) 在前面出现过,那么让 \(\large ans\) 加上 \(\large\sum\limits_{j=lst_{a_i}}^ivis_j+1\),然后让 \(\large vis_i=vis_{lst_{a_i}}=1\)。

考虑优化。我们可以开一个前缀和数组 \(\large sum_i\),表示前 \(\large i\) 个数里被删去的数的个数。带修,所以用树状数组。那么上面的操作可以变为:让 \(\large ans\) 加上 \(\large i-lst_{a_i}-1+1-sum_i+sum_{lst_{a_i}}\),并 \(\large \operatorname{add}(i,1),\operatorname{add}(lst_{a_i},1)\)。

Code

#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#define reg register
#define int long long
using namespace std;
inline int read()
{
	short f=1;
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')	{if(c=='-')	f=-1;c=getchar();}
	while(c>='0'&&c<='9')	{x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
int n,a,ans,c[1000010],lst[500010];
inline void add(int x)	{for(;x<=2*n;x+=x&-x)	c[x]=-~c[x];}
inline int ask(int x)	{int ans=0;	for(;x;x-=x&-x)	ans+=c[x];	return ans;}
signed main()
{
	n=read();
	for(reg int i=1;i<=2*n;i=-~i)
	{
		a=read();
		if(lst[a])
			ans+=i-lst[a]-ask(i)+ask(lst[a]),add(lst[a]),add(i);
		lst[a]=i;
	}
	return printf("%lld",ans),0;
}

标签:GCC,题解,sum,lst,large,vis,Luna,P9290,likes
From: https://www.cnblogs.com/sorato/p/17766075.html

相关文章

  • 2023 香山杯 RE部分题解
      URL从哪里来 main函数断点下载这里 然后可以看到TempFileName,是out.exe.tmp,还包含路径,直接提取出来用IDA打开,一开始被url误导了,看到了下面的RC4加密去了,使用findcryt软件,看到一个base64加密,交叉引用 在这动态调试这个函数 里面的a1,有一串字符是base64密文 ,解......
  • 【ZROJ2730】简单题 可持久化分块题解
    Description给定一棵\(n\)个节点的树,每次询问编号为\([l,r]\)的点中有多少个是祖先关系。\(n,q\le10^5\)。Solution直接做的话树上的祖先关系不好统计,那么转化到\(\texttt{dfs}\)序上,如果\(u\)是\(v\)的祖先那么\(dfn_u\ledfn_v<dfn_u+siz_u\)。把\([d......
  • AtCoder Beginner Contest 324 DF题题解
    比赛链接D-SquarePermutation其实比较简单,但是比赛时候脑子不转了,竟然在尝试枚举全排列,然后算了一下复杂度直接不会做了。正解应该是枚举完全平方数,底数枚举到\(sqrt(10^{14})\)即可,因为n最大为13。然后统计一下这个完全平方数各个数字出现了多少个,和读入的比较一下是......
  • 网络规划设计师真题解析--HDLC(帧类型)
    HDLC协议通信过程如下图所示,其中属于U帧的是(13)。(2021)A.仅SABME          B.SABME和UA C.SABME、UA和REJ,1    D.SABME、UA和I,0,0答案:B解析:HDLC帧类型如图:bit01234567I帧0N(S)发送帧序号3bit,取值23(0-7)P/FN(R)下一个预期要接收帧的序号3bit,取值23(0-7)S帧10S......
  • ABC324题解
    A/B赛时没打。C暴力判断是相等s[i]==t还是替换了一个字符,或者是添加/删除了一个字符。最后两个判断只需要交换一下\(s\)和\(t\)的顺序就可以共用一个函数了。D注意到\(N\le13\),所以平方数不会超过\(v=10^{13}\),很容易想到暴力枚举\(\sqrtv\)以内的数,判断是否......
  • P9517 drink 题解
    P9517drink题解Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)Part2更新日志2023-08-1218:06文章完成2023-08-1415:53文章通过审核Part3解析这道题考场上用的查找做的。先用一个结构体分别表示......
  • P9686 Judg. 题解
    P9686Judg.题解Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)Part2更新日志2023-10-0215:50文章完成2023-10-0412:37文章通过审核Part3解析一道简单模拟。这道题最简单的方法就是直接在for循......
  • P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    P8741[蓝桥杯2021省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-0923:19文章完成2023-05-0923:20通过审核2023-06-2021:03优化了文章代码格式试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能......
  • P8679 [蓝桥杯 2019 省 B] 填空问题 题解
    P8679[蓝桥杯2019省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-2521:02文章完成2023-05-2711:34文章通过审核2023-06-2021:03优化了文章代码格式试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,......
  • P8684 [蓝桥杯 2019 省 B] 灵能传输 题解
    P8684[蓝桥杯2019省B]灵能传输题解Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)Part2更新日志2023-06-2021:46文章完成2023-07-0308:57文章通过审核2023-08-2118:14更改了文章格式,使文章看起......