洛谷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 个整点的函数值,那么:

  1. 有多少个函数满足条件?
  2. 满足条件的函数中,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​−x1​a−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]话旧 题解相关推荐

  1. 洛谷P4113 [HEOI2012]采花 题解

    洛谷P4113 [HEOI2012]采花 题解 题目链接:P4113 [HEOI2012]采花 题意:萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园 ...

  2. 洛谷P1129 [ZJOI2007] 矩阵游戏 题解

    洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...

  3. 洛谷P4683 [IOI2008] Type Printer 题解

    洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...

  4. 洛谷P3647 [APIO2014] 连珠线 题解

    洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...

  5. 洛谷P4170 [CQOI2007]涂色 题解

    洛谷P4170 [CQOI2007]涂色 题解 题目链接:P4170 [CQOI2007]涂色 题意: 假设你有一条长度为 555 的木板,初始时没有涂过任何颜色.你希望把它的 555 个单位长度分别 ...

  6. 洛谷P1868 饥饿的奶牛 题解

    洛谷P1868 饥饿的奶牛 题解 题目链接:P1868 饥饿的奶牛 题意: 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有 NNN 个区间,每个区 ...

  7. 洛谷P1462 通往奥格瑞玛的道路 题解

    洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...

  8. 洛谷 P2015 二叉苹果树 题解

    洛谷 P2015 二叉苹果树 题解 洛谷 P2015 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有NNN个结点(叶子点或者树枝分叉点),编号为1-NNN ...

  9. 洛谷P3879 [TJOI2010] 阅读理解 题解

    洛谷P3879 [TJOI2010] 阅读理解 题解 题目链接:P3879 [TJOI2010] 阅读理解 题意: 英语老师留了 NNN 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节 ...

最新文章

  1. 毕业,新的开始,撸起袖子加油干!
  2. axure中备注线_琉璃:璇玑小本子上,别人名字都有备注唯独司凤没有,意义很浪漫...
  3. 蓝牙HCI剖析(三)
  4. Python学习笔记之六:在VS中调用Python
  5. 【渝粤题库】陕西师范大学200401 初等代数研究 作业(专升本)
  6. 【C++】深度探索C++对象模型读书笔记--关于对象(Object Lessons)
  7. 如何计算离职率(1)?
  8. 中职学校新增计算机专业申请书,中职学校计算机专业学生的培养
  9. 让你更好使用 Typescript 的11个技巧
  10. python爬虫豆瓣top250_Python 爬取豆瓣TOP250实战
  11. java实现拆分元素,java-将列表沿元素拆分为子列表
  12. 诛仙 第一集 第八章 传艺
  13. 7Z命令在linux下的使用
  14. 框架:提供一定能力的小段程序
  15. Units are seconds since 1970.
  16. oracle pivot动态sql,参数化动态PIVOT行转列
  17. 关于“淘宝爆款”的数据抓取与数据分析
  18. zend framework
  19. 客户故事:4家银行如何打造新一代移动金融中心
  20. 操作系统——基础练习(期末复习)

热门文章

  1. css与mdx,mdx、mdd及css三者关系以及欧路中应如何安装css
  2. 抽奖机(用随机数)2.0-python
  3. KubeSphere——KubeSphere集群构建实战
  4. 全栈工程师和架构师的区别
  5. android otg读写文件,Android USB Host在USB设备OTG中读/写文件
  6. span之间的空隙怎样解决?
  7. edup无线网卡驱动安装linux,EDUP EP-N8513 (RTL8188CUS芯片)在Ubuntu 12.10下的wifi不能连接问题解决方法...
  8. 进程管理系统的设计与实现 SDUT 操作系统实训 项目 Java
  9. elasticsearch的master选举
  10. 《操作系统》-调度算法