为啥这一套题目背景感到很熟悉。

T1  嚎叫响彻在贪婪的厂房

考试一个小时没调出来,自闭了..........

正解很好想,最后实在打不出来了只好暴力骗分了。。。

联想到以前做的题:序列(涉及质因数分解)

对于此题需要注意

1.等差数列中不能有相同的数,所以可以用set判断

2.同时对于等差数列我们可以用gcd判断,

设当前数为a[i],定义变量gcdd,那么就将其与a[i-1]的差的绝对值与gcdd取gcd

因为当前的两个数的gcd不见得是序列真正的gcd,但他只会比真正的gcd要大,所以我们通过此可以缩小gcdd的范围,

然后注意删除是清空

 1 #include<cmath>
2 #include<cstring>
3 #include<iostream>
4 #include<cmath>
5 #include<cstdio>
6 #include<cstring>
7 #include<algorithm>
8 #include<map>
9 #include<set>
10 #include<vector>
11 #define MAXN 200020
12 #define int long long
13 using namespace std;
14 set<int>s;
15 int gcd(int a,int b)
16 {
17 return (b==0)?a:gcd(b,a%b);
18 }
19 int n,a[MAXN];int ans=0;int gcdd;
20 set<int>::iterator it;
21 bool find(int x)
22 {
23 //printf("it%lld\n",*it);
24 int gg=abs(*it-x);
25 if(s.size()==2)gcdd=gg;
26 //printf("gg=%lld gcd=%lld\n",gg,gcdd);
27 if(gcd(gg,gcdd)<=1)
28 {
29 return 0;
30 }
31 else
32 {
33 gcdd=gcd(gg,gcdd);
34 return 1;
35 }
36 }
37 signed main()
38 {
39 scanf("%lld",&n);
40 for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
41 for(int i=1;i<=n;++i)
42 {
43 //printf("i==========%lld\n",i);
44 if(s.size()==0){s.insert(a[i]);it=s.begin();gcdd=0;}
45 else
46 {
47 if(s.count(a[i])!=0)
48 {
49 s.clear();
50 ans++;
51 s.insert(a[i]);
52 it=s.begin();
53 gcdd=0;
54 }
55 else if(abs(a[i]-a[i-1])==1)
56 {
57 s.clear();
58 ans++;
59 s.insert(a[i]);
60 it=s.begin();
61 gcdd=0;
62 }
63 else
64 {
65 s.insert(a[i]);
66 if(find(a[i])==0)
67 {
68 s.clear();
69 gcdd=0;
70 s.insert(a[i]);
71 ans++;
72 it=s.begin();
73 //if(i<=75&&i>=69)
74 //printf("--%lld i=%lld ans=%lld\n",a[i],i,ans);
75 }
76 }
77 //printf("ans=%lld\n",ans);
78 }
79 }
80 printf("%lld\n",ans+1);
81 }
82 /*
83 5
84 631061
85 1
86 925917
87 6
88 8
89 */

T2 主仆见证了 Hobo 的离别考试读错题还能水到40分????用了bitset的错解不再说了,从网上大佬那学了bitset的用法.....

然后是正(bao)解(li)

首先这题的记忆不是具体的数值,所以不能用bitset暴力求并集交集,因为这样并集根本不存在

于是我们连边,对于交集,我们将k个点向新点连边表示控制

并集反之,然后我暴力水过了,大佬勿看.........

 1 #include<bits/stdc++.h>
