T1 网格图

解题思路

60pts 就是个zz做法。。(我考场上造了一个 \(500\times 500\) 的 X,一看挺快,就以为 \(n^4\) 可以切,然而。。)

正解有一点难度,对于每一个节点维护所在的联通块及其大小,发现对于每一次所扫描的方块右移所变化的只有两列,于是我们只需要维护,这两列的变化就好了。

然后再扫描矩形的四个相邻的边,计算所相连的联通块,计算答案就好了。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=510;
int n,m,ans,cnt,all,s[N][N],fa[N*N],siz[N*N];
int d1[10]={0,0,0,1,-1},d2[10]={0,1,-1,0,0};
vector<int> v;
char ch[N];
int id(int x,int y){return (x-1)*n+y;}
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void pre_work(int x,int y)
{
cnt=0; vector<int>().swap(v);
for(int i=x;i<=x+m-1;i++)
for(int j=y;j<=y+m-1;j++)
if(s[i][j])
siz[find(id(i,j))]--;
for(int i=1;i<=m;i++)
{
if(x>1&&s[x-1][i]) v.push_back(find(id(x-1,i)));
if(x+m<=n&&s[x+m][i]) v.push_back(find(id(x+m,i)));
if(s[x+i-1][m+1]) v.push_back(find(id(x+i-1,m+1)));
}
sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end());
for(int i=0;i<v.size();i++) cnt+=siz[v[i]]; ans=max(ans,m*m+cnt);
}
void work(int x,int y)
{
for(int i=1;i<=m;i++)
{
if(s[x+i-1][y-1]) siz[find(id(x+i-1,y-1))]++;
if(s[x+i-1][y+m-1]) siz[find(id(x+i-1,y+m-1))]--;
}
vector<int>().swap(v); cnt=0;
for(int i=1;i<=m;i++)
{
if(x>1&&s[x-1][y+i-1]) v.push_back(find(id(x-1,y+i-1)));
if(y>1&&s[x+i-1][y-1]) v.push_back(find(id(x+i-1,y-1)));
if(x+m<=n&&s[x+m][y+i-1]) v.push_back(find(id(x+m,y+i-1)));
if(y+m<=n&&s[x+i-1][y+m]) v.push_back(find(id(x+i-1,y+m)));
}
sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end());
for(int i=0;i<v.size();i++) cnt+=siz[v[i]]; ans=max(ans,m*m+cnt);
}
void end_work(int x,int y)
{
for(int i=x;i<=x+m-1;i++)
for(int j=y;j<=y+m-1;j++)
if(s[i][j])
siz[find(id(i,j))]++;
}
signed main()
{
freopen("grid.in","r",stdin); freopen("grid.out","w",stdout);
n=read(); m=read(); if(m>=n) printf("%lld",n*n),exit(0);
for(int i=1;i<=n;i++)
{
scanf("%s",ch+1);
for(int j=1;j<=n;j++)
siz[++all]=s[i][j]=(ch[j]=='.');
}
for(int i=1;i<=all;i++) fa[i]=i;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(s[i][j])
for(int k=1;k<=4;k++)
{
int x=i+d1[k],y=j+d2[k];
if(x<1||x>n||y<1||y>n) continue;
if(find(id(i,j))==find(id(x,y))||!s[x][y]) continue;
siz[find(id(x,y))]+=siz[find(id(i,j))];
fa[find(id(i,j))]=find(id(x,y));
}
for(int i=1;i<=n-m+1;i++)
{
pre_work(i,1);
for(int j=2;j<=n-m+1;j++) work(i,j);
end_work(i,n-m+1);
}
printf("%lld",ans);
return 0;
}

T2 序列问题

解题思路

CDQ 分治优化 DP 板子题。。

可是我居然想了三种 DP 方程,然而前两种根本无法优化。。(1,2)

然后就有了现在的第三种 DP 状态可以由 \(j\) 转移到 \(i\) 当且仅当 \(i>j,s_i>s_i,s_i-i\le s_j-j\)

