首页 > 其他分享 >P4005题解

P4005题解

时间:2023-08-18 21:44:36浏览次数:55  
标签:return int 题解 复杂度 st add query P4005

闲来无事写篇题解

题面传送门

简要题意

一条线段上有 \(n\) 个点成对连接,求所连的线最小交点数。

思路

看到题目中 \(n \le 44\) 自然想到最终复杂度大约在 \(O (2 ^ \frac{n}{2})\) 左右。
经过思考不难发现不论如何两地铁站之间有且只有以下八种方式进行连接:

显然可以暴搜解决,搜索复杂度为 \(O(8 ^ \frac{n}{2})\),每次搜索结束还需要 \(O(n)\) 统计答案,还有一个复杂度为 \(O(n ^ 2)\) 的预处理,不足以通过此题。

考虑优化,由下图可知左侧与右侧方案拼在一起便是绕线段一圈,与其他方案组合时是等效的,时间复杂度优化至 \(O(4 ^ \frac{n}{2})\):

但是它仍无法通过本题,复杂度瓶颈依然在于搜索,思考统计答案的过程,是由左向右扫的,故如果此状态并不会对左侧产生影响,我们就可以将它们剪去:

在转移时只需要四选二即可,此时复杂度已经优化至 \(O(n \cdot 2 ^ \frac{n}{2})\) 经过计算可以发现极限数据依然会超时。

所以我们拿出树状数组来统计答案,即可通过本题。

code

#include <iostream>
#include <cstring>
using namespace std;
const int N = 50;
int n, m = 0x7fffffff, a[N], state[N], l[N], r[N], tot;
struct BIT
{
	int tr[N], siz;
	inline void init(int s) {memset(tr, 0, sizeof(tr)); siz = s;}
	inline int lowbit(int x) {return x & -x;}
	inline void add(int x, int y) {while(x <= siz) tr[x] += y, x += lowbit(x);}
	inline int query(int x) {int ret = 0; while(x) ret += tr[x], x -= lowbit(x); return ret;}
	inline int query_(int x, int y) {return query(y) - query(x - 1);}
}u, d;
inline void dfs(int st, int sum = 0)
{
	if(sum > m) return;
	if(st > tot)
	{
		m = min(m, sum);
		return;
	}
	int a = min(u.query_(l[st], r[st]), d.query_(l[st], n) + u.query_(r[st], n));
	u.add(r[st], 1);
	dfs(st + 1, sum + a);
	u.add(r[st], -1);
	int b = min(d.query_(l[st], r[st]), u.query_(l[st], n) + d.query_(r[st], n));
	d.add(r[st], 1);
	dfs(st + 1, sum + b);
	d.add(r[st], -1);
}
inline void solve()
{
	cin >> n;
	tot = 0;
	for(int i = 1; i <= n; ++i)
		cin >> a[i], state[i] = 1;
	for(int i = 1; i <= n; ++i) for(int j = i + 1; j <= n; ++j) if(a[i] == a[j])
	{
		l[++tot] = i, r[tot] = j;
		break;
	}
	u.init(n);
	d.init(n);
	m = 0x7fffffff;
	dfs(1);
	cout << m << endl;
}
signed main ()
{
#ifndef ONLINE_JUDGE
    freopen ("test.in", "r", stdin);
    freopen ("test.out", "w", stdout);
#endif
	ios::sync_with_stdio (0);
	int T;
	cin >> T;
	while(T--)
		solve();
	return 0;
}

标签:return,int,题解,复杂度,st,add,query,P4005
From: https://www.cnblogs.com/cxz-stO/p/17641681.html

相关文章

  • wsl2 下输出重定向至 clip.exe 出现中文乱码问题解决方案
    背景win10系统在wls2下安装neovim后希望与windows剪切板通信。按教程添加如下配置。--系统剪切板ifvim.fn.has('wsl')then vim.g.clipboard={ name='WslClipboard', copy={ ['+']='clip.exe', ['*']='clip.exe'......
  • 搭配买卖题解
    原题题目描述joe觉得云朵很美,决定去山上的商店买一些云朵。商店里有n多云,云朵被编号为1,2,……,n,并且每朵云都有一个价值。但商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这多云有搭配的云都要买。但是Joe的钱有限,所以他希望买的价值越多越好。输入第1行:n、m、w,表示......
  • 「BJWC2012」冻结题解
    「BJWC2012」冻结题解一.题目"我要成为魔法少女!""那么,以灵魂为代价,你希望得到什么?""我要将有关魔法和奇迹的一切,封印于卡片之中"在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符卡)带来的便捷。现在,不需要立下契约也可以使用魔法了!你还不来试一试?比如,我们在......
  • [AGC004D] Teleporter 题解
    简单贪心。思路可以发现一号节点必然连向自己。由于题目中保证了最初每个点都可以到达一号节点。那么我们发现改完一后,原图变成了一棵十分优美的树。考虑在树上进行贪心。我们贪心的从叶子结点往上走。知道第\(k\)个若还没要到\(1\),就直接连向一号节点。这个贪心也比较......
  • 【题解】#119. 最大整数 题解(2023-07-12更新)
    #119.最大整数题解本文章的访问次数为次。Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)本文已同步至学校网站、博客园。Part2背景本来是不想写这篇题解的,但是由于卡了这个蒟蒻\(1\)整天,故此纪念。Par......
  • CF1575G GCD Festival 题解
    题意给定一个长度为\(n\)的正整数数列\(a\),求\[\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\gcd\left(a_i,a_j\right)\times\gcd\left(i,j\right)\](\(1\len,a_i\le10^5\))。题解根据欧拉函数的性质,可以得出\[n=\sum\limits_{d\midn}\varphi(d)\]该......
  • [AT_ABC106_C]题解(C++)
    PartIPreface原题目\(\text{(Luogu)}\)原题目\(\text{(AtCoder)}\)PartIISketch给定一个字符串\(s\)以及一个整数\(k\)。该字符串为纯数字串。其中的数字\(x\)会在\(k\)天后变为\(x^{k-1}\)个\(x\)。求出\(10^{15}\)天后,串\(s\)的第\(k\)位是什么......
  • [AT_ABC106_D]题解(C++)
    PartIPreface原题目\(\text{(Luogu)}\)原题目\(\text{(AtCoder)}\)PartIISketch给定正整数\(n,m,q\)。接下来给定\(m\)组\(x_i,y_i\),表示一列列车的起始站和终点站。在接下来给定\(q\)组\(l_i,r_i\)。对于每组询问,回答有多少\(x_i\geql_i\operatorna......
  • [AT_ABC106_B]题解(C++)
    PartIPreface原题目\(\text{(Luogu)}\)原题目\(\text{(AtCoder)}\)PartIISketch给定一个正整数\(N\)。求出\(1\simN\)所有因数个数为\(8\)的数的个数。PartIIIAnalysis先输入\(N\)。遍历\(1\simN\)的每个数,记录每个数的因数个数。若因数个数等于\(8\)......
  • [AT_ABC106_A]题解(C++)
    PartIPreface原题目$\text{(Luogu)}$原题目$\text{(AtCoder)}$PartIISketch给定整数$a,b$,输出$(a-1)\times(b-1)$。$2\leqa,b\leq100$。PartIIIAnalysis运用小学知识,进行平移,把几块地拼接在一起。不难看出长为$a-1$,宽为$b-1$,面积为$(a-1)\tim......