2 #define MAXN 500000
3 #define int long long
4 using namespace std;
5 int head[MAXN],tot;
6 struct node{int to,n;}e[MAXN*2];
7 void add(int u,int v){e[++tot].to=v;e[tot].n=head[u];head[u]=tot;}
8 int n,m;int id;int orz;
9 bool ok=0;
10 bool vis[MAXN];int ss[MAXN];
11 void clear()
12 {
13 for(int i=1;i<=ss[0];++i)vis[ss[i]]=0;
14 ss[0]=0;
15 }
16 void DFS(int x,int y)
17 {
18 vis[x]=1;ss[++ss[0]]=x;
19 if(x==y){ok=1;return ;}
20 for(int i=head[x];i;i=e[i].n)
21 {
22 int to=e[i].to;
23 if(vis[to])continue;
24 vis[to]=1;
25 DFS(to,y);
26 if(ok==1)return ;
27 }
28 }
29 signed main()
30 {
31 scanf("%lld%lld",&n,&m);
32 id=n;
33 for(int i=1;i<=m;++i)
34 {
35 scanf("%lld",&orz);
36 if(orz==1)
37 {
38 ok=0;int x,y;
39 scanf("%lld%lld",&x,&y);
40 DFS(y,x);
41 cout<<ok<<endl;
42 clear();
43 }
44 else
45 {
46 int opt;
47 scanf("%lld",&opt);
48 ++id;
49 if(opt==0)
50 {
51 int k;
52 scanf("%lld",&k);
53 if(k==1){int x;scanf("%lld",&x);add(x,id);add(id,x);continue;}
54 for(int i=1;i<=k;++i)
55 {
56 int x;
57 scanf("%lld",&x);
58 add(x,id);
59 }
60 }
61 else
62 {
63 int k;
64 scanf("%lld",&k);
65 if(k==1){int x;scanf("%lld",&x);add(x,id);add(id,x);continue;}
66 for(int i=1;i<=k;++i)
67 {
68 int x;
69 scanf("%lld",&x);
70 add(id,x);
71 }
72 }
73 }
74 }
75 }

T3 征途堆积出友情的永恒

这是个DP优化的好题,不知道为啥大家这么快就改过来了........

对于线性的DP方程很好推啊,f[i]表示从那下车的费用

f[i]=min(f[j]+max(b[j],sum[i]-sum[j]),f[i])(j>=i-k)

对于该方程我们考虑优化,因为f[j]-sum[j],f[j]+b[j]是一定的,所以我们考虑用堆维护

但是一个堆显然无法存储两个值,于是我们开两个堆

sum1记录f[j]+b[j],sum2记录f[j]-sum[j];

然后因为我们需要的是max(sum[i]-sum[j],b[j]),那么我们不能直接将两个值放进去

那么我们考虑在两个堆中放进不同的j值,保证两个堆的j不会重复,

这样当我们取出两个堆的值时他们一定是当前j的情况下max(sum[i]-sum[j],b[j])

但是由于sum[i]是变化的那么堆里的值也会变化

我们发现sum1里维护的值是不变的,那么例如

在i==2时取出sum1的堆顶此时的堆顶是j,我们发现f[j]+b[j]>f[j]+sum[i]-sum[j],证明对于j的位置,我是选f[j]+b[j]的情况我们当然可以选

但是i==3取出j,我们发现f[j]+b[j]<f[j]+sum[i]-sum[j],这时证明我们不能再用b的值了,因为f[j]+sum[i]-sum[j]大

所以在以后的过程中sum[i]只会越来越大,所以我们把sum1中j弹去加入sum2中

细节:

1.注意j<i-k的情况要处理两遍

2.关于堆内无值的情况要随时特判

        if(sum1.size())min1_id=sum1.top().second;
if(sum2.size())min2_id=sum2.top().second;
while(!sum1.empty()&&f[min1_id]-sum[min1_id]+sum[i]>f[min1_id]+b[min1_id])
{
sum1.pop();
sum2.push(make_pair(-(f[min1_id]-sum[min1_id]),min1_id));
min1_id=0;
if(sum1.size())min1_id=sum1.top().second;
}

这里一开始没有特判是否为空死了很久........

 1 #include<bits/stdc++.h>