就是三维偏序吗,我就用了一个维护后缀的树状数组,一开始是编号有顺序,CDQ 处理掉 s 的大小关系,然后树状数组维护最后一个条件。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=5e5+10,M=1e3+10,INF=1e18;
int n,ans,all,cnt,lsh[N],f[N];
struct Node{int id,num,dat;}s[N];
bool comp1(Node x,Node y){if(x.num!=y.num) return x.num<y.num; return x.dat<y.dat;}
bool comp2(Node x,Node y){return x.id<y.id;}
struct BIT
{
int tre[N];
int lowbit(int x){return x&(-x);}
void clear(int x){for(int i=x;i;i-=lowbit(i))tre[i]=0;}
void insert(int x,int val){for(int i=x;i;i-=lowbit(i))tre[i]=max(tre[i],val);}
int query(int x){int maxn=0;for(int i=x;i<=cnt;i+=lowbit(i))maxn=max(maxn,tre[i]);return maxn;}
}T;
void CDQ(int l,int r)
{
if(l==r) return f[l]=max(f[l],(s[l].num<=n)*1ll),void();
int mid=(l+r)>>1,i=l,j=mid+1; CDQ(l,mid);
sort(s+l,s+mid+1,comp1); sort(s+mid+1,s+r+1,comp1);
while(j<=r)
if(i>mid||s[j].num<=s[i].num)
{
if(s[j].num>s[i-1].num) f[s[j].id]=max(f[s[j].id],T.query(s[j].dat)+1);
j++;
}
else
{
if(s[i].num<=s[i].id) T.insert(s[i].dat,f[s[i].id]);
i++;
}
for(i=l;i<=mid;i++) if(s[i].num<=s[i].id) T.clear(s[i].dat);
sort(s+mid+1,s+r+1,comp2);
CDQ(mid+1,r);
}
signed main()
{
freopen("sequence.in","r",stdin); freopen("sequence.out","w",stdout);
n=read(); for(int i=1;i<=n;i++) s[i].num=read(),lsh[++cnt]=s[i].num-i,s[i].id=i;
sort(lsh+1,lsh+cnt+1); cnt=unique(lsh+1,lsh+cnt+1)-lsh-1;
for(int i=1;i<=n;i++) s[i].dat=lower_bound(lsh+1,lsh+cnt+1,s[i].num-i)-lsh;
CDQ(1,n); for(int i=1;i<=n;i++) ans=max(ans,f[i]);
printf("%lld",ans);
return 0;
}

T3 置换

大坑未补

T4 同桌的你

大坑未补

NOIP模拟65的更多相关文章

  1. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  2. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

  3. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  4. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  5. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  6. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  7. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  8. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  9. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  10. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

随机推荐

  1. opencv实现数据增强(图片+标签)平移,翻转,缩放,旋转

    面试问到了,让手撕数据增强,图片+标签.这里整理一下,直接上代码. import math import cv2 import numpy as np def pan(img, anns, size= ...

  2. locust的 -T,--tags使用

    官网的TAG配置说明:-T [TAG [TAG ...]], --tags [TAG [TAG ...]]List of tags to include in the test, so only ta ...

  3. [GPT] gradio-chatbot 原理及代码解析

      GradioChatBot 是一个基于 Gradio 的聊天机器人,它可以与不同的 URL 进行对话.其原理是通过将用户输入的文本发送到指定的 URL,然后接收并解析 URL 返回的响应,然后将响 ...

  4. UOS 开启 VisualStudio 远程调试 .NET 应用之旅

    本文记录的是在 Windows 系统里面,使用 VisualStudio 2022 远程调试运行在 UOS 里面 dotnet 应用的配置方法 本文写于 2024.03.19 如果你阅读本文的时间距离 ...

  5. 2019-8-31-C#-转换类型和字符串

    title author date CreateTime categories C# 转换类型和字符串 lindexi 2019-08-31 16:55:58 +0800 2018-2-13 17:2 ...

  6. K8s应用---配置管理中心configmap和Secret(13)

    一.Configmap概述 1.1 什么是configmap Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形 ...

  7. 通过虚拟机镜像部署zabbix

    前言 由于基础镜像的缘故,zabbix部署过程中很可能出现各种缺少依赖包的情况,如果环境中又无法连接互联网,系统部署会非常麻烦.为此zabbix官方提供了虚拟机镜像,导入后可以直接在平台上拉起虚拟机, ...

  8. 创建第一个springmvc程序

    创建第一个springmvc程序 1.创建父项目文件,导入依赖,删除src文件夹 pom.xml文件 <dependencies> <dependency> <group ...

  9. 【转载】超级系统工具Sysdig,比 strace、tcpdump、lsof 加起来还强大

    可以用sysdig命令做很多很酷的事情 网络 查看占用网络带宽最多的进程 sysdig -c topprocs_net 显示主机192.168.0.1的网络传输数据 as binary: sysdig ...

  10. 简说Python之列表,元祖,字典

    目录 Python列表 创建列表 添加元素 查询元素 列表分片 分片简写 修改元素 一些其他添加列表元素的方法 extend() insert() 删除元素 remove()删除 del 通过索引删除 ...