Weekly 10 小结

A题

模拟

 1 T = int(input())
 2 while T:
 3     T -= 1
 4     s = raw_input()
 5     n = len(s)
 6     res, pre = 0, 0
 7     for i in xrange(1, n):
 8         if (s[i] == s[pre]):
 9             res += 1
10         else:
11             pre = i
12     print res

B题

模拟

 1 n, k = map(int, raw_input().split())
 2 s = raw_input()
 3
 4 res = []
 5 ans = 0
 6 for i in xrange(n):
 7     if i >= k:
 8         ans ^= int(res[i-k])
 9     tmp = ans ^ int(s[i])
10     res.append(tmp)
11     ans ^= tmp
12 print ‘‘.join(map(str, res))

C题

题目大意:给出k种高度不同的积木,每种积木可以使用无数次,问使用这些积木拼成高度为N的塔的方法数对1e9 + 7的模是多少。

另F(x)为拼接成高度为x的方法数,则F(x) = sigma(F(i)) (1 <= i <= k && high[i] <= x)

可先处理出1~15的F函数的值,当N>15时,使用矩阵加速即可。

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <cstring>
 5 #include <iostream>
 6 #include <algorithm>
 7 using namespace std;
 8
 9 typedef long long LL;
10 const int MOD = 1e9 + 7;
11 #define rep(i, n) for (int i = (1); i <= (n); i++)
12 LL N, K, A[20], f[20];
13 struct Matrix {
14     LL a[20][20];
15     Matrix() {memset(a, 0, sizeof(a));}
16
17     Matrix operator * (const Matrix &x) const {
18         Matrix c;
19         rep (i, 15) rep (k, 15) rep (j, 15) c.a[i][j] = (c.a[i][j] + x.a[k][j] * a[i][k]) % MOD;
20         return c;
21     }
22 };
23
24 Matrix pow_mod(Matrix a, LL b) {
25     if (b < 0) return a;
26     Matrix res;
27     rep (i, K) res.a[i][i] = 1;
28     while (b > 0) {
29         if (b & 1) res = res * a;
30         a = a * a;
31         b >>= 1;
32     }
33     return res;
34 }
35
36
37 int main() {
38     ios::sync_with_stdio(false);
39     cin >> N >> K;
40     rep (i, K) cin >> A[i];
41
42     sort(A + 1, A + K + 1);
43     f[0] = 1;
44     rep (i, 15) rep (j, K) if (i >= A[j]) f[i] = (f[i] + f[i - A[j]]) % MOD;
45     rep (i, 15) cerr << f[i] << endl;
46     if (N <= 15) {
47         cout << f[N] * 2 % MOD << endl;
48         return 0;
49     }
50
51     Matrix a; rep (i, 15) a.a[i][i-1] = 1;
52     a.a[1][1] = 0; rep (i, K) a.a[1][A[i]] = 1;
53     Matrix res = pow_mod(a, N - 15);
54     LL ans = 0;
55     rep (i, 15) ans = (ans + res.a[1][i] * f[16 - i]) % MOD;
56     ans = (ans * 2) % MOD;
57     cout << ans << endl;
58     return 0;
59 }

D题

题目大意:给出N个点,每个点有两个值V和P。要求从1开始走到N,在每个点选择有两种选择,要么将总得分加上V,要么还可以向前走P步。

目标是使得走到N时的总得分最大。题目保证至少存在一种解。

这题DP方程很明显,从后往前进行dp, dp[i] = min(dp[i], dp[j]), i < j <= i + P[i];

所以对于每个点,要快速的求出dp[i]~dp[i + P[i]] 的最小值。

直到做这个题我才知道原来BIT也可以用来求最值,原来0base和1base是这个含义。。(数组下标从0/1开始)

原来BIT数组下标可以从0开始,貌似被称为0base邪教,如:for (int x = i; x >= 0; x -= ~x & x + 1) {}

这里很巧妙的利用了~x = - x + 1,即~x = -(x + 1),还有运算符的优先级。摘自叉姐代码。

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 #define rep(i, n) for (int i = (1); i <= (n); i++)
 9 typedef long long LL;
10 const int MAX_N = 500050;
11 const LL INF = (LL)1e18;
12 int V[MAX_N], P[MAX_N];
13 LL tree[MAX_N];
14 int N;
15
16 int main() {
17     scanf("%d", &N);
18     for (int i = 1; i <= N; i++) scanf("%d %d", V+i, P+i);
19
20     fill(tree+1, tree+N+1, -INF);
21     LL ans = tree[N] = V[N], sum = 0;
22     for (int i = N-1; i >= 1; i--) {
23         ans = -INF;
24         for (int x = min(i+P[i], N); x > 0; x -= x&-x)
25             ans = max(ans, tree[x]);
26         if (ans > -INF) {
27             for (int x = i; x <= N; x += x&-x)
28                 tree[x] = max(tree[x], ans - V[i]);
29         }
30
31         ans += sum;
32         sum += V[i];
33     }
34     printf("%lld\n", ans);
35
36     return 0;
37 }