2 #define int long long
3 #define MAXN 1010000
4 using namespace std;
5 priority_queue<pair<int,int> >sum1;
6 priority_queue<pair<int,int> >sum2;
7 int n,k;
8 int f[MAXN];
9 int a[MAXN],b[MAXN],sum[MAXN];
10 int min1_id=0,min2_id=0;
11 void clear(int i)
12 {
13 while(sum1.size()&&sum1.top().second<i-k)
14 {
15 sum1.pop();
16 min1_id=sum1.top().second;
17 }
18 while(sum2.size()&&sum2.top().second<i-k)
19 {
20 sum2.pop();
21 min2_id=sum2.top().second;
22 }
23 }
24 int top[50];
25 void find_duilie()
26 {
27 while(!sum1.empty())
28 {
29 top[++top[0]]=sum1.top().second;
30 sum1.pop();
31 }
32 for(int i=1;i<=top[0];++i)
33 sum1.push(make_pair(-(f[top[i]]-sum[top[i]]),top[i])),top[i]=0;
34 top[0]=0;
35 }
36 signed main()
37 {
38 // freopen("text.in","r",stdin);
39 // freopen("wa.out","w",stdout);
40 scanf("%lld%lld",&n,&k);
41 for(int i=1;i<=n;++i)scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i];
42 for(int i=0;i<n;++i)
43 {
44 scanf("%lld",&b[i]);
45 }
46 memset(f,0x3f3f3f,sizeof(f));
47 f[0]=0;
48 sum1.push(make_pair(-b[0],0));
49 for(int i=1;i<=n;++i)
50 {
51 min1_id=0;min2_id=0;
52 if(sum1.size())
53 {
54 min1_id=sum1.top().second;
55 }
56 if(sum2.size())
57 {
58 min2_id=sum2.top().second;
59 }
60 clear(i);
61 if(sum1.size())min1_id=sum1.top().second;
62 if(sum2.size())min2_id=sum2.top().second;
63 while(!sum1.empty()&&f[min1_id]-sum[min1_id]+sum[i]>f[min1_id]+b[min1_id])
64 {
65 sum1.pop();
66 sum2.push(make_pair(-(f[min1_id]-sum[min1_id]),min1_id));
67 min1_id=0;
68 if(sum1.size())min1_id=sum1.top().second;
69 }
70 clear(i);
71 if(sum1.size())min1_id=sum1.top().second;
72 if(sum2.size())min2_id=sum2.top().second;
73 if(!sum1.size())
74 {
75 f[i]=f[min2_id]-sum[min2_id]+sum[i];
76 }
77 else if(!sum2.size())
78 {
79 f[i]=f[min1_id]+b[min1_id];
80 }
81 else
82 {
83 f[i]=min(f[min1_id]+b[min1_id],f[min2_id]-sum[min2_id]+sum[i]);
84 }
85 sum1.push(make_pair(-(f[i]+b[i]),i));
86 }
87 printf("%lld\n",f[n]);
88 }

调不过只好打对拍啦啦啦........

随机数据生成

 1 #include<bits/stdc++.h>
2 using namespace std;
3 int random(int m)
4 {
5 return (long long)rand()*rand()%m;
6 }
7 int main()
8 {
9 freopen("text.in","w",stdout);
10 srand((unsigned)time(0));
11 int n=1000;
12 int m=random(n)+1;
13 printf("%d %d\n",n,m);
14 for(int i=1;i<=n;++i)
15 {
16 printf("%d ",random(100)+1);
17 }
18 cout<<endl;
19 for(int i=1;i<=n;++i)
20 {
21 printf("%d ",random(100)+1);
22 }
23 return 0;
24 }

以及对拍

 1 #include<bits/stdc++.h>
2 using namespace std;
3 int main()
4 {
5 int c=0;
6 while(true)
7 {
8 system("./pai");
9 system("./ac");
10 system("./wa");
11 if(system("diff -b -B ac.out wa.out"))
12 {
13 puts("WA");
14 return 0;
15 }
16 cout<<++c<<" ";
17 puts("AC");
18 }
19 return 0;
20 }
21 /*
22 g++ pai.cpp -o pai
23 ./pai
24 g++ ac.cpp -o ac
25 ./ac
26 g++ wa.cpp -o wa
27 ./wa
28 g++ ran.cpp -o ran
29 ./ran
30 */

