题意: 要从四个数组中各选一个数,使得这四个数之和为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&…
暴力n的四次方, 然而可以用中途相遇法的思想, 分左边两个数和右边两个数来判断, 最后合起来判断. 一边是n平方logn, 合起来是n平方logn(枚举n平方, 二分logn) (1)两种比较方式是相反的, 所以第二次可以直接把数组倒过来做, 代码可以省很多. (2) 我们现在来讨论3 1 4 2这种情况(1最小, 2次小以此类推) 大家观察可以发现, 中间两个数字刚好是最大和最小.所以我们可以枚举中间两个数, 往两边找. 先看1, 我们可以预处理出每一个数左侧比它大的数字有哪些.然后找到1的时…
这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多时间.紫书里面把这叫做中途相遇法,双向广搜有点这个方法的味道.这里用到了二分查找, 总的时间复杂度是n的二次方乘logn #include<cstdio> #include<vector> #include<algorithm> #define REP(i, a, b) f…
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…
题意:给定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两个集合中…
---恢复内容开始--- 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…
题目 传送门: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<…
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),每个学生的答题情况和正确题数已知,求标准答案可能有多少种. 如果标准答案只有一种则输出标准答案,否则输出解的个数. 题目思路: […
用中途相遇法的思想来解题.分别枚举两边,和直接暴力枚举四个数组比可以降低时间复杂度. 这里用到一个很实用的技巧: 求长度为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…
用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #include<cstdio> #include<vector> #include<cstring> #include<queue> #include<algorithm> #define REP(i, a, b) for(int i = (a); i <…
很奇怪, 看到网上用的都是匈牙利算法求最大基数匹配 紫书上压根没讲这个算法, 而是用最大流求的. 难道是因为第一个人用匈牙利算法然后其他所有的博客都是看这个博客的吗? 很有可能-- 回归正题. 题目中只差一个数字的时候可以匹配, 然后求最少模板数. 那么肯定匹配的越多就越少, 也就是求最多匹配多少. 这个时候我就想到了二分图最大基数匹配. 那么很容易想到可以匹配的一组之间就连一条弧. 但问题是怎么分成两类??分类的目的是让同一类之间没有弧, 这样才是二分图. 后来发现因为匹配的一组只有一个数字不…
本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有包含关系的时候怎么选, 然后发现当两个区间只能放一个的时候时间更短而截 至时间更长的时候,显然更优.然后我就试着每个区间放的时候后后面的比较, 如果两个区间只能放一个, 而且 下个区间更优, 那么当前的就不选.然后排除掉这些区间之后, 能选的就选. 交上去WA.然后我发现中间的区间排除了,但是前面和后面的区间…
这道题的意思紫书上是错误的-- 难怪一开始我非常奇怪为什么第二个样例输出的是2, 按照紫书上的意思应该是22 然后就不管了,先写, 然后就WA了. 然后看了https://blog.csdn.net/wcr1996/article/details/43774331 发现是题意是错误的. 是从1到n的排列变成给的排列, 而不是反过来 其他人的博客都是逆向思维来写, 也就是我原来写误打误撞的那样, 只不过操作反过来, 以及最后 输出是反的.这种方法很值得学习 其实正向也不难, 无非是设置了一种新的优…
书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最优的移动士兵的方式, 使得与敌方相邻的阵营中最少的士兵最多 因为只能在我方的阵营中移动士兵, 所以建模的时候不用加入地方阵营的点. 首先因为士兵只能移动一次, 所以把点拆成两个点, 入点和出点. 设阵营士兵的人数为k[i] 那么源点到入点连一条弧, 容量为k[i], 然后入点和出点再连 一条弧, 容…
一开始要符合题目条件, 那么肯定没有任何一个点是孤立的, 也就是说没有点的度数是1 所以我就想让度数是1的叶子节点相互连起来.然后WA 然后看这哥们的博客 https://blog.csdn.net/trote_w/article/details/79504280 原来连叶子的时候, 有三个叶子的时候, 中间的留到下一次连,左右连起来. 我之前是直接按照顺序连. 按照顺序那么边可能会封闭在一颗子树里面, 比如一颗子树有两个叶子 ,然后他们互相连接. 这个时候把 子树的根 和 子树的根的父亲连的边…
知道是构造法但是想了挺久没有什么思路. 然后去找博客竟然只有一篇!!https://blog.csdn.net/no_name233/article/details/51909300 然后博客里面又说貌似UVa数据有问题过不了, 而他的代码我也懂, 就没有自己写一遍了. 但是它这篇博客分析问题的方法很值得我学习. (1)简化问题.先分析只有1和2的简单情况, 然后就同理推出三了.我想的时候一直在三个一直 考虑, 所以把问题变的很复杂, 自然想不出来. (2)转化.这里在讨论三的时候试图把用三把前…
这道题貌似可以用滑动窗口或者单调栈做, 但是我都没有用到. 这道题要求连续子序列中和乘上最小值最大, 那么我们就可以求出每一个元素, 以它为最小值的的最大区间的值, 然后取max就ok了.那么怎么求呢? 我可以初始化出一个第一个小于当前元素的的元素的位置, 也就是说初始化出以当前元素为最小值的 左右端点, 求出之后枚举一遍就ok了. 那么关键是怎么求呢? 这里有一点扫描法的味道. 假设当前序列为1243 以求右端点为例, 右端点的位置也就是在右侧第一个小于当前元素的元素的位置. 那么如果序列是递…
开始的时候一看这题感觉很难,觉得肯定有什么很快的办法 不能暴力做(受了上一题10-13的影响) 然后一看那个函数感觉无从下手. 然后看了博客发现,原来这道题就是直接暴力-- 因为n的范围为10的7次方啊 ,不会超时 自己以后要注意数据范围 #include<cstdio> #include<cmath> #include<iostream> #define REP(i, a, b) for(int i = (a); i < (b); i++) using name…
首先看这道题目,我预感商数肯定是有规律的排列的,于是我打表找一下规律 100 / 1 = 100 100 / 2 = 50  100 / 3 = 33  100 / 4 = 25  100 / 5 = 20  100 / 6 = 16  100 / 7 = 14  100 / 8 = 12  100 / 9 = 11  100 / 10 = 10  100 / 11 = 9   100 / 12 = 8   100 / 13 = 7   100 / 14 = 7   100 / 15 = 6  …
自己一直在纠结这个串的构造方法 而没有观察串本身的规律-- 2的63次方用 unsigned long long 然后可以发现串是递归构造的. 将串分成1,1,2,4,8,16, 然后会发现s串里面1个s-2串,2个s-3串,3个s-4串最后加上s 如第三个串1003 是由1个1串(1), 2个0串(0)最后加上自己3构成的 因此根据这个性质递归求就好了 #include<cstdio> #include<vector> #include<algorithm> #def…
You are working in a team that writes Incredibly Customizable Programming Codewriter (ICPC) which is basically a text editor with bells and whistles. You are working on a module that takes a piece of code containing some definitions or other tabular…
A Ducci sequence is a sequence of n-tuples of integers. Given an n-tuple of integers (a1, a2, · · · , an), the next n-tuple in the sequence is formed by taking the absolute differences of neighboring integers: (a1, a2, · · · , an) → (|a1 − a2|, |a2 −…
题目链接  点击打开链接 这道题分为两个部分, 一用搜索枚举每种可能, 二计算表达式的值, 有挺多细节需要注意 特别注意我的代码中在计算表达式的值中用到了一个!(代码枚举中的!表示不加符号, 我现在说的是表达式中的!), 这个是 虚拟的, 是为了数字栈里面只有一个数字的时候不会被计算,因为计算至少要两个数个时候. 这个时候f函数返回0是不会执行50 行的while的.比如2100-100,这当执行到'-'时候不能用cal, 因为只有2100一个数字. 具体看代码. #include<cstdio…
参考了这哥们的博客 https://blog.csdn.net/hyqsblog/article/details/46980287  (1)atoi可以char数组转int, 头文件 cstdlib  (2)小技巧,倒过来存是用[len-i-1]  (3)这道题的关键在于怎么去构造这个搜索,以什么方式去搜索.这里搜索专门用两个参数来控制第几个数的第几个位置, 还有一个参数是改变的次数, 也就是深度.这里还要逆向思维,check的时候最后一个数, 可以不用递归了, 而是由前面两个数反过来推然后判断…
这道题一开始我想的是在排序之后只在头和尾往中间靠近来找木块, 然后就WA, 事实证明这种方法是错误的. 然后参考了别人的博客.发现别人是直接暴搜, 但是加了很多剪枝, 所以不会超时. 我也想过这个做法,但是因为觉得肯定超时所以没有写, 我显然没有想到可以这么剪枝 #include<cstdio> #include<cstring> #include<functional> #include<algorithm> #define REP(i, a, b) fo…
参考了http://www.bubuko.com/infodetail-1276416.html 首先是逆向思维, 向把每条边看作一条路径, 然后再去合并 然后我们讨论怎么样合并时最优的 我们讨论当前的点u 那么首先直观感受, 因为如果要合并一次, 就需要两条边, 所以最多可以合并的不会超过度数(与其相连的边的总权值)的一半. 但这只是直观感受, 并不是所有的情况都可以合并的了这么多. 当与当前点相连的边中有一条边的权值大于度数的一半的时候, 不能合并 这么多. 比如说连了两条边, 一条边权值为…