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

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

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. pyQT Dialog默认选中某一个选项问题的解决

    方法一: 在新建ui文件时不要新建Dialog # -*- coding: utf-8 -*- # Form implementation generated from reading ui file ...

  2. Lucene 的 Field 域和索引维护

    一.Field 域 1.Field 属性 Field 是文档中的域,包括 Field 名和 Field 值两部分,一个文档可以包括多个 Field,Document 只是 Field 的一个承载体,F ...

  3. codeforces 1100E-Andrew and Taxi

    传送门:QAQQAQ 题意:给你一个图,每条边有边权,现在你可以对边进行反转,使图中不存在环,你需要使得反转的边的边权集合中的最大值最小,并输出任意一组解. 思路:二分+拓扑排序 使得最大值最小,自然 ...

  4. 群晖引导是uefi还是传统模式的识别

     看左下角光标闪不闪,不闪的是uefi,在闪的就是传统

  5. 基于baseline和stochastic gradient descent的个性化推荐系统

    文章主要介绍的是koren 08年发的论文[1],  2.1 部分内容(其余部分会陆续补充上来). koren论文中用到netflix 数据集, 过于大, 在普通的pc机上运行时间很长很长.考虑到写文 ...

  6. DOS常用命令详解

    DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘 edit ...

  7. 第四章 Odoo 12 开发之模块继承

    Odoo 的一个强大功能是无需直接修改底层对象就可以添加功能.这是通过其继承机制来实现的,采取在已有对象之上修改层来完成.这种修改可以在不同层上进行-模型层.视图层和业务逻辑层.我们创建新的模块来做出 ...

  8. layer时间插件

    引入: <link rel="stylesheet" href="<{$cdnsite}>/default/common/layui/css/layui ...

  9. 工控安全入门(五)—— plc逆向初探

    之前我们学习了包括modbus.S7comm.DNP3等等工控领域的常用协议,从这篇开始,我们一步步开始,学习如何逆向真实的plc固件. 用到的固件为https://github.com/ameng9 ...

  10. PAT甲级——A1042 Shuffling Machine

    Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techn ...