让你在平面上取一个点,使得其到给定的所有点的距离和最小. 就是“费马点”. 模拟退火……日后学习一下,这是从网上扒的,先存下. #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<ctime> using namespace std; int n; double xx,yy,ans,t; struct point{double x,y;}p[…
题意: 给定S1串,长度100w,S2串,长度1k.问它俩的LCS. f(i,j)表示S2串前i个字符,LCS为j时,最少需要的S1串的前缀长度.转移的时候,枚举下一个字符在S1的位置即可.(可以预处理出S1中每个字符出现位置的vector,在其中二分)…
一个区域,垂直分成三块,每块有一个速度限制,问你从左下角跑到右上角的最短时间. 将区域看作三块折射率不同的介质,可以证明,按照光路跑时间最短. 于是可以二分第一个入射角,此时可以推出射到最右侧边界上的位置,看什么时候恰好射到右上角即可. 这份sb代码貌似挂精度了. #include<cstdio> #include<iostream> #include<cmath> using namespace std; #define EPS 0.0000000001 int T,…
题意:给你n个两两不同的零一串,Alice在其中选定一个,Bob去猜,每次询问某一位是0 or 1.问你最坏情况下最少要猜几次. f(22...2)表示当前状态的最小步数,2表示这位没确定,1表示确定为1,0表示确定为0. 首先枚举去问哪一位,从这些方案中取最小者. 这里的MAX(a,b)进行重定义,如果a,b中存在-1,则为真的max(a,b),否则为max(a,b)+1. f(222)=min(MAX(f(022),f(122)),MAX(f(202),f(212)),MAX(f(220),…
题意:给你一个大整数X的素因子分解形式,每个因子不超过m.问你能否找到两个数n,k,k<=n<=m,使得C(n,k)=X. 不妨取对数,把乘法转换成加法.枚举n,然后去找最大的k(<=n/2),使得ln(C(n,k))<=ln(X),然后用哈希去验证是否恰好等于ln(X). 由于n和k有单调性,所以枚举其实是O(m). 妈的这个哈希思想贼巧妙啊,因为对数使得精度爆炸,所以不妨同步弄个哈希值,来判相等. opencup的标程: #include <stdio.h> #in…
题意:给你n个点,点带权,任意两点之间的边权是它们的点权的异或值中“1”的个数,问你该图的最小生成树. 看似是个完全图,实际上有很多边是废的.类似……卡诺图的思想?从读入的点出发BFS,每次只到改变它的任意一位所能到达的点(不论是否读入). 记录每个点是从哪个读入点BFS过来的,当第二次访问某个点的时候,就将它的两个源头(一次是第一次的时候标记的,一次是第二次过来的)连一条边. 这样最多连m(位数)*n条边,实际上比这个值更小. 这种做法可以将很多显然不会出现在最小生成树里的边排除掉. open…
题意:有n个数,除了空集外,它们会形成2^n-1个子集,给你这些子集的和的结果,让你还原原来的n个数. 假设原数是3 5 16, 那么它们形成3 5 8 16 19 21 24, 那么第一轮取出开头的数(3),然后从当前最大的数(24)中减去它,然后必然会产生一个与其相等的数(21),将其一并删去(这个过程利用单调性,使用两个指针进行单调的从右向左的移动即可),然后将21进入下一轮的末尾……如此,3就是答案里的数. 下一轮变成 5 16 21……如此重复,每次序列长度减半,得到最终答案. 队友的…
题意:给你一些数,问你是否能够将它们划分成两个集合,使得这两个集合的异或和之差的绝对值最小. 设所有数的异或和为S,集合A的异或和为A. 首先,S的0的位对答案不造成影响. S的最高位1,所对应的A的那一位一定可以为1,不妨设它为1. 然后考虑后面的S的1位,尽量使A对应的位置为0,这样才能使S xor A,即B的值最大化,最接近A. 用线性基来进行判定,看能否将最高位到目前这位(假定目前这位是0)的这个区间用给定的数线性表出,如果能,就将这位设成0,否则,就将这位设成1. 妈的,其实整个过程只…
一个矩阵,每个位置有一个非负整数,一个人从左上走到右下,不能走重复的格子,问得到的最大权值. 当长宽不都为偶数时,必然能走遍所有格子,横着从左到右,从右到左(或是竖着走)走完即可. 当长宽都是偶数时,必然只有一个格子走不到,黑白染色后,就是白色格子中的最小值走不到,别的全都可以走得到. 两行两行地走,如果没到不取的那个格子所在的那两行,那就横着从左到右,从右到左:如果到了这两行,就竖着循环走:过了这两行之后,就横着从右到左,从左到右. #include<cstdio> using namesp…
Petrozavodsk Winter Training Camp 2018 Problem A. Mines 题目描述:有\(n\)个炸弹放在\(x\)轴上,第\(i\)个位置为\(p_i\),爆炸半径为\(r_i\),引爆第\(i\)个炸弹的花费为\(c_i\).但一个炸弹\(i\)爆炸时,在爆炸半径内的其它炸弹都会爆炸,而且不用花费.有\(Q\)个操作,每次改变一个炸弹的花费,然后输出引爆所有炸弹的最小费用. solution 不会. Problem B. Balls 题目描述:有\(n\…
2015 UESTC Winter Training #7 2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest 据说这套题写出3题就是金牌水平了... Problem D. Group Stage 足球比赛,现在有n(2<= n <=100)支球队.要从中选拔m(1<= m <=n-1)支球队,每支球队互相比赛一场,即比赛n*(n-1)/2场,胜者得3分,平局各得1分.最后从大到小列出排名,如果有…
2014-2015 Petrozavodsk Winter Training Camp, Contest.58 (Makoto rng_58 Soejima contest) Problem A. Manhattan solved by RDC 32 min 1Y 题意 给一网格图,找出欧几里得距离为 d 的两点,最大化最短路. 第一回合 三分搜索,第一个点的坐标 \((x,0)(0\leq x<1)\),确定第一个点后,对第二个点的横坐标或者纵坐标进行枚举计算答案. 第二回合 设最优解两点之间…
2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest B. Forcefield 题意 给你一维平面上n个镜子,镜子的朝向有正面和背面,如果光束从正面穿过,会摧毁镜子,并且光束会反向:如果从背面穿过的话,什么都不会发生. 光束一开始从X位置,射向0点,然后你人在0点,会反射光束. 问你要破坏所有镜子,人需要反弹光束多少次. 数据范围100000 题解 其实模拟就好了,击破镜子的顺序就那么一种. 代码 #in…
题意:两地之间有n条不相交路径,第i条路径由a[i]座桥组成,每座桥有一个损坏概率,让你确定一个对所有桥的检测顺序,使得检测所需的总期望次数最小. 首先,显然检测的时候,是一条路径一条路径地检测,跳跃地检测没有意义.考虑已经排好的某个路径的顺序,相邻的两条路径j和j+1如果满足: (route[j].A+route[j].B)+(route[j+1].A+route[j+1].B)*(1.0-route[j].c)> (route[j].A+route[j].B)*(1.0-route[j+1]…
题意:平面上n个点,每个点带有一个或正或负的权值,让你在平面上放一个内边长为2l,外边长为2r的正方形框,问你最大能圈出来的权值和是多少? 容易推出,能框到每个点的 框中心 的范围也是一个以该点为中心的相同大小的框. 于是,把每个点的框拆成4条线.从下往上扫过去,最下面的线,给[R,R]区间加上该点的权值,然后上面再给[L,L]减去,然后上面再给[L,L]加上,然后再往上在给[R,R]减去即可.每次扫完一行,就用线段树的全局最大值尝试更新答案. 两个坑点:首先,由于线段树里存储的是离散后的点,所…
先把所有的数异或起来 得到sum 然后sum有一些位是1一些位是0 是0的位表示所有数里面有这位的数是偶数个 则无论怎么划分数 这一位对最终的答案都是不会有贡献的  因为偶数=偶数+偶数/奇数+奇数 所以我们把所有数直接&sum不管那些没有贡献的位 再一个个插入作线性基 拿出一个最高位的1给A 那么我们现在要做的就是尽量保证A剩下的高位能不是1就别是1 这样得到的答案是最优的 #include<bits/stdc++.h> using namespace std; typedef lo…
题目列表 A.ABBA E.Elvis Presley G. Biological Software Utilities J. Burnished Security Updates A.ABBA 题意:就是问你一个矩阵能由几个行向量表示出来 Solution 其实就是求矩阵的秩,但是会被卡精度(被卡了好几发),直接抄个矩阵求秩的板子就AC了 Code #define CLR(x) memset(x,0,sizeof(x))//定义宏 using namespace std; double mat…
题面 题意:如果一个字符串的最小表示法是他自己,他就是一个Lyndon Word. 例如  aabcb 他的循环串有 abcba  bcbaa cbaab baabc 其中字典序最小的是他自己 现在给你n,m表示用前m个字符(从a开始),拼成长度不超过n的字符串中,输出字典序排列的的  l->r 的串 l<=r<=1e7   r-l<=1e5 题解:我们根据样例 n=4 m=3可以看出,一共32个:a, aaab, aaac, aab, aabb, aabc, aac, aacb,…
题意: \(M_i\)为一个\(m*m\)矩阵,已知 \[\begin{aligned} &M_0=A\\ &M_i=(\prod_{j=c_i}^{i+1}M_j)B \end{aligned} \] 问\(M_n\)矩阵,输入包含\(n,m,A,B,c_1\cdots c_n(c_1\leq c_2\cdots \leq c_n)\). 思路: 因为\(c_1\leq c_2\cdots \leq c_n\),所以我们只需实现一个队列,满足能从队头\(pop\),从队尾\(push\)…
给你一个1~n的排列,让你找出4个下标a b c d,满足 (a+b)%n=(c+d)%n (w(a)+w(b))%n=(w(c)+w(d))%n,并且是非平凡解. 发现对于每个数i,找出两个数和为其的数量大概是O(n),于是可以随机找,压到vector里存下,直到找到一个解为止. #include<cstdio> #include<cstdlib> #include<vector> using namespace std; int n,a[1000010]; vect…
有一些草,一开始高度都是0,它们的生长速率不同. 给你一些单增的日期,在这些日期要将>b的草的部分都割掉,问你每次割掉的部分有多少. 将草的生长速率从大到小排序,这样每次割掉的是一个后缀,而且不会影响它们生长速率的递增性. 就是三种操作,一种对一个后缀赋值,一种对整个数组作 + 另一个数组(d(i)-d(i-1))*a,一种求区间和. 可以通过打标记的线段树实现,标记下放通过预处理生长速率数组的前缀和可以实现. 队友的代码: #include <iostream> #include &l…
平面上给你n(不超过2000)个点,问你能构成多少个面积在[A,B]之间的Rt三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调的,可以用一个pointer做出来,然后可以得出那些同方向的向量的区间(这个代码好像有点问题,可能会退化,最好确定了一个LL之后,对一个方向的不要重复算RR.这里如果也改成二分就比较好,复杂度不会退化).然后通过二分可以得到A使得面积在[A,B]间的有哪些(其实这个因为也是单调的,好像也没必要二分,…
f(n)定义为n的十进制表示下所有位的平方和. 问你方程K*f(n)=n在a<=n<=b中的解的个数. 发现f(n)最大不超过2000,可以直接枚举f(n),然后判断K*f(n)的位的平方和是否恰好为f(n). #include<cstdio> #include<iostream> using namespace std; typedef long long ll; ll K,a,b; int main(){ // freopen("g.in",&q…
题目链接:https://zhixincode.com/contest/14/problem/D?problem_id=206 样例输入 1  5 5 1 2 1 1 3 1 2 4 1 2 5 1 1 5 1 样例输出 1 20 样例输入 2  5 10 1 2 1 1 3 2 1 4 3 1 5 4 2 3 5 2 4 6 2 5 7 3 4 8 3 5 9 4 5 10 样例输出 2 146 题解: 首先,删除一条边不可能使得任意两座城市的最短距离变得更近,所以尽可能地多删除边不会有任何坏…
点此看题面 大致题意: 给你一张图,定义\(dis(i,j)\)为\(i\)与\(j\)的最短距离,现要求删去若干条边,使得图仍然联通,且\(\sum_{i=1}^n\sum_{j=i+1}^ndis(i,j)\)最大. 一个贪心的思想 考虑到要使点与点间的距离最大,则多删边肯定是更优的. 又考虑图必须联通,则最后的图肯定是一棵树. 状压\(DP\) 看到数据范围如此之小(\(N\le14\)),自然会想到状压\(DP\)啦. 我们可以设\(f_{i,x}\)表示子集\(i\)在强制以\(x\)…
2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)-E. Explosion Exploit-概率+状压dp [Problem Description] 我方有\(n\)个人,对方有\(m\)个人,每个人都有一个健康值\(h_i\),有\(d\)次攻击,每次随机从所有人中选\(1\)个人,减少其\(1\)健康值.问将对方所有人都消灭的概率是多少? [Solution] 方法\(1\): ​ 将所有人的健康值作为…
原题: HDU 3362 http://acm.hdu.edu.cn/showproblem.php?pid=3362 开始准备贪心搞,结果发现太难了,一直都没做出来.后来才知道要用状压DP. 题意:题目给出n(n <= 18)个点的二维坐标,并说明某些点是被固定了的,其余则没固定,要求添加一些边,使得还没被固定的点变成固定的,可见题目中的图形sample. 由于n很小,而且固定点的顺序没有限制,所以需要用状态压缩DP. 注意:1.当一个没固定的点和两个固定了的点连接后,该点就被(间接)固定了(…
题面 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子. 棋盘的每个格子上,都写有两个非负整数,从上到下第i 行中从左到右第j 列的格 子上的两个整数记作\(A_{i, j}\).\(B_{i, j}\).在游戏结束后,菲菲和牛牛会分别计算自己的得分:菲菲的得分是所有有黑棋的格子上的\…
传送门 状压dp入门题. 按照题意建一个图. 要求的就是合法的链的总数. 直接f[i][j]f[i][j]f[i][j]表示当前状态为jjj,下一位要跟iii连起来的方案数. 然后从没被选并且跟iii连通的点转移就行了. 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=20; bool tran[N][N]; int n,K,up,s[N]; ll f[N][1<<…
传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题了. 因此我们要最大化这样的子集数. 这就需要状压dp了. 我们把两个集合拼成一个,然后第二个集合合并进去的时候权值取负的,这样如果某个子集元素和为0表示该子集和满足要求. 然后枚举一下之前的状态来转移就行了. 代码: #include<bits/stdc++.h> using namespace…