自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(17)
  • 资源 (1)
  • 收藏
  • 关注

原创 Schedule

HDU - 6180 显然是先排序,然后按左端点从小到大放进去,每次在剩余的机子中找一个符合条件而且尽量大的。 但是一开始用 multiset 和 lowerbound 来进行处理会超时,就想到另一种写法。用一个优先队列和一个栈,对于当前任务,先将优先队列的所有合法情况按顺序压到栈中,直到不存在合法的机器,然后从栈找是否有满足条件的,如果没有就要增加机器 #include <bits/st

2017-08-31 10:41:15 147

原创 Free from square

HDU - 6125 从 1-n 选出不超过 k 个数,使得所有数乘积不能被任何平方数整除。 一开始算了一下500以内的质数,还是挺多的,但是注意到 500−−−√\sqrt{500} 中的素数只有8个,那么就可以做装压dp了,对于含有超过 500−−−√\sqrt{500} 的素数,进行因式分解,并且把拥有相同超过 500−−−√\sqrt{500} 的质数放在一起(肯定最多只有一个),然后

2017-08-23 23:55:48 266

原创 Inverse of sum

HDU - 6128 现场的时候并没有想到,通过化简式子得到 a2i−aiaj+a2j=0a_i^2-a_ia_j+a_j^2 = 0,尝试在左右都乘以(ai−aj)(a_i-a_j),得到a3i=a3ja_i^3=a_j^3,于是就相当于把aia_i中的所有的数算个三次方,计算一下排列组合就好了。但是注意到乘的是(ai−aj)(a_i-a_j),如果ai=aja_i = a_j那么后面的等式

2017-08-23 23:48:08 211

原创 Hard challenge

HDU 6127 给定n个点,每个点有权值,两两之间连线不过远点,现在要一条过远点的直线把点分成两个集合,使得两边的和的乘积尽量大。 这题直接极角排序,然后枚举每个点,维护对面的点就可以了,复杂度为nlogn。 唯一要注意的就是枚举的点可以属于两边中的任意一边 #include <bits/stdc++.h>using namespace std;const int maxn = 500

2017-08-23 20:53:49 252

原创 RXD and dividing

HDU 6060 给定一棵树,节点2..n划分成k个集合,求所有({1} U Si)的最小生成树的路径和。 一开始想着如何划分,后来想一想算每条边的贡献比较简单,以1为跟dfs一次计算每棵子树的大小,如果子树比k大,那么这条边的贡献为 x*k, 否则为 x*f[i],(f[i]为子树大小,x为边权)。因为一颗子树下的点分配到至多k个集合,每次贡献不会超过k次。 #include <bits/

2017-08-22 11:11:45 200

原创 Kanade's trio

HDU 6059 求有多少对(i < j < k),满足a[i] xor a[j] < a[j] xor a[k]。 一开始想着就是枚举j,维护两颗字典树G、F,分别记录[1,j-1] , [j+1,n]的数(二进制)以及出现的次数。对于每一次查找一开始没想好,先试试直接深搜,即每次找前面都相同的,当前值会使得产生a[i] xor a[j] < a[j] xor a[k]形式的进行相乘算

2017-08-20 10:12:34 293

原创 Inversion

HDU 6098 线段树加优化 一开始妙想的就是线段树,时间是nlognlognnlognlogn的,就是很无脑地计算每一段区间的最大值然后算出每一个BiB_i,但是超时了。在这个基础上加优化,注意到每一个合数,他的答案就是其每一个因数的答案的最大值,画一下就能看出来,加上这个就过了。 #include <bits/stdc++.h>using namespace std;const

2017-08-20 09:31:59 210

原创 TrickGCD

