预处理一下每个元素左边和右边最近的相邻元素. 对于一个区间[l, r]和区间内某一个元素,这个元素在这个区间唯一当且仅当左右两边最近的相邻元素不在这个区间内.这样就可以O(1)完成查询. 首先查找整个字符串是否有唯一元素,如果没有则整个序列是无聊的. 有的话,假设这个唯一元素下标是p,那么如果子序列[0, p-1]和[p+1, n-1]是不无聊的,那么这个序列就是不无聊的. 关于查找的话,如果只从一端查找唯一元素,最坏的情况就是O(n).所以可以从两端进行查找,总的时间复杂度是O(nlogn).…
这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多时间.紫书里面把这叫做中途相遇法,双向广搜有点这个方法的味道.这里用到了二分查找, 总的时间复杂度是n的二次方乘logn #include<cstdio> #include<vector> #include<algorithm> #define REP(i, a, b) f…
暴力n的四次方, 然而可以用中途相遇法的思想, 分左边两个数和右边两个数来判断, 最后合起来判断. 一边是n平方logn, 合起来是n平方logn(枚举n平方, 二分logn) (1)两种比较方式是相反的, 所以第二次可以直接把数组倒过来做, 代码可以省很多. (2) 我们现在来讨论3 1 4 2这种情况(1最小, 2次小以此类推) 大家观察可以发现, 中间两个数字刚好是最大和最小.所以我们可以枚举中间两个数, 往两边找. 先看1, 我们可以预处理出每一个数左侧比它大的数字有哪些.然后找到1的时…
uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (Mage, Tank, Fighter,Assassin and Marksman). A team consists of 5 players (one from each kind) and the goal is to kill amonster with L life points. The…
摘要:中途相遇.对比map,快排+二分查找,Hash效率. n是4000的级别,直接O(n^4)肯定超,所以中途相遇法,O(n^2)的时间枚举其中两个的和,O(n^2)的时间枚举其他两个的和的相反数,然后O(logN)的时间查询是否存在. 首先试了下map,果断TLE //TLE #include<cstdio> #include<algorithm> #include<map> using namespace std; ; ][maxn]; map<int,in…
题意:给定4个N元素几个A,B,C,D,要求分别从中选取一个元素a,b,c,d使得a+b+c+d=0.问有多少种选法.(N≤4000,D≤2^28) 解法:首先我们从最直接最暴力的方法开始思考:四重循环O(n^4)枚举:三重循环枚举,把剩下的一个集合排序后二分查找,O(n^3 log n).在进一步想,运用"中途相遇法":从两个不同的方向来解决问题,最后"汇集"到一起的方法.(有类似于"双向广度优先搜索"的思想)通过两重循环枚举出A,B两个集合中…
uva 1608 不无聊的序列 紫书上有这样一道题: 如果一个序列的任意连续子序列中都至少有一个只出现一次的元素,则称这个序列时不无聊的.输入一个n个元素的序列,判断它是不是无聊的序列.n<=200000. 首先,在整个序列中找到只出现一次的元素ai.如果不能找到,那它就是无聊的.不然,就可以退出当前循环,递归判断[1, i-1]和[i+1, n]是不是无聊的序列. 然而怎么找ai很重要.如果从一头开始找,那么最差情况下的时间复杂度就是O(n^2)的.而如果从两头开始找,那么最差情况就变成了ai…
Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic period dinosaur skeleton. The paleontologists have decided to forward them to the paleontology museum. Unfortunately, the dinosaur was so huge, that the…
Difference Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 62    Accepted Submission(s): 19 Problem Description Little Ruins is playing a number game, first he chooses two positive integers y an…
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11674&courseid=0 题目大意: N个学生M道题(1<=N<=12,1<=M<=30),每道题只有正误两种选项(0 1),每个学生的答题情况和正确题数已知,求标准答案可能有多少种. 如果标准答案只有一种则输出标准答案,否则输出解的个数. 题目思路: […
---恢复内容开始--- J - 中途相遇法 Time Limit:9000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description   The SUM problem can be formulated as follows: given four lists A, B, C, D<tex2html_verbatim_mark> of integer values, comput…
例题25  侏罗纪(Jurassic Remains, NEERC 2003, LA 2965) 给定n个大写字母组成的字符串.选择尽量多的串,使得每个大写字母都能出现偶数次. [输入格式] 输入包含多组数据.每组数据的第一行为正整数n(1≤n≤24),以下n行每行包含一个大写字母组成的字符串. [输出格式] 对于每组数据,第一行输出整数k,即字符串个数的最大值.第二行按照从小到大的顺序输出选中的k个字符串的编号(字符串按照输入顺序编号为1~n). [样例输入] 6 ABD EG GE ABE…
In the game Lizard Era: Beginning the protagonist will travel with three companions: Lynn, Meliana and Worrigan. Overall the game has nmandatory quests. To perform each of them, you need to take exactly two companions. The attitude of each of the com…
题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include <bits/stdc++.h> using namespace std; ; map<int,int> table; ?:bitcount(x>>)+(x&);} int main(){ int n,A[maxn]; ]; && n){ ;i<…
用中途相遇法的思想来解题.分别枚举两边,和直接暴力枚举四个数组比可以降低时间复杂度. 这里用到一个很实用的技巧: 求长度为n的有序数组a中的数k的个数num? num=upper_bound(a,a+n,k)-lower_bound(a,a+n,k); #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include&l…
题目链接:https://vjudge.net/problem/UVALive-2965 题意: 有很多字符串(24),选出一些字符串,要求这些字符串的字母都是偶数次: 分析: 暴力2^24也很大了,中途相遇法:其原理就是一分为二,两组解组成问题的解: 考虑到,每个字符串出现的次数没什么关系,只要关于他的奇偶,那么就有二进制,1出现奇数次,0偶数次: 每一个字符串对应于一个A位向量, 在前半个表中,选择一些字符串(2^12),又得到一个位向量 x,要是表中存在,则选择 字符串个数较多者: 然后枚…
Description [题目描述] 蛤布斯有n个物品和一个大小为m的背包,每个物品有大小和价值,它希望你帮它求出背包里最多能放下多少价值的物品. [输入数据] 第一行两个整数n,m.接下来n行每行两个整数xi,wi,表示第i个物品的大小和价值. [输出数据] 一行一个整数表示最大价值. [样例输入] 5 100 95 80 4 18 3 11 99 100 2 10 [样例输出] 101 [数据范围] 对于20%的数据,xi<=1500. 对于另外30%的数据,wi<=1500. 对于100…
貌似挖的坑也够多了....好多都没填,这篇最后会不会TJ还得看心情TUT 看过大白书的人应该都会发现一种神奇的算法:中途相遇法.(在第58页)这种算法将以空间换时间的思路运用到了极致,但事实上它在密码学中的作用更大 DES在过去的很长时间里都是作为标准出现的,人们花了很多力气都没有发现它有什么唯密文攻击的方法(当然,当密钥恰巧为很少的几个弱密钥时是可行的TUT 不过我们不考虑这种情况),只有暴力破解这一条道.你如果去自习查看下它S-box的构造,肯定为赞赞叹它算法的精妙 DES一共有64bit密…
题目链接 基本思路:最理想的方法是预处理处所有胡牌的状态的哈希值,然后对于每组输入,枚举每种新加入的牌,然后用哈希检验是否满足胡牌的条件.然而不幸的是,由于胡牌的状态数过多(4个眼+一对将),预处理的复杂度太高($O(34^5)$),因此需要想办法优化一下. 我们可以预处理出所有“加上一对将之后可以胡牌”的状态,这样预处理的复杂度就成了$O(34^4)$,在可接受的范围内了.在检验的时候,只需要枚举去掉哪一对将,就可以$O(1)$检验是否能胡牌了(有种中途相遇的感觉),另外两种特殊情况单独判断即…
如果一个序列中是否存在一段连续子序列中的每个元素在该子序列中都出现了至少两次,那么这个序列是无聊的,反正则不无聊.给你一个长度为n(n<=200000)的序列,判断这个序列是否无聊. 稀里糊涂AC的一道题. 如果一个序列不无聊,那么一定至少存在一个独一无二的元素.如果找到了该元素,那么只需分别判断该元素两侧的子序列是否无聊即可.找到一个独一无二的元素的期望时间复杂度为$O(n)$(n为当前序列长度),显然如果该独一无二的元素在中间的话,则复杂度$T(n)=2T(n/2)+O(n)=O(nlogn…
题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的. 先预处理出每个元素之前和之后相同元素出现的位置,就可以在O(1)的时间判断出一个元素在一个区间内是否唯一. 每次从大的序列中找一个唯一元素,包含这个元素的就不用判断了,那么以这个元素为分界线,在分别判断两边的序列. 如果只从一遍找的话,最坏的情况是唯一元素在另一头T(n) = T(n-1)+O(n) >= O(n^2)的. 所以应该从两边开始找,T(n) = 2T…
题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的. 析:首先如果整个序列中有一个只出过一次的元素,假设是第 p 个,那么我就可以看他左边和右边的序列是不是不无聊,也就是判断 1~p-1  和 p+1 ~ n,这可以用分治来进行处理. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #…
题意:如果一个序列的任意连续子序列中至少有一个只出现一次的元素,则称这个序列式为non-boring.输入一个n(n≤200000)个元素的序列A(各个元素均为109以内的非负整数),判断它是否无聊. 分析: 1.记录下每个元素左边和右边最近的与它值相同的元素的位置. 2.如果某个元素在某一序列中只出现过一次,那这个序列中所有包含该元素的子序列都是non-boring,因此只需要研究在这个序列中以该元素为分界线,其左边和右边的子序列是否无聊即可. 3.因为如果单独从左扫或从右扫,最坏情况可能是在…
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4483 题意: 如果一个序列的任意连续子序列中至少有一个只出现一次的元素,则称这个序列是不无聊(non-boring)的.输入一个n(n≤200000)个元素的序列A(各个元素均为1e9以内的非负整数),判断它是不是不无聊的. 分析: 在整个序列中找一个只出现一次的元素,如果不存在,…
好诡异的一个题啊 紫书上关于从左边找还是从两边往中间找的讨论没有看懂,怎么一下就找到唯一的元素了(⊙_⊙?) 方法就是用的书上讲的方法,类似于uva 11572,不过这个题需要预处理存下两边的最近的相同数的位置 ;i<=n;i++) { prev[i]=r[a[i]]; next[prev[i]]=i; r[a[i]]=i;}//记录元素a[i]上次出现的位置,因为是从左向右遍历,所以上次出现的位置正好是prev[i]要求的 //prev[i],与 i位置的元素 相同的左边最近的元素的位置 //…
题链: https://vjudge.net/problem/UVA-1608#author=chenchonghan题解: 分治 如果一个区间[l,r]里面在p位置出现了一个只出现一次的元素,(如果不存在该元素,该区间就是boring的) 那么必然包含p的子区间都是non-boring的. 即如果存在boring的区间,必然是[l,p-1],[p+1,r]的子区间. 所以继续递归处理上面两个区间即可. (判断某个元素是否在区间里只出现一次,只需考虑它左边第一个与它相同的元素或它右边第一个相同的…
题目: 如果一个序列的任意连续的子序列中至少有一个只出现一次的元素,则称这个序列是不无聊的.输入一个n(n≤200000)个元素的序列A(各个元素均为109以内的非负整数),判断它是不是不无聊的. 思路: 分治法,平常确实用的非常的少,这次借这个题目熟悉一下.代码思路是学习的紫书上的代码的. 在[L,R]范围内枚举是唯一的数,从这个数的左右两边开始判断是不是左右两边的序列都符合唯一性条件.(包含这个唯一数的区间都是符合条件的,所以只要在从两边开始枚举就可以了.) 代码: #include <bi…
题意: 要从四个数组中各选一个数,使得这四个数之和为0,求合法的方案数. 分析: 首先枚举A+B所有可能的值,排序. 然后枚举所有-C-D的值在其中用二分法查找. #include <cstdio> #include <algorithm> using namespace std; + ; int A[maxn], B[maxn], C[maxn], D[maxn], sum[maxn*maxn], cnt; int main() { //freopen("in.txt&…
4 Values whose Sum is 0 题目链接:https://cn.vjudge.net/problem/UVA-1152 ——每天在线,欢迎留言谈论. 题目大意: 给定4个n(1<=n<=4000)元素的集合 A.B.C.D ,从4个集合中分别选取一个元素a, b,c,d.求满足 a+b+c+d=0的对数. 思路: 直接分别枚举 a,b,c,d ,坑定炸了.我们先枚举 a+b并储存,在B.C中枚举找出(-c-d)后进行比较即可. 亮点: 由于a+b,中会有值相等的不同组合,如果使…
训练指南p.59 #include <cstdio> #include <cstring> #include <cstdlib> #include <map> using namespace std; ; int N; int A[MAXN]; ]; map<int , int> table; int bitcount( int x ) { ; while ( x ) { ) ++res; x >>= ; } return res;…