acwing 智商药
题目链接: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 智商药的更多相关文章
- tyvj1463 智商问题
背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有小姊妹的智商小姊妹的智商都是非负整 ...
- Tyvj 题目1463 智商问题(分块)
P1463 智商问题 时间: 1500ms / 空间: 131072KiB / Java类名: Main 背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他 ...
- 【TYVJ】1463 - 智商问题(二分/分块)
http://tyvj.cn/Problem_Show.aspx?id=1463 二分的话是水题啊.. 为了学分块还是来写这题吧.. 二分: #include <cstdio> #incl ...
- Tyvj P1463 智商问题 分块
P1463 智商问题 时间: 1500ms / 空间: 131072KiB / Java类名: Main 背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他 ...
- 盛希泰:办公室就像男人的春药——人的一生的精力是有限的,你把有限的时间分配给谁决定你的成败——你有N多选择,你人生的积累就是N多选择加起来的结果
欢迎关注“创事记”的微信订阅号:sinachuangshiji 创事记注:12月22日晚上,盛希泰在清华大学旧经管报告厅面对清华师生讲了一堂<创业引导课>.本文由洪泰帮根据课堂录音整理完成 ...
- 【tyvj1463】智商问题 [分块][二分查找]
Background 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! Description 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有 ...
- 2018-01-05-医药行业的IT革命探讨
layout: post title: 2018-01-05-医药行业的IT革命探讨 key: 20180105 tags: IT AI 医疗 modify_date: 2018-01-05 --- ...
- 腾讯机试题 AcWing 603 打怪兽
题目链接:https://www.acwing.com/problem/content/605/ 题目大意: 略 分析: 用dp[i][j]表示用j元钱能在前i只怪兽上所能贿赂到的最大武力值. 有一种 ...
- 又一家药企IPO被拒,原因竟然是……
版权所有,未经授权不得转载,QQ:231469242 导读 近日,中国证监会官网发布公告,河南润弘制药首发未IPO能通过,成为今年第4家IPO被否的制药企业.中国证监会拒绝润弘制药的原因是润弘制药产品 ...
- noi 2727:仙岛求药
2727:仙岛求药 总时间限制: 1000ms 内存限制: 65536kB 描述 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难 ...
随机推荐
- Processing多窗口程序范例(一)
Processing学习到一定程度必定会关注源码,关注扩展功能,其中窗口创建是值得关注的技术点(实现多窗口).下面就以一个简单范例来展开讨论. 范例代码 主程序先上: package syf.demo ...
- PHP对表单提交特殊字符的过滤和处理方法汇总
http://www.jb51.net/article/46921.htm PHP关于表单提交特殊字符的处理方法做个汇总,主要涉及htmlspecialchars/addslashes/stripsl ...
- Abaqus压电材料分析
目录 1. ABAQUS压电材料定义[快速版] 2. 压电材料的主要特性参数 3. Abaqus 压电分析 1 电响应 2 initial condition & BCs 4 Load 5 M ...
- 【Pre】预习测试-Logisim/Verilog/MIPS
好家伙,开门挂 T2 字符自动机cscore 1.审题·惯性思维:直接输出了当前连续数,题目要求是最大连续数 -> [重新读题解决] 2.非阻塞赋值运用:若在always块内通过if(out1 ...
- js回忆录(3) -- 循环语句,前后缀运算符
计算机对于大批量数据的处理速度比起人类不知道快了多少,因此对于重复的操作,使用循环语句处理是很方便的,对于我们前端来说,给同一标签的元素绑定事件啦,tab切换啦,左右联动效果啦,等等都可以使用循环语句 ...
- linux tmux 使用教程
前言 Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具. 本文介绍如何使用 Tmux. 一.Tmux 是什么? 1.1 会话与进程 命令行的典型使用 ...
- linux php重启
1.停止命令 你可以先查看自己的php进程有没有启动 ps -ef | grep php [root@iZ6we4yxap93y2r0clg3g8Z ~]# ps -ef | grep php roo ...
- ORACLE忘记用户名和密码、解锁、查询
一.Oracle忘记用户名和密码 1.打开命令提示符,输入命令sqlplus ,进入oracle控制台 2.用户名输入 sqlplus/as sysdba,口令:空(回车即可) 3.连接成功后,输入& ...
- 面试题-Spring和Springboot框架
前言 spring框架部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,并添加了一些比较重要的问题,希望对大家起到一定的 ...
- Microsoft.NETCore.App 版本不一致导致的运行失败
场景重现 今天新建了一个 ASP.NET Core 的项目, 通过 Web Deploy 顺利发布到IIS上后, 但访问时出现如下异常: 异常原因 通过手动执行dotnet命令发现运行框架版本不一致? ...