【清北学堂2018-刷题冲刺】Contest 4
Task 1:序列
【问题描述】
小H原本有一个由连续的正整数组成的序列,如{4,5,6}或{10,11,12,13,14,15,16},但是她最近睡眠不足,只能记得其中的一些数字。她想知道,她最少可能只忘了多少数字。
【输入】
第一行一个整数N表示小H记得的数的个数。
第二行N个正整数Ai表示小H记得的数,保证Ai互不相同但是以打乱的顺序给出。
【输出】
一行一个整数表示答案。
【输入输出样例】
4 10 13 12 8
2
【样例解释】
可能的原序列是{8,9,10,11,12,13},小H只忘记了{9,11}两个数。
【数据范围】
1 – 4 1 ≤ N,Ai ≤ 100
5 – 8 1 ≤ N,Ai ≤ 1000
9 - 10 1 ≤ N ≤ 106,1 ≤ Ai ≤10^9
傻X题,直接水过。数据范围的话,N的范围实际上有点危险,建议手写max,min+快读。
#include<cstdio>
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline int read(){
int s=0;
char ch=getchar();
while('9'<ch||ch<'0'){
ch=getchar();
}
while('0'<=ch&&ch<='9'){
s=s*10+ch-'0';
ch=getchar();
}
return s;
}
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
int maxn=0,minn=0x3f3f3f3f,n=read();
register int tmp;
for(register int i=1;i<=n;++i){
tmp=read();
maxn=max(maxn,tmp);
minn=min(minn,tmp);
}
printf("%d\n",maxn-minn-n+1);
return 0;
}
Task 2:食物
【问题描述】
小H喜欢吃肉、鱼和巧克力,但她不喜欢某些食用的顺序。
小H每小时都会吃肉、鱼和巧克力其中一种。但如果出现以下情况,她就会不开心:
有连续3小时吃同一种食物。
有连续3小时她吃了所有种类的食物且中间那小时吃的是巧克力。
有连续3小时她在中间那小时吃了肉或鱼而此外的两小时吃的是巧克力。
小H想知道,有多少种吃东西的序列能让自己在连续N个小时保持开心。
你只需要输出答案对1000000007取模后的值。
【输入】
第一行一个整数T表示数据组数。
接下来T行每行一个整数N。
【输出】
对于每组数据输出一行一个整数表示答案。
【输入输出样例】
3 3 4 15
20 46 435170
【数据范围】
- 1 – 6 1 ≤ N ≤ 10^6
- 7 – 10 1 ≤ N ≤ 10^9
对于这个题目来说,搜索很显然是不可能跑得动的。
先考虑最直观的想法:直接DP,进行转移。复杂度O(nT)。
设三种食物分别为1,2,3,那么有几种情况是不可用的:
1 1 1
2 2 2
3 3 3
1 3 2
2 3 1
3 1 3
3 2 3
排除这些情况,其他的直接进行转移即可。
但是很显然1e9的总复杂度再带上一个不小的常数是不可能跑过去的,60pts都没有。这是我们会发现:输入只有一个变量,而询问有1000次。我们考虑O(n)预处理优化一下,提前存储答案,就有了60pts。
100pts的写法呢?看到1e9的数据就应该意识到这是一个矩阵加速递推的题目
首先我们把3x3的状态压缩成1x9来看看最初的转移:
.png)
我们的转移就这样变成了可以被矩阵优化的形式,接下来的操作就变得自然而然:构造一个9x9的矩阵。
经过大力构造,我们就得到了这样一个东西:
按照我们构造时候的定义,答案矩阵就是初始矩阵*tmp^(n-2)了,矩阵快速幂大力跑过去,100pts到手。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=1000000007;
int tmp[10][10]={
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,1,0,0},
{0,1,0,0,1,0,0,1,0,0},
{0,1,0,0,1,0,0,0,0,0},
{0,0,1,0,0,1,0,0,1,0},
{0,0,1,0,0,0,0,0,1,0},
{0,0,1,0,0,1,0,0,0,0},
{0,0,0,1,0,0,0,0,0,1},
{0,0,0,0,0,0,1,0,0,1},
{0,0,0,1,0,0,1,0,0,0}
};
int bg[2][10]={
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,1,1,1}
};//state of begin
struct Matrix{
int mp[10][10];
void Init(){
memset(mp,0,sizeof(mp));
}
void Unit(){
memset(mp,0,sizeof(mp));
for(int i=1;i<=9;++i){
mp[i][i]=1;
}
}
};
Matrix __mul(Matrix x,Matrix y){
Matrix ans;
ans.Init();
for(register int i=1;i<=9;++i){
for(register int j=1;j<=9;++j){
for(register int k=1;k<=9;++k){
ans.mp[i][k]=(ans.mp[i][k]+(long long)x.mp[i][j]*y.mp[j][k])%mod;
}
}
}
return ans;
}
Matrix __pow(Matrix tmp,int p){
Matrix ans;
ans.Unit();//initialize
while(p){
if(p&1){
p^=1;
ans=__mul(ans,tmp);
}
p>>=1;
tmp=__mul(tmp,tmp);
}
return ans;
}
int main(){
freopen("food.in","r",stdin);
freopen("food.out","w",stdout);
Matrix mat;
for(int i=0;i<=9;++i){
for(int j=0;j<=9;++j){
mat.mp[i][j]=tmp[i][j];
}
}
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
Matrix res=__pow(mat,n-2),ans;
ans.Init();
for(int i=1;i<=1;++i){
for(int j=1;j<=9;++j){
for(int k=1;k<=9;++k){
ans.mp[i][k]=(ans.mp[i][k]+(long long)bg[i][j]*res.mp[j][k])%mod;
}
}
}
int anss=0;
for(int i=1;i<=9;++i){
anss=(anss+ans.mp[1][i])%mod;
}
printf("%d\n",anss);
}
return 0;
}
Task 3:雪
【问题描述】
小H喜欢堆雪堆,在一共N天的寒假里,她在第i天会堆一个体积为Vi的雪堆。
雪堆每天都会融化一部分,准确地讲,如果这天的气温是Ti,那么每个堆好的雪堆的体积都会减少Ti。如果某个雪堆的体积减到了0,那么它便会消失。
小H想知道每天总共融化的雪的体积是多少。
【输入】
第一行为1个正整数N。
第二行为N个正整数Vi。
第三行为N个整整数Ti。
【输出】
共N行每行一个整数表示当天融化的雪的总体积。
【输入输出样例】
5
30 25 20 15 10
9 10 12 4 13
ans:9 20 35 11 25
【数据范围】
- 1 – 4 1 ≤ N ≤ 100
- 5 - 6 1 ≤ N ≤ 1000
- 7 - 10 1 ≤ N ≤ 100000
对于100%的数据:0 ≤ Vi, Ti ≤ 109。
大水题,没有想象中那么复杂,直观想法就可以跑过去。
维护气温的前缀和,二分答案找到第i天堆的雪人会在哪天化掉。在这一天特殊处理,其他天都是完整的化掉一个气温大小的体积,所以丢进树状数组差分维护即可。
树状数组大法吼啊!!!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
#define lint long long
using namespace std;
lint n,V[MAXN],T[MAXN],sum[MAXN],ans[MAXN],Tree[MAXN];
inline lint read(){
lint s=0;
char ch=getchar();
while('9'<ch||ch<'0'){
ch=getchar();
}
while('0'<=ch&&ch<='9'){
s=s*10+ch-'0';
ch=getchar();
}
return s;
}
inline lint lowbit(lint x){
return x&-x;
}
inline void add(lint pos,lint val){
while(pos<=n){
Tree[pos]+=val;
pos+=lowbit(pos);
}
}
inline lint getsum(lint pos){
lint ans=0;
while(pos){
ans+=Tree[pos];
pos-=lowbit(pos);
}
return ans;
}
int main(){
freopen("snow.in","r",stdin);
freopen("snow.out","w",stdout);
n=read();
for(register int i=1;i<=n;++i){
V[i]=read();
}
for(register int i=1;i<=n;++i){
T[i]=read();
sum[i]=sum[i-1]+T[i];
//维护一个时间的前缀和
}
for(register int i=1;i<=n;++i){
//day i:build V[i],melt T[i]
lint pos=lower_bound(sum+1,sum+1+n,V[i]+sum[i-1])-sum;
ans[pos]+=V[i]-(sum[pos-1]-sum[i-1]);
add(i,1);
add(pos,-1);
}
for(register int i=1;i<=n;++i){
ans[i]+=getsum(i)*T[i];
printf("%lld ",ans[i]);
}
return 0;
}
【清北学堂2018-刷题冲刺】Contest 4的更多相关文章
- 2017 清北济南考前刷题Day 7 afternoon
期望得分:100+100+30=230 实际得分:100+100+30=230 1. 三向城 题目描述 三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口.(来自取名力为0的 ...
- 2017 清北济南考前刷题Day 1 afternoon
期望得分:80+30+70=180 实际得分:10+30+70=110 T1 水题(water) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK出了道水 ...
- 2017 清北济南考前刷题Day 3 morning
实际得分:100+0+0=100 T1 右上角是必败态,然后推下去 发现同行全是必胜态或全是必败态,不同行必胜必败交叉 列同行 所以n,m 只要有一个是偶数,先手必胜 #include<cstd ...
- 2017 清北济南考前刷题Day 3 afternoon
期望得分:100+40+100=240 实际得分:100+40+100=240 将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 ,那么无解 如果边数=点数,那么贡献是 2 如果边数 ...
- 2017 清北济南考前刷题Day 4 afternoon
期望得分:30+50+30=110 实际得分:40+0+0=40 并查集合并再次写炸... 模拟更相减损术的过程 更相减损术,差一定比被减数小,当被减数=减数时,停止 对于同一个减数来说,会被减 第1 ...
- 2017 清北济南考前刷题Day 7 morning
期望得分:100+50+20=170 实际得分:10+50+20=80 1. 纸牌 题目描述 在桌面上放着n张纸牌,每张纸牌有两面,每面都写着一个非负整数.你的邪王真眼可以看到所有牌朝上的一面和朝下的 ...
- 2017 清北济南考前刷题Day 6 afternoon
期望得分:100+100+30=230 实际得分: 正解: 枚举最高的位,这一位m是1但实际用了0 然后剩余的低位肯定是 正数就用1,负数用0 考场思路:数位DP #include<cstdio ...
- 2017 清北济南考前刷题Day 6 morning
T1 贪心 10 元先找5元 20元 先找10+5,再找3张5 #include<cstdio> using namespace std; int m5,m10,m20; int main ...
- 2017 清北济南考前刷题Day 5 afternoon
期望得分:100+100+30=230 实际得分:0+0+0=30 T1 直接模拟 #include<cstdio> #include<iostream> using name ...
- 2017 清北济南考前刷题Day 5 morning
期望得分:100+100+0=200 实际得分: 坐标的每一位不是0就是1,所以答案就是 C(n,k) #include<cstdio> #include<iostream> ...
随机推荐
- JavaScript之简易http接口测试工具网页版
简易http接口测试工具网页版,支持get.post请求,支持json格式消息体,form表单暂不支持. httpClient.html <!DOCTYPE html> <html ...
- Lodop打印控件打印机可打区域的影响 设置纸张边缘为基点
由于打印机千差万别,打印开发也要注意针对客户各种打印机进行处理,Lodop提供了打印维护(PRINT_SETUP)可针对每个客户端进行微调,保存结果保存在客户端本地,对其他访问网站的客户没有影响. 由 ...
- 【数学建模】day11-典型相关分析
这与主成分分析有点相似. 0. 基本思想主成分分析(PCA)是把原始有相关性变量,线性组合出无关的变量(投影),以利用主成分变量进行更加有效的分析.而典型相关分析(CCA)的思想是: 分析自变量组 X ...
- 洛谷P2822 组合数问题
输入输出样例 输入样例#1: 1 2 3 3 输出样例#1: 1 输入样例#2: 2 5 4 5 6 7 输出样例#2: 0 7 说明 [样例1说明] 在所有可能的情况中,只有C_2^1 = 2C21 ...
- 基准对象object中的基础类型----数字 (二)
object有如下子类: CLASSES object basestring str unicode buffer bytearray classmethod complex dict enumera ...
- F. Asya And Kittens 并查集维护链表
reference :https://www.cnblogs.com/ZERO-/p/10426473.html
- altera rom ram IP的浅层理解
1.altera 提供了两种rom :单口rom和双口rom. 官方文档偷图: 单口rom:输出可以配置寄存器寄存再输出,时钟可以输入输出用不同的时钟. 双口rom:输入输出时钟可不同或者A与B的时钟 ...
- Codeforces Round #540 (Div. 3) A,B,C,D2,E,F1
A. Water Buying 链接:http://codeforces.com/contest/1118/problem/A 实现代码: #include<bits/stdc++.h> ...
- tp5命令行基础介绍
查看指令 生成模块 生成文件 生成类库映射文件 生成路由缓存文件 生成数据表字段缓存文件 指令扩展示例 命令行调试 命令行颜色支持 调用命令 查看指令 命令行工具需要在命令行下面执行,请先确保你的ph ...
- requirements文件
将一个环境中安装的所有的包在另一个环境中安装 1.生成文件列表 pip freeze > requirements.txt 2.将该文件放入到新环境中,安装 pip install -r req ...
