题目链接:5046. 智商药 - AcWing题库

首先考虑dfs

  不用想肯定超时 过了10/17个测试点

  代码

 1 #include<bits/stdc++.h>
2
3 using namespace std;
4 typedef pair<int,int> PII;
5 typedef long long ll;
6 const int N=1e5+10,M=2*N;
7 const int p=1e9+7;
8 ll n,m;
9 struct node
10 {
11 int l, r;
12
13 }med[N];
14 bool st[N];
15 ll res=0;
16 void dfs(ll u)
17 {
18 if(u>n) return ;
19 //cout<<u<<endl;
20 if(u==n)
21 {
22 res++;
23 return ;
24 }
25 for(int i=1;i<=m;i++)
26 {
27 if(!st[i]&&med[i].l<=u&&u<=med[i].r-1)
28 {
29 st[i]=true;
30 dfs(med[i].r);
31 st[i]=false;
32 }
33 }
34 }
35 void solve()
36 {
37 cin>>n>>m;
38 for(int i=1;i<=m;i++)
39 cin>>med[i].l>>med[i].r;
40 sort(med+1,med+1+m,[](struct node a,struct node b)->bool {return a.l==b.l?a.r<b.r:a.l<b.l;});
41 //for(int i=1;i<=m;i++) cout<<med[i].l<<' '<<med[i].r<<endl;
42 dfs(0);
43 cout<<res<<endl;
44
45 }
46 int main()
47 {
48 int T = 1;
49 //cin >> T;
50 while(T --)
51 {
52 solve();
53 }
54 return 0;
55 }

然后考虑dp

  注意到n最大为1e9,肯定不能作为下标,m=1e5,可以考虑,f[i]的表示的集合为只用前i种药,且一定会吃第i种药,属性为集合中的方案数

  f[i]=sum(第i-1满足的条件之和) 因为吃药会变成med.r一定要按照r排序,也注意到第i-1满足条件的一定是一个区间,可以用树状数组,因为med.r为递增,也可以前缀和

  0为特殊的药(0,0),前缀和习惯从1开始,所以可以从2开始读入每条边,后排序,枚举每个药品,找到前面能吃到这个药l-1的区间左右端点,进行二分,在进行f的前缀区间累加

 1 #include<bits/stdc++.h>
2
3 using namespace std;
4 #define endl "\n";
5 typedef pair<int,int> PII;
6 typedef long long ll;
7 const int N=1e5+10,M=2*N;
8 const int p=1e9+7;
9 ll n,m;
10 struct node
11 {
12 int l, r;
13
14 }med[N];
15 ll f[N],s[N];
16 ll res;
17 int getl(int x)
18 {
19 int l=1,r=m+1;
20 while(l<r)
21 {
22 int mid=l+r>>1;
23 if(med[mid].r>=x) r=mid;
24 else l=mid+1;
25 }
26 return l;
27 }
28 int getr(int x)
29 {
30 int l=1,r=m+1;
31 while(l<r)
32 {
33 int mid=l+r+1>>1;
34 if(med[mid].r<=x) l=mid;
35 else r=mid-1;
36 }
37 return l;
38 }
39 void solve()
40 {
41 cin>>n>>m;
42 for(int i=2;i<=m+1;i++) cin>>med[i].l>>med[i].r;
43 sort(med+1,med+2+m,[](struct node a,struct node b)->bool {return a.r<b.r;});
44 //for(int i=1;i<=m;i++) cout<<med[i].l<<' '<<med[i].r<<endl;
45 f[1]=1,s[1]=1;
46 for(int i=2;i<=m+1;i++)
47 {
48 int l=getl(med[i].l),r=getr(med[i].r-1);
49 //s[i]=s[i-1];
50 f[i]=(s[r]-s[l-1])%p;
51 s[i]=(s[i-1]+f[i])%p;
52 if(med[i].r==n) res=(res+f[i])%p;
53 }
54 cout<<(res+p)%p<<endl;
55 }
56 int main()
57 {
58 ios::sync_with_stdio(false);
59 cin.tie(0);
60 int T = 1;
61 //cin >> T;
62 while(T --)
63 {
64 solve();
65 }
66 return 0;
67 }

  关闭流同步后运行时间447ms,之前是878ms,最后负数取模还是负数,可以+p后%p得到答案

