思维
sunyutian1998
这个作者很懒,什么都没留下…
展开
-
Range and Partition CodeForces - 1631D
http://codeforces.com/contest/1631/problem/D只要保证“[x,y]内的数量-[x,y]外的数量>=k”,则一定存在对应的划分。那么可以分为两个独立小问题:(1)如何确定x与y满足“[x,y]内的数量-[x,y]外的数量>=k”(2)如何找出划分。(1)是典型最大最小化,二分即可#include <bits/stdc++.h>using namespace std;const int maxn=2e5+10;int a原创 2022-02-08 12:14:16 · 481 阅读 · 0 评论 -
New Year Concert CodeForces - 1632D
http://codeforces.com/contest/1632/problem/D“dcan beany positive integer”是关键:既然可选任意数,则选大于1e9的素数即可。线段树用于区间查询,AC代码复杂度为n*logn*logn。其中logn*logn为二分*区间查询,可通过修改区间查询来省略二分(线段树本来就在不断二分),将复杂度降为n*logn。#include <bits/stdc++.h>using namespace std;cons..原创 2022-02-07 22:06:02 · 434 阅读 · 0 评论 -
Unbearable Controversy of Being CodeForces - 489D
点击打开链接这题真是看你敢不敢想 纯暴力数据量再小一点的话就用反向建边 可达矩阵相乘也行#include using namespace std;struct node{ int v; int next;};node edge[30010];int first[3010],book[3010];int n,m,num;void addedge(原创 2017-12-09 11:05:08 · 215 阅读 · 0 评论 -
罐子和硬币 51Nod - 1246
点击打开链接参考博客点击打开链接分类讨论1 c2 c>(k/n)*n 不可再按上述策略平均分配 此时 总的抓取次数 = 抓到硬币次数 (c)+ 抓空次数 再以 尽量使抓空次数最小 为原则分配硬币 即可得出正解 详见上方博客#include using namespace std;int main(){ int n,k,c; whi原创 2017-10-30 21:18:24 · 244 阅读 · 0 评论 -
Radar Installation POJ - 1328
点击打开链接以每个岛屿为中心 以d为半径做圆 圆与x轴相交部分即是想要覆盖这个岛屿时雷达位置的可选区间贪心策略就是以每个区间的右端点向右扫(记为p) 即假设雷达站建在这个区间的最右端 在满足覆盖当前岛屿的条件下 尽量为覆盖其后岛屿创造有利条件如果p够不到下一个区间 就说明需要新建雷达站 更新p值如果p能够到 就看当前这个区间的右端点是不是比p要小 如果比p小 考虑到我原创 2017-12-16 19:23:11 · 164 阅读 · 0 评论 -
Winter Is Coming CodeForces - 747D
点击打开链接思路很简单 写起来真的很难受 比赛差点就没出。。先统计冷天(零下)有多少 记为sum 这些天是必须装备冬日轮胎的如果冬日轮胎的数量k不足 肯定撑不过去 输出-1否则肯定可以熬过这些天 那么问题就可以转换成 先把k个冬日轮胎分配到冷天 剩余的(k-sum)个轮胎分配到热天先假设现在只有sum个轮胎 正好够我们用(分到冷天)但是每经历一次冷天到热天或热天到冷天的变化都要...原创 2017-09-10 19:31:07 · 306 阅读 · 0 评论 -
New Year Snowmen CodeForces - 140C
点击打开链接感觉是个贪心 贪心策略就是每次选剩下个数最多的三个数 就是连续取最大堆三个堆顶#include using namespace std;struct node{ friend bool operator < (node n1,node n2) { return n1.val<n2.val; } int id; in原创 2017-12-16 17:27:48 · 185 阅读 · 0 评论 -
Report CodeForces - 631C
点击打开链接题目要求每次都对前r个数进行升序或降序排序我们发现 第一次对前三个数升序排序 如果第二次对前五个数排序 那第二次不管是升序还是降序都会覆盖第一次的排序 也就是说第一次的排序做了无用功据此我们可以使用单调栈 来简化所给命令 注意 不可以对栈中每一个命令都彻底执行 比如5 41 2 3 4 52 41 32 21 1这样就有n^2*log(n...原创 2017-10-20 19:33:50 · 326 阅读 · 0 评论 -
Destroying Array CodeForces - 722C
点击打开链接逆序考虑 这样问题就转换为每插入一个数 查询当前所有连续区间的最大值插入时看左右是否有相邻的其他区间 有就合并#include using namespace std;#define ll long longll num[100010],sum[100010],ans[100010];int pre[100010],f[100010];int n;int g原创 2017-10-24 13:11:08 · 228 阅读 · 0 评论 -
Wooden Sticks POJ - 1065
点击打开链接根据每根棍子有长与重 首先想到了坐标轴上点的横纵坐标这样该问题就可以抽象为 类似于拦截导弹问题的最长严格升或降子序列问题 这里l为x w为y先将所有坐标平面上的点按横坐标从小到大排序 相等则按纵坐标从小到大排序这样 问题中的两个要求 li<=lj 与 wi<=wj 已满足第一项 再通过求最长严格降子序列得出答案 首先我们正向考虑应该从x最...原创 2017-08-26 14:34:10 · 327 阅读 · 0 评论 -
线段覆盖 CODEVS - 1214
点击打开链接首先将所有线段按照 (1)左顶点小的在前 (2)左顶点相等则右顶点小的在前 进行排序注意 (2)必不可少 如果两条线段左顶点相等 选右顶点小的线段可以留更多的空间给后面的线段 有可能放下更多线段 符合我们的目的再从前向后遍历 每一条线段都会基于"尽可能保留更多不交线段"这一目的来决定留还是不留用一个变量记录 p 当前保留的这些线段中右顶点的最大位置分情况讨论(1原创 2017-08-19 19:22:57 · 272 阅读 · 0 评论 -
线段覆盖2 CODEVS - 3027
点击打开链接正解应该是序列DP 感觉我这个法子又像DP又像贪心 有点乱搞..先按左顶点小的在前 相等则右顶点小的在前来给线段排序从前往后遍历 看当前线段的左顶点之前那些不交线段中(即右顶点小于等于当前线段的左顶点) 已求得的最大值是多少 在最大值的基础上加上当前线段的最大值 记为当前线段的右顶点之前那些不交线段中的 以求得的值(未必最大)点的取值范围是[0,1000000] 最多1原创 2017-08-19 19:49:38 · 221 阅读 · 0 评论 -
最高的奖励 51Nod - 1163
点击打开链接先将数据存入数组 排序 终止时间小的在前 相等则奖励值大的在前之后将数组元素依次入队 若遇到奖励值较大却终止时间已过的元素 则用其替换掉 之前已选的元素中奖励值最小的因为每个已选元素的终止时间在其被选时都是未被超过的 因为已排序 所以后来的元素必定满足先前元素的时间限定再用奖励值大的元素将其替换 就相当于在选取该元素的时间点改为选则奖励值大的元素其实就是原创 2017-07-23 20:51:52 · 271 阅读 · 0 评论 -
One-Dimensional Battle Ships CodeForces - 567D
点击打开链接逆向考虑 O(N)复杂度。因为每个点都在 [1,n] 范围上,所以用数组模拟双向链表即可,数据再大就配合map。#include <bits/stdc++.h>using namespace std;int tem[200010],num[200010],pre[200010],nxt[200010];int n,k,a,m;int main(){ i...原创 2018-02-02 10:00:05 · 172 阅读 · 0 评论 -
Pie POJ - 3122
点击打开链接这是刚接触acm时做的一道题 当时还不知道啥是二分 被教做人想了个贪心的思路还觉得美滋滋 然后WA了半天看了题解 因为printf("%.4lf\n",ans); 又WA了半天二分每块蛋糕的大小 然后看能不能凑的出来#include #include #include #include using namespace std;#define PI acos原创 2018-03-08 16:19:26 · 209 阅读 · 0 评论 -
k倍区间 蓝桥真题
枚举所有区间是O(n^2) 这是为了遍历所有区间 但是这个过程我们做了很多无用功 只需要遍历一遍 这是为了遍历每个k倍区间的右端点 而左端点可以通过之前的一些结果得出遍历过程中 对于每个i 都有book[sum[i]%k]++ 这样就知道从 1 到 (i-1) 有多少个区间和余数和 [1,i]相同的区间 两者相减即是一个k倍区间可以这样理解 每个k倍区间[i,j] 只要[1,j]与[1,j]模k的...原创 2018-03-09 15:23:50 · 165 阅读 · 0 评论 -
Destroying Roads CodeForces - 544D
点击打开链接看题解才懂..首先可以肯定的是 除了两条最短路上的边 其余边都可以去掉而这两条最短路上的边 是否可以合并某些道路 使距离仍在l1与l2范围内(合并后未必是最短路)求任意两点最短路 暴力枚举任意两点 看合并后是否满足l1与l2的范围注意对每一对枚举的点i与j 有四种情况 s1可以连到i或j s2也可以连到i或j #include <bits/stdc+...原创 2018-03-23 13:11:49 · 214 阅读 · 1 评论 -
Gadgets for dollars and pounds CodeForces - 609D
点击打开链接二分结束日期mid 第mid天肯定是要消费的 但当天可能不是最适合消费得日子 所以尽量少花钱 就用美元或英镑买最便宜的东西 然后找出从1到mid间美元与英镑价值最低的两天 看能不能买够k件两种物品某一种数量为零的判断写错了 又是同样的原因 好难受...#include <bits/stdc++.h>using namespace std;#define ll long ...原创 2018-03-20 21:34:17 · 171 阅读 · 0 评论 -
Sub-Bipartite Graph FZU - 2141
点击打开链接贪心思想 因为题目所求的二分图至少有m/2条边 所以对于每个点 只看其邻接点中位于那个集合的点多 这样当前点的邻接边至少有一半加入了所建立的二分图中 最终肯定满足m/2注意 二分图未必连通#include <cstdio>#include <queue>#include <cstring>#include <algorith...原创 2018-04-14 22:00:34 · 126 阅读 · 0 评论 -
白色相簿 计蒜客
如何判断一个图中是否存在三元环 先bfs全图 得到一颗bfs树 然后用O(N+M)的方法遍历全图 若相邻两点且深度相同 那一定存在三元环 因为无论从哪一个点进入三元环 另外两点在bfs树中的深度必然相同 #include <cstdio>#include <queue>#include <cstring>#include <algor...原创 2018-04-09 22:10:33 · 245 阅读 · 0 评论 -
Simple String Problem FZU - 2218
点击打开链接字符种类很少 所以可以利用状压 把每个子串都变做一个数 然后记录每个数(子串)对应的最大长度 然后从低状态一路更新到高状态 这样就相当于一个基于状态高低的前缀和 再然后就是枚举每一种状态 对全一状态也就是最高状态进行异或 这样就得到了每一位都与当前枚举状态不同的最高状态 又因为之前已经求得一个状态前缀和 所以直接相乘即可#include <cstdio>#include ...原创 2018-04-15 16:21:57 · 216 阅读 · 0 评论 -
StarCraft FZU - 2219
点击打开链接这题是训练时队友写的 自己就没想到...感觉二分很神奇 可以把很多复杂的问题简化成一个判定性的问题 在简化问题之后很多原本不可知的东西就变成已知量 从而可以找到更简单的方法来解决简化的问题 然后由这个问题的执行结果决定下一步该怎么做上面是去年说的废话二分一个时间 把所有建筑任务都堆到最后放 比如当前二分的时间是lim 任务执行时间是t[i] 则最晚开始时间为lim...原创 2018-04-15 19:42:30 · 149 阅读 · 0 评论 -
夹克爷发红包 51Nod - 1625
点击打开链接因为n很小 直接2^n找出每行分配高级红包的情况 在行确定的情况下 就可以对列进行贪心了#include <bits/stdc++.h>using namespace std;#define ll long longll mat[50][200];ll x,ans;int pre[50];int n,m,k,cnt;void solveI(){ ...原创 2018-04-11 08:40:31 · 115 阅读 · 0 评论 -
取余最长路 51Nod - 1624
点击打开链接枚举右端点 同时把已经扫过的左端点加入set 然后利用set二分找加和取余后的最大值#include <bits/stdc++.h>using namespace std;#define ll long longset <ll> st;ll mat[4][100010],sum[4][100010];ll mod;int n;int main(...原创 2018-04-13 09:53:32 · 137 阅读 · 0 评论 -
数字1的数量 51Nod - 1009
点击打开链接每10个数提供1个个位1 每100个数提供10个十位1 每1000个数提供100个百位1...以此类推#include <bits/stdc++.h>using namespace std;#define ll long longint main(){ ll n,i,ans; while(scanf("%lld",&n)!=EOF) ...原创 2018-04-13 18:57:35 · 201 阅读 · 0 评论 -
可能的路径 51Nod - 1247
点击打开链接题目给的几种操作明显是辗转相减求公约数 如果所给的ab和cd的公约数不等 那是无论如何凑不到一起的 两者在辗转相减的路径上也不会有交集#include <bits/stdc++.h>using namespace std;#define ll long longll getgcd(ll a,ll b){ ll t; while(b>0) ...原创 2018-05-09 15:36:36 · 202 阅读 · 0 评论 -
Zebras CodeForces - 950C
点击打开链接遇到一个0 先看有没有以1结尾的串 有就补上 没有就新开一个串遇到一个1 有以0结尾的串就填上 没有就输出-1如果每次都遍历所有已经构造的串 复杂度太高 可以用队列优化#include <bits/stdc++.h>using namespace std;vector <int> ans[200010];queue <int>...原创 2018-04-20 20:31:48 · 190 阅读 · 0 评论 -
Unrequited Love ZOJ - 3601
点击打开链接一个聚会中 存在某个人 其所有喜欢的人都出现了 且不被所有出现的人喜欢其实这样的人最多只能有一个 对于题目所给的每一个集合 从前往后扫一遍 找出一个符合条件的 再针对其判断一遍从前往后 是判断每个人与之后的人的关系 只有之后的满足了 才需要判断之前的#include <bits/stdc++.h>using namespace std;map <string,i...原创 2018-04-25 12:49:21 · 166 阅读 · 0 评论 -
Auxiliary Set HDU - 5927
点击打开链接看了题解才会... 之前还一直想用LCA怎么搞...对于一个非重要点 只要其下至少两颗子树上分别有两个重要点 那这个非重要点一定是他们的LCA 也变成了重要节点dfs一遍 记录每个节点的直接孩子有几个 记为son[cur] 对于每一个查询 把点按深度从深到浅排序 然后扫一遍如果当前点的son[cur]==0 那么以当前点为根的子树上已经不存在重要点 其父节点也就少了一个提供重要点的来源...原创 2018-05-04 15:45:54 · 125 阅读 · 0 评论 -
Forgotten Spell Gym - 101755M
点击打开链接恶心思维模拟 记出现三种,两种,一种字符的位置的数量分别为v3 v2 v1(1) v3>1 不可能 因为每人最多错一次(2) v3==1 (1) v2>1 不可能 (2) v2==1 这时情况很复杂 很难继续分类讨论 直接暴力枚举出现三种和两种字符的那两个位置 然后看有几种结果 (3) 模棱两可 可能有一人是对的 有可能全错(3...原创 2018-04-29 08:50:44 · 506 阅读 · 0 评论 -
最小正子段和 51Nod - 1065
点击打开链接一 线段树一个子段肯定是由两个前缀做差相得 那么对于每一个前缀 就看它前边比它小的最大的前缀 做差取最大值 线段树维护一下#include <bits/stdc++.h>using namespace std;#define ll long long#define N 0x3f3f3f3f3f3f3f3fstruct node{ int l...原创 2018-05-07 23:37:14 · 147 阅读 · 0 评论 -
Well played! CodeForces - 976E
点击打开链接显然(感觉)把所有1操作用到一个生物上在题目要求的情况下会发挥最大效应 可以考虑一下只有两个生物和两次1操作的情况挑(h-d)值最大的b个生物取两者最大值 这样就得到了没有1操作情况下的最大效益 然后枚举每一个生物 减去之前对总效益的贡献在加上一通1操作后的贡献 取最大值#include <bits/stdc++.h>using namespace std;#defin...原创 2018-05-08 13:29:26 · 201 阅读 · 0 评论 -
Petr and Permutations CodeForces - 987E
点击打开链接交换次数的奇偶性和逆序对总数的奇偶性是一致的线代课本原话是 一个排列中任意两个元素对换 改变排列的奇偶性推论是 奇排列对换成标准排列需要奇数次 偶排列对换成标准排列需要偶数次#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#...原创 2018-06-01 21:39:06 · 279 阅读 · 0 评论 -
Trail Maintenance LightOJ - 1123
点击打开链接每次加一条边 在加新边后的图中求最小生成树先想到的就是把前i条边全部排序 但是m很大会超时发现n很小 每次求出最小生成树时有用的边最多(n-1)条 所以每次只给n条边排序就好 求完生成树后把没用的那条边换成新边 再继续#include <cstdio>#include <cstring>#include <algorithm>using nam...原创 2018-07-16 11:29:02 · 210 阅读 · 0 评论 -
Smart Software Installer HDU - 5098
http://acm.hdu.edu.cn/showproblem.php?pid=5098输入坑爹 算是存个模板..加入a: b 那就建一条从b到a的边 题目就是找以入度为零的点为起点的含有最多需要重启的节点的一条链 以0为超级源点 向所有入度为零的点建一条边 如果哪个节点需要重启 那就把点权设为1 然后跑一边spfa既然题目已经给定关系 那其实不管从哪开始都一样 权值最大的那条链是...原创 2018-07-16 21:31:42 · 170 阅读 · 0 评论 -
take 牛客网多校
https://www.nowcoder.com/acm/contest/143/F第i个钻石被拿<=>[1,i-1]中所有比第i个钻石大的钻石都没被拿 算出这个概率 乘上次数1 就是期望 累加即可菜的一批#include <bits/stdc++.h>using namespace std;#define ll long long#define M 9...原创 2018-08-03 18:19:17 · 168 阅读 · 0 评论 -
subseq 牛客网多校
https://www.nowcoder.com/acm/contest/143/H首先数据有毒 不止1e5题目要求下标字典序第k小的LIS 既然是以下标决定字典序 那就维护一个dp[i]代表以a[i]为首项的所有LIS个数 这个可以提前线段树之类的搞出来为求第k小 故i从最小的下标1开始遍历 如果dp[i]<k 说明当前这个下标太小了不合要求 k减去dp[i] 如果以a[i]为...原创 2018-08-03 20:56:41 · 236 阅读 · 0 评论 -
Problem M. Walking Plan HDU - 6331
http://acm.hdu.edu.cn/showproblem.php?pid=6331f[k][i][j]=min(f[k][i][j],f[k+1][i][j]) 这个式子是关键 通过该式子可以n^3的求出从i到j恰好走几步的最短距离可以跑2e4次n^3 从后向前取最小值 即f[k][i][j]=min(f[k][i][j],f[k+1][i][j])但是查询的k是1e4 还需...原创 2018-07-31 14:37:20 · 180 阅读 · 0 评论 -
Swordsman HDU - 6396
http://acm.hdu.edu.cn/showproblem.php?pid=6396开五个堆 分别以某一个a值排序 满足一个当前a值就推入下一个堆 然后在随后一个堆把所有符合条件的怪兽的b值加到v上 然后再从头扫第一个堆#include <bits/stdc++.h>using namespace std;struct node0{ int a[6];...原创 2018-08-14 10:35:14 · 166 阅读 · 0 评论 -
gpa 牛客网多校
https://www.nowcoder.com/acm/contest/143/A二分答案 转为判定性问题 然后同乘分母后移项 再排序 最后取前(n-k)小是当前最优解 看是都符合条件 复杂度n*logn*logn#include <bits/stdc++.h>using namespace std;#define eps 1e-8struct node{ do...原创 2018-08-03 00:52:47 · 151 阅读 · 0 评论