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

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. DataGear 变更部署数据库为SQL Server填坑指南(含转写后的SQL server代码及SQL server配置文件)

    1. 引言 2. 配置数据库链接 3. 引入数据库驱动 4. 手动初始化数据库 5. 改写SQL 6. 其他 7. 参考 1. 引言 DataGear默认使用Derby数据库作为系统的元数据库,至于待 ...

  2. 原生JS和jQuery创建元素的方法

    jQ创建元素的方法 1.原生代码 .creatElement('tr')` .innerHTML = '<h1>加油</h1>' document.write('<h1& ...

  3. kubernetes dashboard延长自动超时注销

    方法1:部署清单时,修改yaml文件,添加 container.Args 增加 --token-ttl=43200 其中43200是设置自动超时的秒数.也可以设置 token-ttl=0 以完全禁用超 ...

  4. UltraISO制作启动盘安装CentOS7

    UltraISO制作启动盘安装CentOS7 发表于 2020-03-10  |  分类于 DevOps  |  没有评论 简单几个步骤即可完成启动盘的制作,非常便利 准备工具 准备8G优盘(启动盘制 ...

  5. 利用IOzone进行存储性能测试

    利用IOzone进行存储性能测试   命令:1.iozone -s 10G -r 4k -i 0(0代表顺序写) -w(代表文件不删除) -+n(不测重读重写) -Rb(以某种格式生成测试文件) /t ...

  6. Zabbix5.0服务端部署

    Zabbix5.0服务端部署 基础环境配置 [root@localhost ~]# systemctl disable --now firewalld Removed symlink /etc/sys ...

  7. Mysql不知道默认密码情况下登录/重置/忘记密码

    场景一: 基础系统:linux 镜像:LAMP环境(Ubuntu 18.04 Apache PHP7.0) 问题:ERROR 1405 (28000): Access denied for user ...

  8. 004.Python运算符

    一 算数运算符 1.1 加法 [root@node10 python]# cat test.py var1 = 10 var2 = 7 res = var1 + var2 print(res) [ro ...

  9. GNU Linux启动时文件系统mountall挂载出错问题的处理

    /********************************************************************* * Author  : Samson * Date    ...

  10. MySQL之数据操纵语言(DML)

    数据操纵语言(DML) 数据操纵语(Data Manipulation Language),简称DML. DML主要有四个常用功能. 增 删 改 查 insert delete update sele ...