没赶上昨天的考试,不过我这种人考不考都没有多少提升吧。

挺服气的一场考试,有生以来参加的最让人想笑的考试。

T1:养花

取模,区间询问最大值,有点套路化的预处理答案…难点也在预处理上。容易想到分块然后依次处理每个块的答案。

然后考虑每个块内怎么处理每个k。发现对于一个模数k,最大值一定是每个k的倍数的前驱,即比k小的最大值、比k*2小的最大值,比k*3小的最大值…这些数取max,然后%k。

那么在每个块内先扫一遍存下所有值,然后扫一遍值域使每个值域上的位置存小于等于它的最大值。接着枚举k进行处理,比较k、2k、3k…处的最大值。取模操作可以替换成减法来节省时间。

常数很大,但开了O2可以跑过去。

然后真的秀到我的一波操作出现了…题目的数据范围是100000,而数据出现了100001。重测一次我就快乐WA。

别问,问就是开大值域是好习惯。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int a[],ans,n,m,siz=,blo[],num,f[][],sum[];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
blo[i]=(i-)/siz+;
}
num=blo[n];
for(int i=;i<=num;i++){
memset(sum,,sizeof(sum));
for(int j=(i-)*siz+;j<=i*siz;j++){
sum[a[j]]=a[j];
}
for(int j=;j<=;j++){
sum[j]=max(sum[j],sum[j-]);
}
for(int k=;k<=;k++){
for(int j=;j<=;j+=k){
f[i][k]=max(f[i][k],sum[j+k-]-j);
}
f[i][k]=max(f[i][k],sum[]%k);
}
}
for(int i=,l,r,k;i<=m;i++){
scanf("%d%d%d",&l,&r,&k);
ans=;
if(blo[l]==blo[r]){
for(int j=l;j<=r;j++){
ans=max(ans,a[j]%k);
}
}
else{
for(int j=l;j<=blo[l]*siz;j++){
ans=max(ans,a[j]%k);
}
for(int j=(blo[r]-)*siz+;j<=r;j++){
ans=max(ans,a[j]%k);
}
for(int j=blo[l]+;j<blo[r];j++){
ans=max(ans,f[j][k]);
}
}
printf("%d\n",ans);
}
return ;
}

T2:折射

很显然是个DP,考虑怎么设计状态。数据范围卡掉了n2,又看到每个装置向左向右这样的方向性,想到了我前不久刚刚学会的关路灯。两道题显然不一样,但我觉得第二维八成就是方向了,然后思考怎么转移。

果然我是从转移开始错的…虽然DP一直都不擅长。

正解是按x排序。设f[i][0]为当前装置为最后一个,把光线向右折射,f[i][1]为向左。按x排序以后,当前扫到的i一定x最大,它的1数组一定只会由后面的i更新,而它的0数组只会由前面的i更新。同时它的0数组会去更新前面的1数组,因为这个,第二层循环要倒序进行。x小于xi的j有可能更新f[i][0],而f[i][0]紧接着可能拿来更新x更小的f[j][1]。更新i的0数组还是用0数组更新j的1数组取决于循环到的yj与yi的大小关系。最后把所有的f[i][0]和f[i][1]加起来,因为每个i只有自己组成一种方案的时候无论向左向右都一样,每个i的总方案再减去1。

有点乱…挺玄学的,完全想不到。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
long long f[][],ans,mod=;
struct node{
int x,y;
}a[];
bool cmp(node a,node b){
if(a.x<b.x)return true;
else return false;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
}
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++){
f[i][]=f[i][]=;
for(int j=i-;j;j--){
if(a[j].y<a[i].y){
f[i][]=(f[i][]+f[j][])%mod;
}
else f[j][]=(f[i][]+f[j][])%mod;
}
// printf("%d %d %d\n",i,f[i][1],f[i][0]);
}
for(int i=;i<=n;i++){
ans=(ans+f[i][]+f[i][]-+mod)%mod;
}
printf("%lld",ans);
return ;
}

T3:画作

有一个很好想的结论,作画的每一个操作i的范围一定可以被上一个操作的范围包括。染了外面大的一圈,再把中间染回来…这样每一次都可以更新至少一个确定的位置,这个位置以后不会再被染回来造成次数浪费。

