题解:[NOIP2016 提高组] 蚯蚓】的更多相关文章

刚看到这道题:这题直接用堆+模拟不就可以了(并没有认真算时间复杂度) 于是用priority_queue水到了85分-- (STL大法好) 天真的我还以为是常数问题,于是疯狂卡常--(我是ZZ) 直到我下了组数据,结果它跑了--跑了--10s (这叫我怎么卡常) OK,闲聊到次结束,接下来说正解 其实这道题并不需要用堆,因为我们可以蚯蚓其实是满足单调性的,因为后切的蚯蚓一定要比先切的短,所以堆是不必要的,我们只用三个队列,分别记录没被切的蚯蚓.被切了的短的蚯蚓.被切了的长的蚯蚓,每次把三个队列的…
题目大意: 给你n个不同长度蚯蚓,每秒从里面取出最长的砍下u/v变成两只,又把剩下的加长q. 问你在m之前的t,2t,3t...的时间上,砍的蚯蚓长度, 以及m秒后剩下所有的蚯蚓长度. 思路: 很容易想到用一个堆来解决,然而这样时间复杂度是O((m+n)log(m+n))的,过不去. 所以复杂度得是线性的. 考虑把原来的堆改成三个单调队列. 每个蚯蚓切成两半总会有一个长的.一个短的. 我们有q1维护原来的蚯蚓,q2维护砍下来长的一截蚯蚓,q3维护砍下来短的一截蚯蚓. 不考虑蚯蚓的生长,我们只需要…
题目链接 80分思路: 弄一个优先队列,不停地模拟,切蚯蚓时就将最长的那一条出队,然后一分为二入队,简单模拟即可.还要弄一个标记,表示从开始到当前时间每一条蚯蚓应该加上的长度,操作时就加上,入队时就减去,输出时也要加上,这样就不用一个一个加了. 80分代码:(注意:手打堆貌似会更快一些,能拿到85分左右,原理跟优先队列一样) #include<iostream> #include<cstdio> #include<fstream> #include<algorit…
容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.delta+=q: 将其他长度都加上q不好实现,我们就把新的两条减去p,相对大小关系不变,最后还原即可. 但这还不是正解: 1 //复杂度mlogn,m过大,要超时 2 #include<bits/stdc++.h> 3 using namespace std; 4 int n,m,q,u,v,t; 5…
[题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问题 \(\text{[P2822]}\) 蚯蚓 \(\text{P[2827]}\) 愤怒的小鸟 \(\text{P[2831]}\) [Day1] 玩具谜题 \(\text{[P1563]}\) [T1] [题目描述] 有 \(n\) \((n \leqslant 10^5)\) 个小人围成一圈(…
[题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; inline int qr(){ register int ret=0,f=0; register char c=getchar()…
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合…
[前言] 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. 第一题可以说的内容不是很多吧.直接暴力,计算每种铅笔需要花费的金额. 只不过计算的时候,需要注意如下问题 如果不是整数倍,除完后要加1 神奇的Linux系统,很多人的第三个点wa了,所以要养成良好的编写代码的习惯 Code(我的源程序) #include<iostream> #include<fstream…
写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛出了道杜教筛) 然后白天就脑补了几道 积性函数 把例题过了一遍 Submit_Time 1696174 wohenshuai 2154 Accepted 245432 kb 10556 ms C++/Edit 1152 B 2016-11-08 16:50:10 1695614 wohenshuai…
那么我们开三个不上升队列, 第一个记录原来的蚯蚓, 第二个记录乘以p的蚯蚓 第三个记录乘以(1-p)的蚯蚓, 在记录每条就要入队列的时间,就可以求出增加的长度 每次比较三个队列的队首,取最大的值x的切. 将xp加入第二个队列的队尾 将x(1-p)加入第三个队列的队尾 (第二个第三个队列保证单调,上面证明了) #include<cstdio> #include<algorithm> #include<iostream> #include<cmath> #inc…