8.19 NOIP模拟测试26(B) 嚎叫响彻在贪婪的厂房+主仆见证了 Hobo 的离别+征途堆积出友情的永恒
T1 嚎叫响彻在贪婪的厂房
以前做过一个等比数列的题「序列」,这个类似
是等差数列且公差不为1的条件就是各项差的绝对值的$gcd!=1$,每次拿出序列前两个数,求出差值,插入到set里,每次向后扩展,如果该数出现过或与前面的公差的$gcd==1$,更新答案和序列起点,进行下一轮;否则插入到$set$中,记得清空
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<cmath>
#define ll long long
using namespace std;
ll n,a[],st,ans;
set<ll>s;
ll read()
{
ll aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
ll gcd(ll a,ll b)
{
if(b==) return a;
return gcd(b,a%b);
}
int main()
{
n=read();
for(ll i=;i<=n;i++) a[i]=read();
ll st=;
while(st<=n){
if(st==n){
ans++;
break;
}
ll d=abs(a[st+]-a[st]);
if(d==||d==){
ans++;
st++;
continue;
}
s.insert(a[st]);s.insert(a[st+]);
ll i;
for(i=st+;i<=n;i++){
if(s.find(a[i])!=s.end()) break;
d=gcd(d,abs(a[i]-*s.begin()));
if(d==) break;
s.insert(a[i]);
}
st=i;
ans++;
s.clear();
}
printf("%lld\n",ans);
return ;
}
嚎叫响彻在贪婪的厂房
T2 主仆见证了 Hobo 的离别
建边,数据较水,暴力跑$dfs$就能过
如果是交集,就将合并的点向新点连边,并集就将新点向合并的点连边,$k==1$的情况交集和并集是一样的,所以建双向边。
最后的查询就是问$x$是否是$y$的一个子集,也就是从$y$出发能否找到$x$,这样建边就保证了从当前点出发,能到达的点都是自己能包含的
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
struct node
{
int to,nxt;
}h[];
int n,m,nn,num,a[],tot,nxt[],son;
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
void add(int x,int y)
{
h[++tot].to=y;
h[tot].nxt=nxt[x];
nxt[x]=tot;
}
bool dfs(int x,int fa)
{
if(x==son) return true;
for(int i=nxt[x];i;i=h[i].nxt){
int y=h[i].to;
if(y==fa) continue;
if(dfs(y,x)) return true;
}
return false;
}
int main()
{
n=read();m=read();nn=n;
int tpy,op,k,a,x,y;
for(int i=;i<=m;i++){
tpy=read();
if(!tpy){
op=read();k=read();nn++;
if(!op){
for(int i=;i<=k;i++){
x=read();
add(x,nn);
if(k==) add(nn,x);
}
}
else{
for(int i=;i<=k;i++){
x=read();
add(nn,x);
if(k==) add(x,nn);
}
}
}
else{
son=read();y=read();
printf("%d\n",dfs(y,));
}
}
return ;
}
主仆见证了 Hobo 的离别
T3 征途堆积出友情的永恒
暴力建边跑$spfa$可以得到50分,加一手特判就能拿到80分的好成绩。
$f[i]$表示到i点的最小费用,$s[i]$表示$a[i]$的前缀和,转移很简单 $f[i]=min{f[j]+max(b[j],s[i]-s[j])}$ 复杂度n2显然抗不住
考虑优化,发现$f[j]+s[i]-s[j]$是单调递增的,$f[j]+b[j]$是一个定值,每次找可行范围内的最小值就行,考虑用两个小根堆维护
一个维护$f[j]+b[j]$,一个维护$f[j]-s[j]$
每次更新$f[i]$的时候找到距离不超过k的且最小的,$f[i]=min(第一个堆的堆顶,第二个堆的堆顶+s[i])$
距离不超过$k$就每次取堆顶,如果$id<i-k$就把他$pop$出去,直到找到合法的
如果第一个堆的堆顶$<f[j]+s[i]-s[j]$(答案不会是他,因为费用是要找路费和税中较大的)就$pop$出来,并把j插入到第二个堆里(税已经小于当前路程了,那么这个点以后对答案的贡献只可能是路径费用而不是税)
每次都将走过的点$i$的$f[i]+b[i]$插入到第一个堆里
注意最大值要开大一点。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
ll n,m,a[],b[],s[],f[];
priority_queue< pair<ll,ll> ,vector<pair<ll,ll> >,greater<pair<ll,ll> > >q,qq;
ll read()
{
ll aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
int main()
{
n=read();m=read();
for(ll i=;i<=n;i++) a[i]=read(),s[i]=s[i-]+a[i];
for(ll i=;i<n;i++) b[i]=read();
f[]=;
for(ll i=;i<=n;i++){
q.push(make_pair(f[i-]+b[i-],i-));
ll ans=0x7fffffffffffff;
while(q.size()&&q.top().second<i-m) q.pop();
while(qq.size()&&qq.top().second<i-m) qq.pop();
while(q.size()&&q.top().first<f[q.top().second]+s[i]-s[q.top().second]){
qq.push(make_pair(f[q.top().second]-s[q.top().second],q.top().second));
q.pop();
}
while(q.size()&&q.top().second<i-m) q.pop();
while(qq.size()&&qq.top().second<i-m) qq.pop(); if(q.size()) ans=min(ans,q.top().first);
if(qq.size()) ans=min(ans,qq.top().first+s[i]);
f[i]=ans;
}
printf("%lld\n",f[n]);
return ;
}
征途堆积出友情的永恒
8.19 NOIP模拟测试26(B) 嚎叫响彻在贪婪的厂房+主仆见证了 Hobo 的离别+征途堆积出友情的永恒的更多相关文章
- NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」
题目比较神仙,注意是题目神仙 贪婪暗示贪心,堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$+$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- 2019.8.1 NOIP模拟测试11 反思总结
延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...
- NOIP模拟测试1(2017081501)
好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...
随机推荐
- Flink是如何实现exactly-once语义的
转自:https://blog.csdn.net/xianpanjia4616/article/details/86375224 最少一次:断了之后 重新执行 再去重 严格一次:根据检查点,再执行一次 ...
- Algorithm: CRT、EX-CRT & Lucas、Ex-Lucas
中国剩余定理 中国剩余定理,Chinese Remainder Theorem,又称孙子定理,给出了一元线性同余方程组的有解判定条件,并用构造法给出了通解的具体形式. \[ \begin{aligne ...
- vuex 源码解析(三) getter属性详解
有时候我们需要从store中的state中派生出一些状态,例如: <div id="app"> <p>{{reverseMessage}}</p> ...
- python 多进程和多线程对比
1. 对于耗费CPU的操作来说,多进程优于多线程 2. 对于耗费IO操作来说,多线程优于多进程 3. 多进程切换代价大于多线程
- element-ui的tabs默认选中页签
Element-UI提供了tabs组件(选项卡.多页签),其中在tabs的属性中提供了一个value/v-model属性来绑定默认选中的页签. 我们通过简单的示例来看一下具体是怎么使用的. <t ...
- AngleSharp 实战(05)之遍历内部子元素(x)元素,尝试着获取元素的 Attr 和 InnerText
直接贴代码了: using System; using System.Linq; using System.Threading.Tasks; using AngleSharp; using Angle ...
- Kubernetes 弹性伸缩全场景解析 (一):概念延伸与组件布局
传统弹性伸缩的困境 弹性伸缩是 Kubernetes 中被大家关注的一大亮点,在讨论相关的组件和实现方案之前.首先想先给大家扩充下弹性伸缩的边界与定义,传统意义上来讲,弹性伸缩主要解决的问题是容量规划 ...
- Window权限维持(二):计划任务
Windows操作系统提供了一个实用程序(schtasks.exe),使系统管理员能够在特定的日期和时间执行程序或脚本.这种行为可作为一种持久性机制被red team利用.通过计划任务执行持久性不需要 ...
- HashHelper
在C#中,数据的Hash以MD5或SHA-1的方式实现,MD5与SHA1都是Hash算法,MD5输出是128位的,SHA1输出是160位的,MD5比SHA1快,SHA1比MD5强度高. MD5与SHA ...
- 大文件SQl脚本怎么还原以及SQlsqlserver怎么全自动备份数据库
1:导出的SQl脚本文件通常大于100M左右就会还原不了,不是报错就是说系统文件找不到(sql脚本是直接拖进来的,不存在路径的问题). 2:CMD 使用 OSQL命令或者Sqlcmd命令都是可以解决的 ...