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. 实战:如何编写一个 OpenTelemetry Extensions

    前言 前段时间我们从 SkyWalking 切换到了 OpenTelemetry ,与此同时之前使用 SkyWalking 编写的插件也得转移到 OpenTelemetry 体系下. 我也写了相关介绍 ...

  2. iOS的cer、p12格式证书解析监控

    之前博客写过直接解析ipa包获取mobileprovision文件来监控APP是否过期来,但APP的推送证书还没有做, 大家都知道,iOS的推送证书不会放到ipa包里,只能通过直接解析p12或cer. ...

  3. 力扣455(java&python)-分发饼干(简单)

    题目: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干. 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j,都有 ...

  4. 5年磨一剑|优酷Android包瘦身治理思路全解

    简介: 稳定性.性能.包大小,在移动端基础用户体验领域"三分天下",是app承载业务获得稳定.高效.低成本.快速增长的重要基石.其中,包大小对下载转化率.拉新拉活成本等方面的影响至 ...

  5. DTCC 2020 | 阿里云程实:云原生时代的数据库管理

    简介: 随着云原生技术的不断发展,数据库也逐渐进入了云原生时代.在云原生时代,如何高效.安全且稳定地管理云上与云下的数据库成为摆在企业面前的一大难题.在第十一届中国数据库技术大会(DTCC2020)上 ...

  6. iLogtail使用入门-iLogtail本地配置模式部署(For Kafka Flusher)

    ​简介:iLogtail使用入门-iLogtail本地配置模式部署(For Kafka Flusher). 阿里已经正式开源了可观测数据采集器iLogtail.作为阿里内部可观测数据采集的基础设施,i ...

  7. 庖丁解牛-图解MySQL 8.0优化器查询转换篇

    ​简介: 在<庖丁解牛-图解MySQL 8.0优化器查询解析篇>一文中我们重点介绍了MySQL最新版本8.0.25关于SQL基本元素表.列.函数.聚合.分组.排序等元素的解析.设置和转换过 ...

  8. 从技术到科学,中国AI向何处去?

    ​简介: 如果从达特茅斯会议起算,AI已经走过65年历程,尤其是近些年深度学习兴起后,AI迎来了空前未有的繁荣.不过,最近两年中国AI热潮似乎有所回落,在理论突破和落地应用上都遇到了挑战,外界不乏批评 ...

  9. IphoneX(10) 重启/关机, 强制重启/关机

    正常关机是同时长按 音量+ 和 右侧电源键,屏幕出现滑动按钮进行关机. 注意截图是同时短按 音量+ 和 右侧电源键. 强制关机是按照顺序按三个键:音量+   音量-  长按右侧键 Other:苹果X怎 ...

  10. 2018-6-30-dotnet-设计规范-·-抽象类

    title author date CreateTime categories dotnet 设计规范 · 抽象类 lindexi 2018-6-30 9:2:38 +0800 2018-06-30 ...