E题

时间: 2024-10-05 20:33:10

Weekly 10 小结的相关文章

(1)---(10)小结

1.IP地址(所有连入Internet的终端设备(包括计算机.PDA.打印机以及其他的电子设备)都有一个唯一的索引,这个索引被称为IP地址)   :IPv4,IPv62. InetAddress类:Java中用于描述IP地址的类, 由于InetAddress没有public的构造方法,因此,要想创建InetAddress对象,必须得依靠它的四个静态方法  (1)InetAddress可以通过getLocalHost方法得到本机的InetAddress对象  (2)getByName:这个方法是I

计算机系统漫游

计算机系统由硬件系统和软件系统组成,它们共同协作来完成执行程序的任务.作为20世纪(世界上第一台计算机ENIAC与1946年诞生于美国的宾夕法尼亚大学)最伟大的发明之一,计算机系统可以说是人类迄今为止创造的最复杂最精密的工具.今天,借助计算机界的圣经教材<深入理解计算机系统>,我来带领大家探索一下计算机系统的秘密. 1 信息就是位 + 上下文 计算机是信息学科的产物,其主要左右就是帮助人们处理各种各样的信息.而信息本身是一个比较抽象的概念,从百度百科给出的定义中我们可以知道,信息是用来传输和处

C# LINQ 详解 From Where Select Group Into OrderBy Let Join

目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 LINQ的全称是Language Integrated Query,中文译成"语言集成查询".LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组件来实现这个封装,分别是LINQ to Object.LINQ to ADO.NET.LINQ to XML.它们和.NET

深入理解计算机系统,第一章:漫游

计算机系统漫游 1.1 信息就是位+上下文 先看一个简单的Hello World C程序. 1 #include <stdio.h> 2 3 void main() 4 { 5 printf("Hello World!\n"); 6 } 这个程序的源文件是文本格式,以字节序列的方式存储在文件中,由一种叫ASCII码的方式编码.除了文本文件之外的其它文件都是二进制文件. 由HelloWorld程序的存储方式可以猜测,信息,包括磁盘文件.内存中运行的程序.内存中储存的用户数据以

DF和DU命令

做为DBA日常巡检工作,是必不可少的,DU和DF命令是常用的,下面简单说说 df命令详细用法 a:显示全部的档案系统和各分割区的磁盘使用情形 i:显示i -nodes的使用量 k:大小用k来表示 (默认值) t:显示某一个档案系统的所有分割区磁盘使用量 x:显示不是某一个档案系统的所有分割区磁盘使用量 T:显示每个分割区所属的档案系统名称 常用命令:df -hi 操作详解 引用 指令 df 可以显示目前所有档案系统的最大可用空间及使用情形,请看下列这个例子: # df -h Filesystem

C++学习笔记5 容器

1.  使用assign assign 操作首先删除容器中所有的元素,然后将其参数所指定的新元素插入到该容器中.与复制容器元素的构造函数一样,如果两个容器类型相同,其元 素类型也相同,就可以使用赋值操作符(=)将一个容器赋值给另一个容器.如果在不同(或相同)类型的容器内,元素类型不相同但是相互兼容,则其赋值运 算必须使用assign 函数.例如,可通过assign 操作实现将vector 容器中一段char* 类型的元素赋给string 类型list 容器. 由于assign 操作首先删除容器中

《现代操作系统(原书第3版)》pdf

下载地址:网盘下载 内容简介  · · · · · · 本书是操作系统领域的经典之作,与第2版相比,增加了关于Linux.Windows Vista和Symbian操作系统的详细介绍.书中集中讨论了操作系统的基本原理,包括进程.线程.存储管理.文件系统.输入/输出.死锁等,同时还包含了有关计算机安全.多媒体操作系统.掌上计算机操作系统.微内核.多核处理机上的虚拟机以及操作系统设计等方面的内容.此外,还在第2版的基础上对部分习题进行了增删,更有助于读者学习和对知识的理解及掌握. 本书适合作为高等院

Linq学习之旅——LINQ查询表达式

1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 LINQ的全称是Language Integrated Query,中文译成“语言集成查询”.LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组件来实现这个封装,分别是LINQ to Object.LINQ to ADO.NET.LINQ to XML.它们和.NET语言的关系如下:

Linux设备模型——设备驱动模型和sysfs文件系统解读

本文将对Linux系统中的sysfs进行简单的分析,要分析sysfs就必须分析内核的driver-model(驱动模型),两者是紧密联系的.在分析过程中,本文将以platform总线和spi主控制器的platform驱动为例来进行讲解.其实,platform机制是基于driver-model的,通过本文,也会对platform机制有个简单的了解. 内核版本:2.6.30 1. What is sysfs? 个人理解:sysfs向用户空间展示了驱动设备的层次结构.我们都知道设备和对应的驱动都是由内