那么可以让终态的每个格子向四周连边,异色连1边表示一次操作,同色连0边。每个格子跑一次最短路,找离它最远的黑块的距离,每个这样得出的距离取min,这就是操作数最少的方案。从每个格子出发找最远的黑块等价于从这个黑块出发染到它需要几次操作,因为第一步操作一定是染黑,所以一定是找最远的黑块。同一距离的格子一定可以在同一次操作中被确定。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int r,c,ans=,vis[];
deque<pair<int,int> >q;
int a[][],b[];
int h[]={,,-,,};
int l[]={,-,,,};
int ver[],head[],Next[],edge[],tot;
void add(int x,int y,int z){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
edge[tot]=z;
}
int bfs(int x){
int num=;
q.clear();
q.push_back(make_pair(x,));
memset(vis,,sizeof(vis));
vis[x]=;
while(!q.empty()){
int u=q.front().first,dis=q.front().second;
if(b[u])num=max(num,dis);
q.pop_front();
for(int i=head[u];i;i=Next[i]){
int v=ver[i],z=edge[i];
if(!vis[v]){
vis[v]=;
if(!z){
q.push_front(make_pair(v,dis));
}
else{
q.push_back(make_pair(v,dis+));
}
}
}
}
// printf("%d ",num);
return num+;
}
int main()
{
scanf("%d%d",&r,&c);
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
scanf("%1d",&a[i][j]);
b[(i-)*c+j]=a[i][j];
}
}
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
for(int k=;k<=;k++){
int x=i+h[k],y=j+l[k];
if(x>&&y>&&x<=r&&y<=c){
add((i-)*c+j,(x-)*c+y,((a[i][j]==a[x][y])^));
// printf("(%d,%d) (%d,%d) %d\n",i,j,x,y,((a[i][j]==a[x][y])^1));
}
}
}
}
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
ans=min(ans,bfs((i-)*c+j));
}
}
printf("%d",ans);
return ;
}

大约是有史以来考得最好的一次吧,也说明我的极限大约就在这里了。

然而大家能做到的事情一定更多,希望大家能变得越来越好。

2019.9.21 csp-s模拟测试49 反思总结的更多相关文章

  1. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  3. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  4. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

  5. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  6. 2019.10.21 csp-s模拟测试81 反思总结

    T1: 把每一行状压,按行DP.设fi,j,k,i表示第几行,j是当前行的1覆盖状态,k是当前行选择按钮的状态.转移的时候枚举j和k,再枚举下一层的按钮选择情况l.如果l和j可以全覆盖当前层则转移合法 ...

  7. 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】

    [题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...

  8. csp-s模拟测试49(9.22)养花(分块/主席树)·折射(神仙DP)·画作

    最近有点头晕........... T1 养花 考场我没想到正解,后来打的主席树,对于每个摸数查找1-(k-1),k-(2k-1)...的最大值,事实上还是很容易被卡的但是没有数据好像还比较友善, 对 ...

  9. 2019.10.30 csp-s模拟测试94 反思总结

    头一次做图巨的模拟题OWO 自从上一次听图巨讲课然后骗了小礼物以后一直对图巨印象挺好的233 T1: 对于XY取对数=Y*log(x) 对于Y!取对数=log(1*2*3*...*Y)=log1+lo ...

随机推荐

  1. Django之ORM查询优化

    目录 only 和 defer select_related 和 prefetch_related ORM字段参数 choices res = models.Book.objects.all() # ...

  2. BZOJ1912:[APIO2010]patrol巡逻

    Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ a, b ≤ n). Ou ...

  3. window 批量修改或去除文件后缀名

    for /r %i in (*.!ut) do ren "%i" *. 转自:https://blog.csdn.net/zhang_ruisen/article/details/ ...

  4. EF(Entity Framwork)结构

    初次接触EF,看了一些资料,将自己对EF结构的理解记录如下: EF的核心是EDM----实体数据模型(.edmx).它由三部分组成:概念模型(.csdl文件).存储模型(.ssdl文件).映射规范(. ...

  5. 项目接入即时聊天客服系统(环信系统)PHP后端操作

    环信工作原理: 一.由于环信没有直接的接口来主动调取本项目中的用户数据,所有用户信息必须在环信服务器上注册对应信息成为环信的用户:(这样才能当用户进入聊天时显示其基本信息,如:名称.昵称.电话.邮箱等 ...

  6. 用JS写的一个简单的时钟

    没什么技术含量,单纯的想传上去.手痒了 <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...

  7. <每日一题>题目24:冒泡排序

    ''' 冒泡排序:比较相邻元素,顺序错误就交换顺序 ''' import random import cProfile def bubble_Sort(nums): for i in range(le ...

  8. CheckBox自定义样式

    效果: xmal代码: <Style x:Key="CheckBoxStyle" TargetType="{x:Type CheckBox}"> & ...

  9. C++【stack/queue】用法和例子

    Stack的常用基本操作: s.push() // 压栈 s.emplace() // 插入,相当于push(目前掌握的唯一区别是emplace可以自行调用构造函数,push不行) s.empty() ...

  10. STL与泛型编程-学习2-GeekBand

    9, 容器 Deque 双向队列 和vector类似, 新增加: push_front 在头部插入一个元素 pop_front 在头部弹出一个元素 Deque和vector内存管理不同: 大块分配内存 ...