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[100100],st,ans;
set<ll>s;
ll read()
{ll aa=0,bb=1;char cc=getchar();while(cc>'9'||cc<'0'){if(cc=='-') bb=-1;cc=getchar();}while(cc>='0'&&cc<='9'){aa=(aa<<3)+(aa<<1)+(cc^'0');cc=getchar();}return aa*bb;
}
ll gcd(ll a,ll b)
{if(b==0) return a;return gcd(b,a%b);
}
int main()
{n=read();for(ll i=1;i<=n;i++) a[i]=read();ll st=1;while(st<=n){if(st==n){ans++;break;}ll d=abs(a[st+1]-a[st]);if(d==0||d==1){ans++;st++;continue;}s.insert(a[st]);s.insert(a[st+1]);ll i;for(i=st+2;i<=n;i++){if(s.find(a[i])!=s.end()) break;d=gcd(d,abs(a[i]-*s.begin()));if(d==1) break;s.insert(a[i]);}st=i;ans++;s.clear();}printf("%lld\n",ans);return 0;
}

嚎叫响彻在贪婪的厂房

T2 主仆见证了 Hobo 的离别

建边,数据较水,暴力跑$dfs$就能过

如果是交集,就将合并的点向新点连边,并集就将新点向合并的点连边,$k==1$的情况交集和并集是一样的,所以建双向边。

最后的查询就是问$x$是否是$y$的一个子集,也就是从$y$出发能否找到$x$,这样建边就保证了从当前点出发,能到达的点都是自己能包含的

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
struct node
{int to,nxt;
}h[5001000];
int n,m,nn,num,a[4001000],tot,nxt[5001000],son;
int read()
{int aa=0,bb=1;char cc=getchar();while(cc>'9'||cc<'0'){if(cc=='-') bb=-1;cc=getchar();}while(cc>='0'&&cc<='9'){aa=(aa<<3)+(aa<<1)+(cc^'0');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=1;i<=m;i++){tpy=read();if(!tpy){op=read();k=read();nn++;if(!op){for(int i=1;i<=k;i++){x=read();add(x,nn);if(k==1) add(nn,x);}}else{for(int i=1;i<=k;i++){x=read();add(nn,x);if(k==1) add(x,nn);}}}else{son=read();y=read();printf("%d\n",dfs(y,0));}}return 0;
}

主仆见证了 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[500100],b[500100],s[500100],f[500100];
priority_queue< pair<ll,ll> ,vector<pair<ll,ll> >,greater<pair<ll,ll> > >q,qq;
ll read()
{ll aa=0,bb=1;char cc=getchar();while(cc>'9'||cc<'0'){if(cc=='-') bb=-1;cc=getchar();}while(cc>='0'&&cc<='9'){aa=(aa<<3)+(aa<<1)+(cc^'0');cc=getchar();}return aa*bb;
}
int main()
{n=read();m=read();for(ll i=1;i<=n;i++) a[i]=read(),s[i]=s[i-1]+a[i];for(ll i=0;i<n;i++) b[i]=read();f[0]=0;for(ll i=1;i<=n;i++){q.push(make_pair(f[i-1]+b[i-1],i-1));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 0;
}

征途堆积出友情的永恒

转载于:https://www.cnblogs.com/jrf123/p/11379100.html

8.19 NOIP模拟测试26(B) 嚎叫响彻在贪婪的厂房+主仆见证了 Hobo 的离别+征途堆积出友情的永恒...相关推荐

  1. NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」...

    题目比较神仙,注意是题目神仙 贪婪暗示贪心,堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$+$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1 ...

  2. 问题 H: 嚎叫响彻在贪婪的厂房

    问题 H: 嚎叫响彻在贪婪的厂房 时间限制: 1 Sec 内存限制: 128 MB 题目描述 RX:把机器人Hobo,带往改造工厂. 来到了改造工厂,Hobo感到阵阵迷茫,不知道自己将会何去何从. & ...

  3. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  4. NOIP模拟测试19

    T1: 题目大意:将一颗有N个节点的树分割,使得每个联通块大小相等,问一共有多少方案.(N<=1000000) 首先,一条很显然的性质,每个联通块的大小一定是N的因子. 然后,我们可以对于每个因 ...

  5. NOIP模拟测试25

    这次考试后面心态爆炸了...发现刚了2h的T2是假的之后就扔掉了,草率地打了个骗分 T1只会搜索和m=0 最先做的T3,主要是发现部分分很多,当时第一眼看上去有87分(眼瞎了). 后来想了想,感觉一条 ...

  6. NOIP模拟测试49·50「养花·折射·画作·施工·蔬菜·联盟」

    一套题 养花 题解 分块\主席树 这里我用的是主席树 查询分段$1-(k-1)$找最大的,能向右找就向右找 for(ll nowl=1,nowr=k-1;nowl<=maxx;nowl+=k,n ...

  7. NOIP模拟测试「简单的区间·简单的玄学·简单的填数·简单的序列」

    简单的区间 $update$ 终于$AC$了 找到$(sum[r]+sum[l](sum表示以中间点为基准的sum)-mx)\%k==0$的点 注意这里$sum$表示是以$mid$为基准点,(即$su ...

  8. NOIP模拟测试21「折纸·不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

  9. NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」

    待补 引子 题解 大模拟,注意细节 代码1 #include<bits/stdc++.h> using namespace std; int n,m;char a[1005][1005]; ...

最新文章

  1. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词
  2. 一年暴增1600万程序员!GitHub 2021年度报告发布:中国755万开发者排全球第二
  3. 内核态与用户态的区别
  4. 户籍恢复需要体检吗_脑梗死后脚麻能恢复吗?需要多久能恢复呢?
  5. htmlcss实例小项目_小程序websocket心跳库——websocket-heartbeat-miniprogram
  6. Python机器学习:多项式回归001什么是多项式回归
  7. Script - MapSubString()使用
  8. java程序设计 第三版_清华大学出版社-图书详情-《Java语言程序设计(第3版)》...
  9. linux驱动开发(十)——misc杂散设备
  10. 2013 Multi-University Training Contest 1
  11. 杨永强“兑”现承诺 乐视云发力VaaS
  12. PyQt4---QTextBrowser
  13. 设计模式 - 建造者模式
  14. 百度地图SDK集成定位,卫星地图
  15. matlab ofdm系统 过采样和欠采样,过采样和欠采样
  16. 【简单易上手】姓氏头像制作生成头像组合微信小程序源码下载
  17. 数学建模之层次分析法(含MATLAB代码)
  18. Freetype字体引擎分析与指南(中文版翻译)
  19. Word排版过程中多个参考文献一起引用
  20. 基于web的家庭理财系统

热门文章

  1. Debian 8 在虚拟环境中安装kivy
  2. 《Windows服务器配置与管理》文件系统管理
  3. Reactive Extensions入门(4):Rx实战
  4. 菜鸟学习C++练笔之整理搜狗2008版语料库--获取分类语料库
  5. 海量数据库的查询优化及分页算法方案(3)--改善SQL语句[转]
  6. 1088 三人行 (20分)
  7. CMake使用详解一(单文件编译)
  8. 用标准C语言初始化线性表,跪求:线性表初始化函数的详细解释(c语言)
  9. pvr转png工具_图片如何转换格式?最好用的3个转换工具都在这了
  10. Python中变量的命名以及输入输出