NOIP模拟65
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的更多相关文章
- NOIP模拟17.9.22
NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥
- NOIP 模拟4 T2
本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
随机推荐
- mongodb基础整理篇————索引[四]
前言 简单介绍一些索引. 正文 索引的术语: index 索引 key 键 DataPage 数据页 covered Query: ixscan/collscan: big O Natation: q ...
- webpack 打包jquery
前言 记一次配置webpack jqeury中的案例. 正文 选取自己需要安装的jquery版本号 dependencies:{ //此处的jquery版本根据npm后的版本来看,会有安装版本的提示 ...
- keycloak~jwt的rs256签名的验证方式
接口地址 keycloak开放接口地址:/auth/realms/fabao/.well-known/openid-configuration rsa算法相关术语 RSA算法是一种非对称加密算法,其安 ...
- Django框架——路由分发、名称空间、虚拟环境、视图层三板斧、JsonResponse对象、request获取文件、FBV与CBV、CBV源码剖析、模版层
路由分发 # Django支持每个应用都可以有自己独立的路由层.静态文件.模版层.基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起 多个应用都有很多路由与视图函数的对应关系 这 ...
- PolarDB-X 源码解读:事务的一生
简介: 本文将主要解读 PolarDB-X 中事务部分的相关代码,着重解读事务的一生在计算节点(CN)中的关键代码:从开始.执行.到最后提交这一整个生命周期. 概述 本文将主要解读 PolarDB-X ...
- 系列解读SMC-R:透明无感提升云上 TCP 应用网络性能(一)| 龙蜥技术
简介:已有的应用若想使用RDMA技术改造成本高,那么有没有一种技术是不做任何改造就可以享受RDMA带来的性能优势? 文/龙蜥社区高性能网络SIG 引言 Shared Memory Communi ...
- 【实用教程】在配备持久内存的实例上部署Redis应用
简介:配备持久内存的实例(例如re7p.r7p.re6p)提供了超大CPU内存配比,Redis应用运行在这类实例上可以大幅度降低单GiB内存的成本.本文以部分操作系统为例,介绍如何在这类实例上快速部署 ...
- [K8s] Docker 单节点部署 Rancher
Rancher 是通过 Web 界面管理 k8s 集群的工具,本身支持使用 Docker 启动. 单节点部署只需要 docker run 即可,易用性高,高可用部署可以使用 nginx 反向代理机制. ...
- WPF 已知问题 dotnet 6 设置 InvariantGlobalization 之后将丢失默认绑定转换导致 XAML 抛出异常
在设置了 InvariantGlobalization 为 true 之后,将会发现原本能正常工作的 XAML 可能就会抛出异常.本文将告诉大家此问题的原因 这是有开发者在 WPF 仓库上给我报告的 ...
- vscode 配置c/c++环境,无法生成 *.exe文件
[问题]: 使用vscode配置c/c++环境时,提示无法构建失败. [解决方案]: 1. 当前结合网上找的资料已经检查过,tasks.json和launch.json文件,并无配置错误. 2. ...