「模拟8.19 A嚎叫..(set) B主仆..(DFS) C征程..(DP+堆优化)」的更多相关文章

  1. 重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相信相信的力量! 从懵懂的少年,到拿起键盘,可以写一个Hell ...

  2. python爬虫22 | 以后我再讲python「模拟登录」我就是狗

    接下来就是 学习python的正确姿势 做爬虫 绕不开模拟登录 为此小帅b给大家支了几招 python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定! 有些网站的登录很弱鸡 传个用户名和密 ...

  3. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  4. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...

  5. 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 能力,是你前行的最大保障 年龄会不断的增长,但是什么才能让你不 ...

  6. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

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

    T1 嚎叫响彻在贪婪的厂房 以前做过一个等比数列的题「序列」,这个类似 是等差数列且公差不为1的条件就是各项差的绝对值的$gcd!=1$,每次拿出序列前两个数,求出差值,插入到set里,每次向后扩展, ...

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

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

  9. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

随机推荐

  1. 2021年有哪些优秀的免费PSD样机素材下载的网站?

    2021年有哪些优秀的免费PSD样机素材下载的网站? 无论是ui设计师还是平面设计师,为避免无休止的加班,平时就需要寻找并收藏一些优秀的设计素材网站.好的素材可以帮助设计师设计作品起到事半功倍的效果, ...

  2. 3D高清电商购物小图标图片_在线商城三维icon图标素材大全

    3D高清电商购物小图标图片_在线商城三维icon图标素材大全

  3. 有哪些适合中小企业使用的PaaS平台?

    对于中小企业来说,在业务上同样需要工作流.应用平台来进行支持,但是,面对诸如ERP等动辄好几十万的费用来说,完全是在增加运营成本.如何解决中小企业对于业务应用.工作流管理的需求问题呢?使用PaaS低代 ...

  4. CRM帮助B2B企业持续改善战略决策「下篇」

    尽管数据早已深入人心,但依然有相当比率的B2B企业在管理和战略决策时依赖直觉而不是客户数据.不停变化的B2B市场表明了以客户为中心的趋向和格局,CRM客户管理系统能够协助您更好的使用客户数据并最大限度 ...

  5. 1.HTML入门

    1.1 初识HTML 1.1.1 概述 网络世界已经跟我们息息相关,当我们打开一个网站,首先映入眼帘的就是一个个华丽多彩的网页.这些网页,不仅呈现着基本的内容,还具备优雅的布局和丰富的动态效果,这一切 ...

  6. 8.Linux的目录管理

    3 Linux目录管理 3.1 Linux 文件与目录管理 3.1.1 目录常用命令 ls: 列出目录 cd: 切换目录 pwd: 显示目前的目录 mkdir:创建一个新的目录 rmdir:删除一个空 ...

  7. [DB] mysql windows 安装

    参考 mysql安装 https://www.cnblogs.com/zhangkanghui/p/9613844.html navicat for mysql 中文破解版(无需激活码) https: ...

  8. [Java] GUI编程基础 绘图

    库 swing awt 过程 创建窗口JFrame JFrame-->MenuBar-->Container 屏幕坐标系:左上角为原点 Graphics2D Main.java 1 imp ...

  9. [前端] AJAX

    背景 Asynchronous JavaScript And XML:异步js和XML,可实现异步刷新 用途 验证提交的用户名是否已存在 不使用AJAX,需要提交数据后,刷新页面来验证 使用AJAX, ...

  10. nginx 的常用模块

    nginx的常用模块 ngx_http_index_module Syntax: index file ...; Default: index index.html; Context: http, s ...