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 的封 ...
随机推荐
- css 你真的了解padding吗?
前言 padding 简写属性在一个声明中设置所有内边距属性,实际上在使用过程中它对block元素和内联元素的处理是不一样的. 正文 对于block元素 如果宽度非auto那么容器会变大,如果容器宽度 ...
- native react 代码智能提示
背景 在vscode 中,虽然有插件可以达到代码提示的效果但是不是很嗨. 所以加上这些: 全局安装typings: npm install typings -g 1 安装react和react-nat ...
- Canvas图形编辑器-数据结构与History(undo/redo)
Canvas图形编辑器-数据结构与History(undo/redo) 这是作为 社区老给我推Canvas,于是我也学习Canvas做了个简历编辑器 的后续内容,主要是介绍了对数据结构的设计以及His ...
- 百度AIPNLP 文本相似度 文本审核
效果不如有监督的bert文本相似度好 from aip import AipNlp APP_ID = "22216281" APT_KEY = "foEeYauuvnqW ...
- logging模块简介python
1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...
- SnakeYaml反序列化分析
前言 SnakeYaml是Java中解析yaml的库,而yaml是一种人类可读的数据序列化语言,通常用于编写配置文件等.yaml真是到哪都有啊. 环境搭建 <dependency> < ...
- Linux命令之查找CPU资源利用情况(lscpu和top详解)
1.lscpu命令:获取CPU架构完整详细信息,例如架构信息,CPU模式,CPU频率,CPU核心数.线程数.缓存大小. 在终端输入"lscpu": 参数详解: [Architect ...
- 宏杉科技加入阿里云PolarDB开源数据库社区
简介: 宏杉科技签署阿里巴巴开源CLA(Contribution License Agreement, 贡献许可协议), 正式与阿里云PolarDB 开源数据库社区牵手. 宏杉科技签署阿里巴巴开源CL ...
- Istio 从懵圈到熟练:二分之一活的微服务
作者 | 声东 阿里云售后技术专家 <关注阿里巴巴云原生公众号,回复 排查 即可下载电子书> <深入浅出 Kubernetes>一书共汇集 12 篇技术文章,帮助你一次搞懂 ...
- DTCC 2020 | 阿里云赵殿奎:PolarDB的Oracle平滑迁移之路
简介: Oracle兼容性是业务客户从Oracle生态迁移到PolarDB生态的第一步也是至关重要的一步,PolarDB通过不断沉淀支持大量实际业务的真实Oracle兼容性功能,确保客户业务可以真正做 ...