[题解][洛谷]_U75702/P5462_X龙珠_论何为字典序
赛时嫌麻烦,没写
赛后自闭了,写了一下午
题目描述
“X龙珠”是一款益智小游戏。游戏中有 n(2|n)n(2∣n) 个编号互不相同龙珠按照给定的顺序排成一个队列,每个龙珠上面都有一个编号。每次操作时,选择并取出龙珠队列中相邻的两个龙珠,放到目标队列的末尾(目标队列最开始是空的,且这两个龙珠的前后顺序不变),然后去除原龙珠队列的空隙。反复多次,直到原龙珠队列为空。可见,因为决策不一样导致目标队列顺序不一样。现在请求出所有方案中、目标队列字典序最大的方案。只需要给出目标队列即可。
对字典序的理解,是这道题的关键.
我最初的想法:字典序,不就是从头比到尾吗?那就比呗!
把数字存成字符串,每次挑字典序最大的,这样就能保证整体字典序最大
不就是个简单的贪心吗?
我写了一个双向链表,保存每个元素前后"龙珠"的标号,然后用STL的堆每次取最大的"龙珠"
flag存是否在原队列
// U75702
#include <iostream>
#include <vector>
#include <queue>
using namespace std;struct node {int num; int fr, to; bool flag;} nums[100001];
struct cmpQ {bool operator()(int a, int b) {return nums[a].num < nums[b].num;}};
priority_queue<int, vector<int>, cmpQ>pq;
#define TOP (nums[pq.top()])
#define NEX (nums[(nums[pq.top()]).to])
int n;int main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> nums[i].num;
nums[i].fr = i - 1; nums[i].to = i + 1;
nums[i].flag = true;
pq.push(i);
}while (!pq.empty()) {
if (TOP.flag && TOP.to <= n) {
cout << TOP.num << ' ' << NEX.num << ' ';
NEX.flag = false;
nums[TOP.fr].to = NEX.to;
nums[NEX.to].fr = TOP.fr;
}
pq.pop();
}return 0;
}
可我似乎低估了出题人的心机
我甚至重写了一遍代码以确保代码的正确性
最后,定位到问题:何为字典序
在数学中,字典或词典顺序(也称为词汇顺序,字典顺序,字母顺序或词典顺序)是基于字母顺序排列的单词按字母顺序排列的方法。 这种泛化主要在于定义有序完全有序集合(通常称为字母表)的元素的序列(通常称为计算机科学中的单词)的总顺序。
对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。
太恶毒了
最后的改动过只有:
struct node {int num; int fr, to; bool flag;} nums[100001];
然后就A了
不过,神奇的是,dalao们的代码怎么那么短?是不是用了什么神奇的方式存链表?
#include <cstdio>
int n,a[100001],k[100001],x[100001],i;
int main()
{
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d",&a[i]);
k[a[i-1]]=a[i];
x[a[i]]=a[i-1];}
for(i=n;i>=1;--i)
if(k[i])printf("%d %d ",i,k[i]),k[x[i]]=k[k[i]],x[k[x[i]]]=x[i],k[k[i]]=0;
return 0;
}
看不懂,懒得看,给大家看看吧
[题解][洛谷]_U75702/P5462_X龙珠_论何为字典序的更多相关文章
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 题解-洛谷P5217 贫穷
洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...
- 题解 洛谷 P2010 【回文日期】
By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...
- 题解 洛谷P2158 【[SDOI2008]仪仗队】
本文搬自本人洛谷博客 题目 本文进行了一定的更新 优化了 Markdown 中 Latex 语句的运用,加强了可读性 补充了"我们仍不曾知晓得 消失的 性质5 ",加强了推导的严谨 ...
随机推荐
- js 数组的forEach 函数
var numbers = [4, 9, 16, 25]; function myFunction(item, index) { console.log("item:" + ite ...
- IE8 浏览器文本模式变为杂项(quirks)页面变形的解决方法
IE8 浏览器文本模式(document.documentMode)变为杂项(quirks)页面变形的解决方法. 正常情况下 document.documentMode 输出为8,而变为杂项之后doc ...
- mystrcat
#include<stdio.h> //如果一个数组做为函数的形参传递,那么数组可以在被调用的函数中修改 //有时候不希望这个事发生,所以对形参采用const参数 //size_t str ...
- idea maven projects 工具栏按钮的作用
1.Execute Maven Goal 弹出可执行的 Maven 命令的输入框.有些情况下我们需要通过书写某些执行命令来构建项目,就可以通过此按钮 2.Toggle Offline Mode 英文 ...
- 「TJOI2019」大中锋的游乐场
题目链接 问题分析 比较明显的最短路模型.需要堆优化的dij.建图的时候注意细节就好. 参考程序 #include <bits/stdc++.h> #define LL long long ...
- [2019杭电多校第一场][hdu6582]Path(最短路&&最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 题意:删掉边使得1到n的最短路改变,删掉边的代价为该边的边权.求最小代价. 比赛时一片浆糊,赛后 ...
- 剑指offer-Q60 n个骰子的点数
python版本代码 g_maxValue = 6 # 单个骰子最大的点数 def PrintProbability(number): ''' :param number: 骰子的个数 :return ...
- Reduce pandas memory size
有关pandas存储的理论 简单又实用的pandas技巧:如何将内存占用降低90% 代码 Reducing DataFrame memory size by ~65% 上篇的改进 缓解pandas中D ...
- kill 与 killall和过滤后杀掉
1.绝杀 kill -9 PID 杀掉单一进程 例如:kill -9 pid号 同意的 kill -s SIGKILL 这个强大和危险的命令迫使进程在运行时突然终止,进程在结束后不能自我清 ...
- C++入门经典-例5.10-指针作为返回值
1:代码如下: // 5.10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...