HDU 6053 容斥原理 显然对于答案,我们只需要对那些质因数分解后任何一种质数都只会出现一次的进行处理。这个可以先进行线性筛然后nlogn统计那些数满足要求。对于这些数求出∏Aii\prod{\frac{Ai}{i}},如果 i 的质数个数为奇数那么就加,否则就减。但是只是想到这点还是会TLE,每次枚举的i都要把A数组扫描一遍肯定不行,还需要用前缀和来维护。用 sum[i] 表示 [

2017-08-15 20:57:38 191

原创 Maximum Sequence

HDU 6047 树状数组 很显然当所选的 b[k] 值越小,所得到的 a[i] 值越大,而且取的值是 b[i]~tot 中的最大值(tot为当前a数组的大小),所以肯定是贪心,使得前面的尽可能大。将b进行排序,然后就是计算 b[i]~tot中的最大值,用树状数组来维护就好了。 #include <bits/stdc++.h>#include <string.h>using nam

2017-08-15 20:40:16 244

原创 Colorful Tree

HDU - 6035 给定一棵树,每个点有一个颜色1~n,定义两点的路径是两点间不同的颜色数量,求n*(n-1)/2条路径的权值总和。 一开始想主席树,但是后来发现并不用那么麻烦。 假设考虑颜色1的贡献值,可以把所有颜色为1的点割掉,用n*(n-1)/2 减去剩下的所有子树的路径和,就是所有经过了颜色1的路径数,也就是路径1的贡献。那么怎么快速求每一颗子树的大小,考虑肯定是从下往上进行分割

2017-08-14 10:15:30 516

原创 Distance opentrain

给定一个无向图以及其中的n个关键点,求其中最短的两个关键点的路径。 Dij,多源最短路。每个节点都记录最短路的起始点,如果两个不相同的起始点相连,那么这就是最短路。 注意用spfa会超时 #include <bits/stdc++.h>#include <vector>using namespace std;const int maxx = 1e9;const int maxn = 10

2017-08-14 09:51:25 371

原创 Blobs' Exhibition opentrains

这题就是个贪心题 通过对价值排序,然后从高到低,每次找一个尽量小的能放得下的位置放置就好了 我是用了multiset和lowerbound来查找 时间是nlogn的 #include <bits/stdc++.h>#include <set>#include <algorithm>using namespace std;struct Node { int v, w, index

2017-08-10 11:22:41 153

原创 Tree packing opentrains

这题题意很简单,唯一的坑就是它读入的是十六进制!没审清楚题目输入输出导致写了高精度还一直wa 将读入的16进制转换成2进制,画个图看一下就能发现从 高位 到 低位的最后一个1的前一位进行搜索,节点从1开始,如果是1那么就往右节点走,否则往左节点走,再转成16进制输出就好了。 #include <bits/stdc++.h>using namespace std;const int maxn=

2017-08-10 11:12:40 285

原创 Maze (opentrains)

各一个n*m的迷宫,其中左边和右边各有一个入口\出口,只能通过上下左右沿着’.’走,保证有路径,问其中有多少个点变成’#’后入口出口不连通 这题直接想有点困难,换个思路就是如果左边到右边不连通,那么一定存在一条路径通过走8个方向从左下角走到右上角(可以自己画图试一下),如果左下到右上连通,一定会阻断左边到右边的走四个方向的路径。所以通过两次bfs把’#’标记一下,然后判断每个’.’变成’#’是否会

2017-08-10 11:06:18 236

原创 Bubble (opentrains)

规律题 要求生成一个1-n的序列,冒泡排序后每个数字都只交换两次 通过一个dp发现只要数列能够分成3*x+4*y的形式就可以生成 3位的[1,2,3]变成[3,2,1] 4位的[1,2,3,4]变成[3,4,1,2] 按照这个规律就可以了 #include <bits/stdc++.h>using namespace std;const int maxn = 110;int f[ma

2017-08-10 10:59:03 395

原创 Selection (opentrains)

这个本来是一道水题,唯一的坑就是shift只能操作一次 然后用f[i]记录前i个字符中 ‘*’ 的数量,g[i]记录前i个字符中 ‘.’ 的数量(当然也可以直接用i-f[i]运算) 假设当前位置为i,要[x,i]作为shift的区段,操作数为f[n]-f[i]+f[x-1]+g[i]-g[x-1]+2,可以转化一下成:f[n]-f[i]+g[i]+f[x-1]-g[x-1]+2,其中i为枚举变量

2017-08-10 10:50:36 390

原创 Sequence (opentrains)

这是一道找规律的题目 题意是生成一个序列,后一个数是前一个数的两倍,再通过每一位数进行排序生成的新的一个数 一开始想如果出现了5,那么极有可能生成0,使得新的数的位数减少,所以可能存在一个循环节,然后我通过打表出前1000个数,很容易就找到规律 代码: #include <bits/stdc++.h>using namespace std;int a[10], b[1000][10], t,

2017-08-10 10:39:56 452

matlab教程

包含了matlab的许多基本操作以及使用方法,适合新手学习使用

2018-07-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除