2017广东工业大学程序设计竞赛决赛 G 等凹数字

题意:

Description

定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样的,仅形成一个等凹峰,如543212345,5544334455是合法的等凹数字,543212346,123321,111111不是等凹数字。现在问你[L,R]中有多少等凹数字呢?

Input

第一行一个整数T,表示数据的组数。

接下来T行每行俩个数字L和R,(1<=L<=R<=1e18)

Output

输出一个整数,代表[L,R]中有多少等凹数字

Sample Input

2 1 100 101 200

Sample Output

0 1

HINT

小于等于2位的数字无凹峰

思路:

数位dp,要记录的状态为剩下的数位,等凹数的长度,前缀的最后一个数字,前缀是否上升过,前缀是否下降过,前缀是否是回文,前缀是否为0。

在判断是否是回文的时候还要用一个数组记录前缀。

实现:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 typedef long long ll;
 6
 7 int num[20], buf[20], n, t;
 8 int dp[20][20][10][2][2][2];
 9 ll l, r;
10
11 int dfs(int now, int len, int last, bool up, bool down, bool isP, bool lz, bool flag)
12 {
13     if (now == 0)
14     {
15         return up && down && isP;
16     }
17     if (!flag && dp[now][len][last][up][down][isP] != -1)
18         return dp[now][len][last][up][down][isP];
19     int res = 0;
20     int u = flag ? num[now] : 9;
21     for (int i = 0; i <= u; i++)
22     {
23         buf[now] = i;
24         if (lz)
25             res += dfs(now - 1, len - (i == 0), i, up, down,
26                        isP, i == 0, flag && i == u);
27         else if (i == last)
28         {
29             if (isP && now <= len / 2)
30                 res += dfs(now - 1, len, i, up, down,
31                            i == buf[len + 1 - now], false, flag && i == u);
32             else
33                 res += dfs(now - 1, len, i, up, down,
34                            isP, false, flag && i == u);
35         }
36         else if (i < last)
37         {
38             if (up)
39                 continue;
40             if (isP && now <= len / 2)
41                 res += dfs(now - 1, len, i, false, true,
42                            i == buf[len + 1 - now], false, flag && i == u);
43             else
44                 res += dfs(now - 1, len, i, false, true,
45                            isP, false, flag && i == u);
46         }
47         else
48         {
49             if (!down)
50                 continue;
51             if (isP && now <= len / 2)
52                 res += dfs(now - 1, len, i, true, true,
53                            i == buf[len + 1 - now], false, flag && i == u);
54             else
55                 res += dfs(now - 1, len, i, true, true,
56                            isP, false, flag && i == u);
57         }
58     }
59     return flag ? res : dp[now][len][last][up][down][isP] = res;
60 }
61
62 int query(ll x)
63 {
64     memset(dp, -1, sizeof(dp));
65     n = 0;
66     while (x)
67     {
68         num[++n] = x % 10;
69         x /= 10;
70     }
71     return dfs(n, n, 0, false, false, true, true, true);
72 }
73
74 int main()
75 {
76     cin >> t;
77     while (t--)
78     {
79         scanf("%lld %lld", &l, &r);
80         printf("%d\n", query(r) - query(l - 1));
81     }
82     return 0;
83 }
时间: 2024-08-26 10:40:51

2017广东工业大学程序设计竞赛决赛 G 等凹数字的相关文章

2017广东工业大学程序设计竞赛决赛-tmk买礼物

tmk买礼物 Description 今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下. TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店第2147483647位顾客,本店在搞一个活动,对本店第2147483647位顾客进行赠送活动.你先看看你有多少钱?” TMK一摸口袋,发现只有n个硬币,每个硬币的价值为a[i]. 然后店主继续说:“现在你用你的钱凑一些数,如果你的钱能凑成[0,x]里面所有的数,那么你将会免费获得该店价值x元的代金

2017广东工业大学程序设计竞赛 E倒水(Water)

原题链接:http://www.gdutcode.sinaapp.com/problem.php?cid=1057&pid=4 Problem E: 倒水(Water) Description 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会

北京师范大学第十七届程序设计竞赛决赛 G

传送门:https://ac.nowcoder.com/acm/contest/895/G 题意: \[ 操作 1:L,R,X,Y,对所有L≤i≤R赋值 \Ai=min(Ai,(i?L)×Y+X)Ai=min(Ai,(i?L)×Y+X),\其中 L, R, X, Y 均为整数,且有 1≤L≤R≤n,|X|≤100000,|Y|≤5\操作 2:x,询问Ax的值,这里 x 是整数,且有1≤x≤n \] 题解: 如果我们区间更新最小值的话,这个min值将变的十分难以维护,所以我们考虑将公式拆分出来 \

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解 华南师范大学第很多届 ACM 程序设计竞赛新生赛(初赛)在 2017 年 11 月 20 日 - 27 日成功举行,共有 146 名同学有效参赛(做出 1 题).进入决赛的资格初定为完成并通过 5 题或以上,决赛时间是 12 月 3 日,地点未定. 题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也

第十四届华中科技大学程序设计竞赛决赛同步赛

第十四届华中科技大学程序设计竞赛决赛同步赛 A Beauty of Trees 思维,带权并查集 题意: 长度为 n 的序列,没告诉你具体数是多少.只给出 m 个查询,表示区间 [l,r] 的异或和为 k .但是第 i 个查询如果和前面的查询有矛盾,那就是错误的.输出所有的错误查询. tags: 对于一个查询,我们知道 sum[r] ^ sum[l-1] = k . 建成图就是 r -> (l-1) ,但要快速地求出异或值,就要用带权并查集处理.如有 sum[r]^sum[l-1]=k,即 r

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6154 CaoHaha&#39;s staff 思维

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6154 题意:在笛卡尔坐标系下,画一个面积至少为  n 的简单多边形,每次只能画一条边或者一个格子的对角线,问至少要画几条. 解法:如果一个斜着的矩形长宽分别是 a,b,那么它的面积是 2ab.最优解肯定是离 sqrt(n/2)很近的位置.想想 n=5 时答案为什么是7 然后在那个小范围内枚举一下就好了.我给一张做题时画的图 #include <bits/stdc++.h> using namesp

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6154 CaoHaha&#39;s staff(几何找规律)

Problem Description "You shall not pass!"After shouted out that,the Force Staff appered in CaoHaha's hand.As we all know,the Force Staff is a staff with infinity power.If you can use it skillful,it may help you to do whatever you want.But now,hi

2017中国大学生程序设计竞赛 - 女生专场(dp)

Building Shops Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 701 Accepted Submission(s): 265 Problem Description HDU's n classrooms are on a line ,which can be considered as a number line. Eac

2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)

Happy Necklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1146    Accepted Submission(s): 491 Problem Description Little Q wants to buy a necklace for his girlfriend. Necklaces are single