洛谷P3336 [ZJOI2013]话旧 题解
洛谷P3336 [ZJOI2013]话旧 题解
题目链接:P3336 [ZJOI2013]话旧
题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来。回来后,他发现世界大变样了。比丘兽究级进化,成了凤凰兽;金先生因为发了一篇 paper,一跃成为教授,也成为了银河队选拔委员会成员。
一日,小林与金教授聊天。金教授回忆起过去的岁月,那些年他学过的电路原理。他曾经对一种三角波很感兴趣,并且进行了一些探究。小林感到很好奇,于是金教授就将课题形式化地说了一遍。
有一定义在 [0,N][0,N][0,N] 的连续函数 f(x)f(x)f(x),其中 NNN 是整数,满足 f(0)=f(N)=0f(0)=f(N)=0f(0)=f(N)=0,它的所有极值点在整数处取到,且 f(x)f(x)f(x) 的极小值均是 000。对于任意的 000 到 N−1N-1N−1 间的整数 III,f(x)f(x)f(x) 在 (I,I+1)(I, I+1)(I,I+1) 上是斜率为 111 或 −1-1−1 的一次函数。
金先生研究的是,若他知道其中 KKK 个整点的函数值,那么:
- 有多少个函数满足条件?
- 满足条件的函数中,f(x)f(x)f(x) 的最大值,最大能是多少?
小林思考了一下,便想出了很好的算法。那么作为经过多年训练的你呢?
输入格式
第一行包含两个用空格隔开的整数 N,KN,KN,K。接下来 KKK 行,每行两个整数,表示 xix_ixi 和 f(xi)f(x_i)f(xi)。
输出格式
一行两个整数,分别对应两个问题的答案。考虑到第一问答案可能很大,你只要输出它除以 199404171994041719940417 的余数。
输入输出样例
输入 #1
2 0
输出 #1
1 1
输入 #2
6 9 4 2 4 2 2 0 4 2 6 0 5 1 2 0 0 0 0 0
输出 #2
1 2
说明/提示
- 对于 10%10\%10% 的数据,N≤10N \leq 10N≤10。
- 对于 20%20\%20% 的数据,N≤50N \leq 50N≤50。
- 对于 30%30\%30% 的数据,N≤100N \leq 100N≤100,K≤100K \leq 100K≤100。
- 对于 50%50\%50% 的数据,N≤103N \leq 10^3N≤103,K≤103K \leq 10^3K≤103。
- 对于 70%70\%70% 的数据,N≤105N \leq 10^5N≤105。
- 另有 10%10\%10% 的数据,K=0K=0K=0。
- 对于 100%100\%100% 的数据,0≤N≤1090 \leq N \leq 10^90≤N≤109,0≤K≤1060 \leq K \leq 10^60≤K≤106。
题目说了极小值为 000 ,说明每次下降都是直接一口气到底的
从文字中可以看出题目保证了有解(不然怎么输出最大值)
考虑设计状态 dp[i][0/1]dp[i][0/1]dp[i][0/1] 表示是需要访问到 iii 结点时的路径是向上还是向下的
dp[i][1]→dp[i+1][0]dp[i][1] \to dp[i+1][0]dp[i][1]→dp[i+1][0]
显然延长左右的两条路径,可得零点 a,ba,ba,b
然后在 a,ba,ba,b 间反复横跳便可以相连了
设 a,ba,ba,b 间的距离为 2k2k2k ,则方案数为 2k−12^{k-1}2k−1
如下图 (2k=6)(2k=6)(2k=6)
\ /\ /\/\/\/\/
观察到其形成了 444 个
\/
的结构,不妨其为齿孔\ /\ /\ /\/ \/\/
注意到此时除了两侧的齿孔不可扩展以外,其余均可扩展
故方案数为 22=42^2 = 422=4
dp[i][0]→dp[i+1][0]dp[i][0] \to dp[i+1][0]dp[i][0]→dp[i+1][0]
不妨将 iii 与其向上的路径看作一个点,则又可以确定两个零点 a,ba,ba,b
而此时左侧的齿孔也可以扩展了,而右侧的仍不可,故方案数为 2k2^k2k
如下图 (2k=4)(2k=4)(2k=4)
/\ /\ /\/\/\/
扩展左侧齿孔会变成
/\ / / \ /\/\/
故方案数为 22=42^2 = 422=4
dp[i][1]→dp[i+1][1]dp[i][1]\to dp[i+1][1]dp[i][1]→dp[i+1][1]
与上一种情况类似,将 i+1i+1i+1 与其向下的路径看作一个点
右侧的齿孔可以扩展,而此时左侧的不可,故方案数为 2k2^k2k
dp[i][0]→dp[i+1][1]dp[i][0] \to dp[i+1][1]dp[i][0]→dp[i+1][1]
考虑将 i+1i+1i+1 与其向下的路径看作一个点
则此时左侧的齿孔可以扩展,而右侧的不可以
故方案数为 2k2^k2k
然而有些情况会导致 k<0k<0k<0 ,因此要特判一下
还有一些特殊的情况,比如 i+1i+1i+1 恰好在 iii 的向上/下的路径上,也需要特判
然后最大值的求解,根据贪心,一定先选掉所有的上升
设有 aaa 个上升, bbb 个下降,则有
{a+b=x2−x1a−b=y2−y1\begin{cases} a+b = x_2-x_1 \\ a-b = y_2-y_1 \end{cases} {a+b=x2−x1a−b=y2−y1
则最大值为
y1+a=12(x2+y2−x1+y1)y_1+a = \dfrac{1}{2}(x_2+y_2-x_1 + y_1) y1+a=21(x2+y2−x1+y1)
但是要注意,如果可以选择向上,一定有 dp[i][0]≠0dp[i][0]\ne0dp[i][0]=0
因此对于所有的 iii 到 i+1i+1i+1 的转移,都额外计算一下先走到底再上升的情况,即
12(x2+y2−x1−y1)\dfrac{1}{2}(x_2+y_2-x_1-y_1) 21(x2+y2−x1−y1)
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
namespace FastIO
{#define gc() readchar()#define pc(a) putchar(a)#define SIZ (int)(1e6+15)char buf1[SIZ],*p1,*p2;char readchar(){if(p1==p2)p1=buf1,p2=buf1+fread(buf1,1,SIZ,stdin);return p1==p2?EOF:*p1++;}template<typename T>void read(T &k){char ch=gc();T x=0,f=1;while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=gc();}k=x*f;}template<typename T>void write(T k){if(k<0){k=-k;pc('-');}static T stk[66];T top=0;do{stk[top++]=k%10,k/=10;}while(k);while(top){pc(stk[--top]+'0');}}
}using namespace FastIO;
#define N (int)(1e6+15)
const int p=19940417;
int n,k,mx;
void add(int &a,int b){a=((a+b%p)%p+p)%p;}
int qpow(int a,int b)
{int ans=1,base=a%p;while(b){if(b&1)ans=ans*base%p;base=base*base%p;b>>=1;}return ans;
}
struct node
{int x,y;
}a[N];
bool operator<(node a,node b){return a.x<b.x;}
bool operator==(node a,node b){return a.x==b.x&&a.y==b.y;}
int dp[N][2];
signed main()
{read(n);read(k);for(int i=1; i<=k; i++)read(a[i].x),read(a[i].y);a[++k]={0,0};a[++k]={n,0};sort(a+1,a+1+k);k=unique(a+1,a+1+k)-a-1;dp[1][1]=1;for(int i=1; i<k; i++){int d=(a[i+1].x-a[i].x-a[i+1].y-a[i].y)>>1;mx=max(mx,(a[i+1].x+a[i+1].y-a[i].x-a[i].y)>>1);if(dp[i][0])mx=max(mx,(a[i+1].x+a[i+1].y-a[i].x+a[i].y)>>1);if(a[i+1].y-a[i].y==a[i].x-a[i+1].x)add(dp[i+1][1],dp[i][0]+dp[i][1]);else if(a[i+1].y-a[i].y==a[i+1].x-a[i].x)add(dp[i+1][0],dp[i][0]+(a[i].y?0:dp[i][1]));else if(d<0)add(dp[i+1][1],dp[i][0]);else if(d==0)add(dp[i+1][0],dp[i][0]+dp[i][1]),add(dp[i+1][1],dp[i][0]);else{int c=qpow(2,d-1);if(a[i+1].y)add(dp[i+1][0],(dp[i][1]+2ll*dp[i][0]%p)%p*c);add(dp[i+1][1],(dp[i][1]+2ll*dp[i][0]%p)%p*c);}}printf("%lld %lld\n",dp[k][1],mx);return 0;
}
转载请说明出处
洛谷P3336 [ZJOI2013]话旧 题解相关推荐
- 洛谷P4113 [HEOI2012]采花 题解
洛谷P4113 [HEOI2012]采花 题解 题目链接:P4113 [HEOI2012]采花 题意:萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园 ...
- 洛谷P1129 [ZJOI2007] 矩阵游戏 题解
洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...
- 洛谷P4683 [IOI2008] Type Printer 题解
洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...
- 洛谷P3647 [APIO2014] 连珠线 题解
洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...
- 洛谷P4170 [CQOI2007]涂色 题解
洛谷P4170 [CQOI2007]涂色 题解 题目链接:P4170 [CQOI2007]涂色 题意: 假设你有一条长度为 555 的木板,初始时没有涂过任何颜色.你希望把它的 555 个单位长度分别 ...
- 洛谷P1868 饥饿的奶牛 题解
洛谷P1868 饥饿的奶牛 题解 题目链接:P1868 饥饿的奶牛 题意: 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有 NNN 个区间,每个区 ...
- 洛谷P1462 通往奥格瑞玛的道路 题解
洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...
- 洛谷 P2015 二叉苹果树 题解
洛谷 P2015 二叉苹果树 题解 洛谷 P2015 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有NNN个结点(叶子点或者树枝分叉点),编号为1-NNN ...
- 洛谷P3879 [TJOI2010] 阅读理解 题解
洛谷P3879 [TJOI2010] 阅读理解 题解 题目链接:P3879 [TJOI2010] 阅读理解 题意: 英语老师留了 NNN 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节 ...
最新文章
- 毕业,新的开始,撸起袖子加油干!
- axure中备注线_琉璃:璇玑小本子上,别人名字都有备注唯独司凤没有,意义很浪漫...
- 蓝牙HCI剖析(三)
- Python学习笔记之六:在VS中调用Python
- 【渝粤题库】陕西师范大学200401 初等代数研究 作业(专升本)
- 【C++】深度探索C++对象模型读书笔记--关于对象(Object Lessons)
- 如何计算离职率(1)?
- 中职学校新增计算机专业申请书,中职学校计算机专业学生的培养
- 让你更好使用 Typescript 的11个技巧
- python爬虫豆瓣top250_Python 爬取豆瓣TOP250实战
- java实现拆分元素,java-将列表沿元素拆分为子列表
- 诛仙 第一集 第八章 传艺
- 7Z命令在linux下的使用
- 框架:提供一定能力的小段程序
- Units are seconds since 1970.
- oracle pivot动态sql,参数化动态PIVOT行转列
- 关于“淘宝爆款”的数据抓取与数据分析
- zend framework
- 客户故事:4家银行如何打造新一代移动金融中心
- 操作系统——基础练习(期末复习)
热门文章
- css与mdx,mdx、mdd及css三者关系以及欧路中应如何安装css
- 抽奖机(用随机数)2.0-python
- KubeSphere——KubeSphere集群构建实战
- 全栈工程师和架构师的区别
- android otg读写文件,Android USB Host在USB设备OTG中读/写文件
- span之间的空隙怎样解决?
- edup无线网卡驱动安装linux,EDUP EP-N8513 (RTL8188CUS芯片)在Ubuntu 12.10下的wifi不能连接问题解决方法...
- 进程管理系统的设计与实现 SDUT 操作系统实训 项目 Java
- elasticsearch的master选举
- 《操作系统》-调度算法