首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
bzoj4278[ONTAK2015]Tasowanie & bzoj1692[USACO 2007Dec]队列变换(Best Cow Line) 贪心正确性证明
】的更多相关文章
bzoj4278[ONTAK2015]Tasowanie & bzoj1692[USACO 2007Dec]队列变换(Best Cow Line) 贪心正确性证明
做法网上到处都有就不说了. 这题其实是之前做的….不过由于人太傻现在才想明白比较字典序进行贪心的正确性…. 方便起见,在两个串的最右端都加上很大但不相同的字符,避免第lcp+1个字符不存在的边界. 如果两个串当前最左端的字符不相同显然选较小的. 否则,设两个剩下的串的lcp长度为x,那么两个串的第lcp+1个字符(此时必然都存在这个字符,因为我们之前在右端加了很大的哨兵)必然不同.不妨假设第一个串的第lcp+1个字符较小. 考虑先选第二个串的第1个字符的某种方案. 如果这种方案中,我们先选了第二…
bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换*&&bzoj1692[Usaco2007 Dec]队列变换*
bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换 bzoj1692[Usaco2007 Dec]队列变换 题意: 有一个奶牛队列.每次可以在原来队列的首端或是尾端牵出一头奶牛,把她安排到新队列的尾部,然后对剩余的奶牛队列重复以上的操作,直到所有奶牛都被插到了新的队列里.这样得到的队列,就是FJ拉去登记的最终的奶牛队列. 求对于给定的奶牛们的初始位置,计算出可能得到的字典序最小的队列.队列大小≤30000. 题解: 有一个结论:如果当前队列中的队首元素不等于队尾元…
[bzoj1692][Usaco2007 Dec]队列变换_后缀数组_贪心
队列变换 bzoj-1692 Usaco-2007 Dec 题目大意:给定一个长度为$n$的字符串.每次从头或尾取出一个字符加到另一个字符串里.要求变换后生成的字符串字典序最小,求字典序最小的字符串. 注释:$1\le n\le 3\cdot 10^4$. 想法: 考虑暴力怎么做: 每次把当前字符串左右较小的取出来.如果一样就对着往中间枚举,直到不一样为止. 这样时间复杂度为$O(n^2)$,全是一样的字符即可卡掉. 显然上述过程我们就是比较正反两个字符串谁的字典序更小对吧. 那么我们把原串翻转…
【BZOJ-1692&1640】队列变换 后缀数组 + 贪心
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1153 Solved: 482[Submit][Status][Discuss] Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. 今年,竞赛委员会在接受队伍报名时,采用了一种新的登记规则:他们把所…
BZOJ1692: [Usaco2007 Dec]队列变换
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 594 Solved: 246[Submit][Status] Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. 今年,竞赛委员会在接受队伍报名时,采用了一种新的登记规则:他们把所有队伍中奶牛名字的首…
[bzoj1692] [Usaco2007 Dec]队列变换 (hash||暴力)
本题同bzoj1640...双倍经验双倍幸福 虽然数据范围n=3w然而O(n²)毫无压力= = http://blog.csdn.net/xueyifan1993/article/details/7773750 只要比较两个字符串的大小就行了= =果断hash? 具体一点的话就是从前往后和从后往前各hash一遍..其他的懒得复述了= = 一开始开了unsigned long long然后被卡在了第二位..... 然后作死用unsigned int直接68ms#1了2333 #include<cs…
BZOJ4278 : [ONTAK2015]Tasowanie
首先在串的末尾加上1000,然后进行归并,每次取字典序较小的那个后缀即可. 用hash+二分支持查询lcp,时间复杂度$O(n\log n)$. #include<cstdio> typedef long long ll; const int N=200010,P=31,D=1000173169; int n,m,i,j,k,pow[N],a[N],b[N],f[N],g[N]; inline void read(int&a){char c;while(!(((c=getchar())…
[bzoj1692][Usaco2007 Dec]队列变换——贪心+后缀数组
Brief Description 给定一个数列,您每次可以把数列的最前面的数或最后面的数移动到新数列的开头,使得新数列字典序最小.输出这个新序列. Algorithm Design 首先我们可以使用贪心得到一个\(O(n^2)\)的算法. 然后我们可以使用后缀数组把这个题目做成\(\Theta(nlogn)\)(倍增)或者\(\Theta(n)\)(DC3) 不过这个题目数据太水,第一种方法就可以水过了,简直坑. Code #include <algorithm> #include <…
BZOJ4278 [ONTAK2015]Tasowanie[后缀数组+贪心]
题目 求两数组归并后的数组最小字典序排列. 嘛,可能本人在贪心这块还是太弱了(或者说什么都弱),如果不知道是字符串题估计也想不起来用sa. 显然看得出归并时字典序小的那个数组先往里面加,这就是要比较两数组后缀的rank,方法就把两串相拼做后缀排序后比较. 这里附下贪心正确性证明,反正我不太会,只是感性认识一下. Upd:突然想起来这题其实可以hash+二分比较,码量稍小,不想写了 #include<bits/stdc++.h> using namespace std; typedef long…
[BZOJ4278] [ONTAK2015]Tasowanie 贪心+后缀数组
题目链接 最近做题目好像有点东一榔头西一棒.好吧其实订正模拟题的时候需要用到什么感觉不太熟的就写一下吧. 显然直接贪心,比较两个点后面的串的字典序,小就选谁就可以了. 可以把两个串接起来,加一个\(inf\)分隔.然后用\(SA\)的\(rank\)数组就可以比较大小了. 也可以用哈希+二分比较. #include<bits/stdc++.h> using namespace std; #define fec(i,x,y) (int i=head[x],y=g[i].to;i;i=g[i].n…