acwing 智商药的更多相关文章

  1. tyvj1463 智商问题

    背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有小姊妹的智商小姊妹的智商都是非负整 ...

  2. Tyvj 题目1463 智商问题(分块)

    P1463 智商问题 时间: 1500ms / 空间: 131072KiB / Java类名: Main 背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他 ...

  3. 【TYVJ】1463 - 智商问题(二分/分块)

    http://tyvj.cn/Problem_Show.aspx?id=1463 二分的话是水题啊.. 为了学分块还是来写这题吧.. 二分: #include <cstdio> #incl ...

  4. Tyvj P1463 智商问题 分块

    P1463 智商问题 时间: 1500ms / 空间: 131072KiB / Java类名: Main 背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他 ...

  5. 盛希泰:办公室就像男人的春药——人的一生的精力是有限的,你把有限的时间分配给谁决定你的成败——你有N多选择,你人生的积累就是N多选择加起来的结果

    欢迎关注“创事记”的微信订阅号:sinachuangshiji 创事记注:12月22日晚上,盛希泰在清华大学旧经管报告厅面对清华师生讲了一堂<创业引导课>.本文由洪泰帮根据课堂录音整理完成 ...

  6. 【tyvj1463】智商问题 [分块][二分查找]

    Background 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! Description 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有 ...

  7. 2018-01-05-医药行业的IT革命探讨

    layout: post title: 2018-01-05-医药行业的IT革命探讨 key: 20180105 tags: IT AI 医疗 modify_date: 2018-01-05 --- ...

  8. 腾讯机试题 AcWing 603 打怪兽

    题目链接:https://www.acwing.com/problem/content/605/ 题目大意: 略 分析: 用dp[i][j]表示用j元钱能在前i只怪兽上所能贿赂到的最大武力值. 有一种 ...

  9. 又一家药企IPO被拒,原因竟然是……

    版权所有,未经授权不得转载,QQ:231469242 导读 近日,中国证监会官网发布公告,河南润弘制药首发未IPO能通过,成为今年第4家IPO被否的制药企业.中国证监会拒绝润弘制药的原因是润弘制药产品 ...

  10. noi 2727:仙岛求药

    2727:仙岛求药 总时间限制: 1000ms 内存限制: 65536kB 描述 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难 ...

随机推荐

  1. idle如何调试程序

    1.启动idle ctrl+n 快捷键 新建命令窗口 输入程序 4.F5 调试程序,结果看在启动界面查看

  2. FastAPI 自定义参数验证器完全指南:从基础到高级实战

    title: FastAPI 自定义参数验证器完全指南:从基础到高级实战 date: 2025/3/11 updated: 2025/3/11 author: cmdragon excerpt: 本教 ...

  3. How to use the Ubuntu

    How to use the Ubuntu Introduction ‍ As far as I have noted, I will force myself to write all my blo ...

  4. MFC使用WM_COPYDATA消息进行进程间的通讯

    一.介绍 Windows上MFC应用程序可使用WM_COPYDATA可以完成两个进程之间的通讯.当一个应用向另一个应用传送数据时,发送方需调用SendMessage函数,参数是目的窗口的句柄.传递数据 ...

  5. 本地项目上传到gitee

    前置条件:本地已经装好了GIt和GITEE有远程地址 检查本地装好了GIT:鼠标右键 检查准备好了远程:地址 本地项目拷贝到目录 D:\tmp2024-02-19\code 本地项目所在文件夹打开gi ...

  6. Docker 镜像及容器命令

    授人以鱼不如授人以渔,先列出官方命令文档 docker命令文档地址:https://docs.docker.com/engine/reference/commandline/images/ 镜像相关指 ...

  7. Git分支命名规范总结

    Git分支命名规范总结 在Git分支命名规范中,通常通过前缀明确区分需求(功能开发)和Bug修复,以下是具体规则及示例: 一.命名规范区分原则 需求分支(Feature) 前缀:feature/ 或 ...

  8. 扫盲ASM

    在进行程序跟踪时,会出现汇编.由于ASM盲,所以添加不少烦恼.有烦恼得想办法解决.对,扫盲ASM. 这里是教材,感觉大白话很好理解(感谢 http://www.ruanyifeng.com/blog/ ...

  9. CLI命令行应用

    前言 针对golang这门高级语言,主要想了解它的语言特性还有服务器建站还有微服务搭建方面的用途,以下都可以算是使用记录. 一.命令行应用的标准库实现 很多语言都有针对命令行参数的功能包,比如pyth ...

  10. 配置jenkins的shell自动打包的脚本

    #!/bin/bash#服务名称SERVER_NAME=jenkins-test# 源jar路径,mvn打包完成之后,target目录下的jar包名称,也可选择成为war包,war包可移动到Tomca ...