玲珑OJ 1083:XJT Love Digits(离线处理+哈希)

http://www.ifrog.cc/acm/problem/1083

题意:比较好懂。注意答案的x不包含ax本身,所以才输出-1。

思路:离线处理。根据x排序,然后每次更新Hash[]数组就好了。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <string>
 7 #include <iostream>
 8 #include <stack>
 9 #include <map>
10 #include <queue>
11 #include <set>
12 using namespace std;
13 typedef long long LL;
14 #define N 100010
15 #define INF 0x3f3f3f3f
16 struct P {
17     int x, id;
18 } ask[N];
19 int Hash[N], p[N], ans[N];
20
21 bool cmpx(const P &a, const P &b) { if(a.x == b.x) return a.id < b.id; return a.x < b.x; }
22
23 int get(int num) {
24     int ans = 0;
25     while(num) {
26         ans += num % 10;
27         num /= 10;
28     }
29     return ans;
30 }
31
32 int main()
33 {
34     int t, cas = 1;
35     scanf("%d", &t);
36     while(t--) {
37         int n, q;
38         scanf("%d%d", &n, &q);
39         for(int i = 1; i <= n; i++)
40             scanf("%d", &p[i]);
41         for(int i = 1; i <= q; i++) {
42             scanf("%d", &ask[i].x);
43             ask[i].id = i;
44         }
45         sort(ask + 1, ask + q + 1, cmpx);
46         printf("Case #%d:\n", cas++);
47         memset(Hash, -1, sizeof(Hash));
48         int j = 1, now;
49         for(int i = 1; i <= q; i++) {
50             while(ask[i].x > j && j <= n) {
51                 now = get(p[j]);
52                 Hash[now] = max(Hash[now], p[j]);
53                 j++;
54             }
55             now = get(p[ask[i].x]);
56             if(Hash[now] == -1) ans[ask[i].id] = -1;
57             else ans[ask[i].id] = Hash[now];
58         }
59         for(int i = 1; i <= q; i++) printf("%d\n", ans[i]);
60     }
61     return 0;
62 }
时间: 2024-10-11 18:09:02

玲珑OJ 1083:XJT Love Digits(离线处理+哈希)的相关文章

玲珑oj 1117 线段树+离线+离散化,laz大法

1117 - RE:从零开始的异世界生活 Time Limit:1s Memory Limit:256MByte Submissions:438Solved:68 DESCRIPTION 486到了异世界,看到了一群可爱的妹子比如蕾姆啊,艾米莉亚啊,拉姆啊,白鲸啊,怠惰啊等等!有一天膜女告诉486说她的能力可能不能再用了,因为膜女在思考一个数据结构题,没心情管486了.486说我来帮你做,膜女说你很棒棒哦! 给一个集合,最开始为空(不是数学上的集合)五个操作: 1.插入x2.把小于x的数变成x3

九度OJ 1083 特殊乘法 (模拟)

题目1083:特殊乘法 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2910 解决:2027 题目描述: 写个算法,对2个小于1000000000的输入,求结果. 特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5 输入: 两个小于1000000000的数 输出: 输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果. 样例输入: 123 45 样例输出: 54 简单模拟 #include<std

zzuli OJ 1083: 数值统计(多实例测试)

Description 统计给定的n个数中,负数.零和正数的个数 Input 输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数:如果n=0,则表示输入结束,该行不做处理. Output 对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数.零和正数的个数. Sample Input 6 0 1 2 3 -1 05 1 2 3 4 0.50 Sample Output 1 2 30 0 5 HINT Source #include

玲珑oj 1121 思维

1121 - Reverse the lights Time Limit:2s Memory Limit:256MByte Submissions:376Solved:111 DESCRIPTION 有n 个灯,初始时都是不亮的状态,每次你可以选择一个某一个灯,不妨记为x,所有满足和x距离不超过k的灯的状态都将被翻转,选择第i个灯的代价记为ci ,问最终所有灯都是亮的状态的最小花费. INPUT 输入有两行,第一行包含两个正整数n(1≤n≤10000)和k(0≤k≤1000) 第二行包含n个整数

“玲珑杯”算法比赛 Round #14题目与标程

"玲珑杯"算法比赛 Round #14By:wxh010910 Start Time:2017-05-13 16:00:00 End Time:2017-05-13 18:30:00 Refresh Time:2017-05-20 09:51:24 Public p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin:

揭秘:黑客必备的Kali Linux是什么,有哪些弊端?

我们很多人都会对黑客感兴趣,甚至觉得黑客霸气外漏,当然也有人是觉得黑客是遭人唾弃,没干啥好事儿.先不管黑客这个职业有什么好与不好,我们了解黑客,也是为了防止自己的信息安全被泄露.今天就揭秘黑客常用的Kali Linux.(有想要学习Kali知识的小伙伴可以加群:726965091获取视频资料,每天更新) Kali Linux到底是什么? Kali Linux是一个基于Debian的Linux发行版,它与其它的Linux系统最大的不同就是它预装了14大类(如下图),300多个安全测试和渗透软件,包

light oj 1045 - Digits of Factorial K进制下N!的位数

1045 - Digits of Factorial Factorial of an integer is defined by the following function f(0) = 1 f(n) = f(n - 1) * n, if(n > 0) So, factorial of 5 is 120. But in different bases, the factorial may be different. For example, factorial of 5 in base 8 i

LeetCode OJ:Add Digits(数字相加)

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it. Follow up: Could you do it without an

LeetCode OJ 之 Add Digits (数字相加)

题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it. Follow up: Could you do it withou