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

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. SQL Server强制使用特定索引 、并行度、锁

    SQL Server强制使用特定索引 .并行度 修改或删除数据前先备份,先备份,先备份(重要事情说三遍) 很多时候你或许为了测试.或许为了规避并发给你SQL带来的一些问题,常常需要强制指定目标sql选 ...

  2. java设计模式之单例模式你真的会了吗?(懒汉式篇)

    java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

  3. 通过SQL注入获得网站后台用户密码

    通过 SQL 注入攻击,掌握网站的工作机制,认识到 SQL 注入攻击的防范措施,加强对 Web 攻击的防范. 一.实验环境 下载所需代码及软件:获取链接:链接:https://pan.baidu.co ...

  4. Tracert 命令

    Tracert 命令 Tracert 命令的作用 Tracert命令诊断实用程序通过向目标计算机发送具有不同生存时间的ICMP数据包,来确定至目标计算机的路由,也就是说用来跟踪一个消息从一台计算机到另 ...

  5. 与find不同,locate并不是实时查找。你需要更新数据库,以获得最新的文件索引信息。updatedb

    find是实时查找,如果需要更快的查询,可试试locate:locate会为文件系统建立索引数据库,如果有文件更新,需要定期执行更新命令来更新索引库: $locate string 寻找包含有stri ...

  6. Linux 部署 iSCSI 客户端配置(Linux)

    Linux 部署 iSCSI 客户端配置(Linux) 客户端环境 Client :RHEL8 IP : 192.168.121.11 一.测试与服务端的连通性 [root@Client-linux ...

  7. Linux性能分析利器——火焰图的安装使用

    火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的 ...

  8. 测usb读写

    dd if=/dev/sda of=/dev/null bs=1M count=1000每次测完 清一下 memory cacheecho 3 > /proc/sys/vm/drop_cache ...

  9. 7.2-5 usermod

    7.2 usermod:修改用户信息 usermod 命令用于修改系统已经存在的用户的账号信息.   -c comment         修改用户password文件中用户的说明栏,同useradd ...

  10. 9.1 ps:查看进程

    ps命令 用于列出执行ps命令的那个时刻的进程快照,就像用手机给进程照了一张照片.如果想要动态地显示进程的信息,就需要使用top命令,该命令类似于把手机切换成录像模式.因为ps命令的功能实在是太多了, ...