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

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

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. IOS6 新特性之UIActivityViewController详解

    新的IOS6增加了一些新特性.因为应用需要,所以在国庆的几天里.研究了一下IOS6的说明文档,然后大概地总结了一下UIActivityViewController的用法与大家分享. 首先 从实际效果入 ...

  2. WebService Exceptions

    一. Exception in thread "main" java.lang.ExceptionInInitializerError at com.sun.xml.interna ...

  3. 基于知识图谱的APT组织追踪治理

    高级持续性威胁(APT)正日益成为针对政府和企业重要资产的不可忽视的网络空间重大威胁.由于APT攻击往往具有明确的攻击意图,并且其攻击手段具备极高的隐蔽性和潜伏性,传统的网络检测手段通常无法有效对其进 ...

  4. OpenCASCADE点向直线投影

    OpenCASCADE点向直线投影 eryar@163.com 在GeomLib_Tool类中提供了计算指定点在曲线.曲面上的参数,这个算法具有通用性,即对任意曲线.曲面来反求点的参数. 本文主要结合 ...

  5. PAT甲级——A1080 Graduate Admission

    It is said that in 2011, there are about 100 graduate schools ready to proceed over 40,000 applicati ...

  6. PAT甲级——A1074 Reversing Linked List

    Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elem ...

  7. window查看端口信息

    netstat -nao |findstr "2129" 列出所有端口的情况 tasklist|findstr "pid" 查看对应进程信息

  8. java基础之final关键字

    final: 意为终态.在java中得注意以下四点: 1.final是一个修饰符,可修饰变量,方法,类. 2.final修饰子类不可以被继承. 3.final修饰的方法不可以被重写(覆盖) 4.对于一 ...

  9. Neo4j-Cypher语言语法

    Neo4j-Cypher语言语法 梦飞扬 2018-03-15 264 阅读 Neo4j 本文是记录Neo4j图数据库中实用的Cypher语言语法. Cypher是什么 "Cypher&qu ...

  10. springboot4.1.1的log4j2配置

    一.默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台: 日志输出内容元素具体如下: 时间日期:精确到毫秒 日志级别:ERROR, WARN, INFO, D ...