[42] (多校联训) A层冲刺NOIP2024模拟赛03

news/2024/12/24 2:13:30/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18450497
今天的乐子

今天的乐子2

昨天晚上做梦

梦见自己被关进戒网瘾学校

里面的老师全和疯子一样

然后我和这帮疯子老师比疯

疯子老师发现他们没我疯

所以就把我放了

今天的乐子3

lhx 罗曼蒂克的辟谷

A.五彩斑斓

赛时的想法

\(n^4\) 的做法,设 \(f_{i,j,k,l}\) 表示以 \((i,j)\) 为左上角,右下角不超过 \((k,l)\) 的矩阵的个数和

\[f_{i,j,k,l}=f_{i,j,k-1,l}+f_{i,j,k,l-1}-f_{i,j,k-1,l-1}+judge_{i,j,k,l} \]

观察到可以直接开桶,把第四维压掉

然后就变成 \(n^3\) 的了

但是我正确性出问题了,不知道哪有问题,有大佬可以指一下思路上的问题

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int n,m;
int a[401][401];
long long f[401][401];
long long  samecnt[401][401];
map<int,int>mp;
int cnt=0;
bool check(int xa,int ya,int xb,int yb){int tmp1=a[xa][ya],tmp2=a[xa][yb],tmp3=a[xb][ya],tmp4=a[xb][yb];return !(tmp1==tmp2 and tmp2==tmp3 and tmp3==tmp4);
}
signed main(){freopen("colorful.in","r",stdin);freopen("colorful.out","w",stdout);scanf("%d %d",&n,&m);for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){scanf("%d",&a[i][j]);if(!mp.count(a[i][j])){mp[a[i][j]]=++cnt;}a[i][j]=mp[a[i][j]];}}int ans=0;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){for(int k=1;k<=cnt;++k){samecnt[j][k]&=0;}}for(int j=1;j<=m;++j){f[i][j]=f[i][j-1]+f[i-1][j]-f[i-1][j-1];for(int sti=1;sti<=i;++sti){if(a[sti][j]==a[i][j]){samecnt[sti][a[i][j]]++;f[i][j]+=j-samecnt[sti][a[i][j]];}else f[i][j]+=j;}}}cout<<f[n][m]<<endl;
}

题解的思路是类似的,正难则反,考虑求顶点全相同的矩形个数,\(n^4\) 的做法就更简单了,直接枚举顶点就行了

所以有人直接用 bitset 草过去了

实际上可以对值域开桶

假设我们已经知道了矩形的右边两个点(可以通过分别枚举上边界,右边界和下边界来 \(n^3\) 得到),那么我们有如下两个结论

  • 已知的两个点不一致时不存在解
  • 考虑下边界这一行,设 \(cnt_{a_{rd}}\) 表示在该行下标小于等于矩形右下角的节点中,值和右下角顶点相同,且与对应上边界节点值相同的节点数量,则该点答案即为 \(cnt_{a_{rd}}\)

如果难理解可以画图理解

瓶颈在清空,出题人你没有心

#include<bits/stdc++.h>
using namespace std;
int n,m;
int cnt[1000001],a[401][401];
long long ans;
int main(){freopen("colorful.in","r",stdin);freopen("colorful.out","w",stdout);cin>>n>>m;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){cin>>a[i][j];}}for(int i=1;i<=n;++i){for(int j=i;j<=n;++j){for(int k=1;k<=m;++k){if(a[i][k]==a[j][k]){cnt[a[i][k]]++;ans+=cnt[a[i][k]];}}for(int k=1;k<=m;++k){if(a[i][k]==a[j][k]){cnt[a[i][k]]=0;}}}}cout<<n*(n+1ll)*m*(m+1)/4-ans;
}

B.错峰旅行

结论题

结论

  • 如果有一段连续的长度为 \(l\) 的时间段,满足该时间段内不存在状态改变的城市,且状态为不拥挤的城市有 \(x\) 个,则对方案数的贡献(乘)为 \(x^l\)

所以这是一个离散化板子题

  • 把所有坐标离线下来做离散化(注意开始结尾也要插进去离散化),然后因为对于区间 \([l,r]\),是 \(r+1\) 才更新状态,所以应该插入 \(l,r+1\)
  • 开双指针对坐标扫一遍,另一个扫操作,记一下这个是状态加还是状态减,直接统计答案就行了

不明白 STD 开牛魔的差分,题目里不是保证了区间不重叠了吗

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=1e9+7;
int power(int a,int t){int base=a,ans=1;while(t){if(t&1){ans=ans*base%p;}base=base*base%p;t>>=1;}return ans;
}
int n,m,s,t;
struct ope{int id,pos;bool isadd;bool operator <(const ope &A)const{if(A.pos==pos) return isadd<A.isadd;return pos<A.pos;}
};
int sum[1000001];
vector<ope>op={{}};
map<int,int>mp;
int pos[4000001];
int cnt=0,cnt2=0;
signed main(){freopen("travel.in","r",stdin);freopen("travel.out","w",stdout);scanf("%lld %lld %lld %lld",&n,&m,&s,&t);for(int i=1;i<=m;++i){int x,l,r;scanf("%lld %lld %lld",&x,&l,&r);op.push_back({x,l,true});op.push_back({x,r+1,false});pos[++cnt2]=l;pos[++cnt2]=r+1;}pos[++cnt2]=s;pos[++cnt2]=t+1;sort(op.begin(),op.end());sort(pos+1,pos+cnt2+1);cnt2=unique(pos+1,pos+cnt2+1)-pos-1;long long lsum=1,nsum=0;long long lnum=n,nnum=0;for(int i=1,j=0;i<cnt2;++i){nsum=0;nnum=lnum;while(j<2*m and op[j+1].pos<=pos[i]){j++;int x=op[j].id;int d=(op[j].isadd?1:-1);if(sum[x]>0 and sum[x]+d<=0) ++nnum;else if(sum[x]<=0 and sum[x]+d>0) --nnum;sum[x]+=d;}assert(pos[i+1]-pos[i]>=0);nsum=lsum*power(nnum,pos[i+1]-pos[i])%p;lsum=nsum;lnum=nnum;}cout<<nsum;
}

C.线段树

考虑一个询问区间 \([l,r]\) 的贡献,发现至少有 \(1\) 的贡献

抛开这个 \(1\) 不谈,剩下的贡献都是通过如下方式增加的

  • 线段树存在一个子区间,使得两个区间有交集且不包含

因此区间 DP,设 \(f_{i,j}\) 表示区间 \([i,j]\) 划分后的最小新增贡献

\[f_{i,j}=\min_{k}f_{i,k}+f_{k+1,j}+cost \]

所以计算本层贡献即可

关于本层贡献的计算,可以分别统计有多少区间与当前区间有交,有多少区间被当前区间包含,直接减掉就行了

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define r l+len-1
int n,qq;
int w[501];
int num[501][501];
int f[501][501];
signed main(){freopen("segment.in","r",stdin);freopen("segment.out","w",stdout);cin>>n>>qq;for(int i=1;i<=qq;i++){int _l,_r;scanf("%lld %lld",&_l,&_r);num[_l][_r]++;w[_l]++;w[_r]--;}for(int i=1;i<=n;i++){w[i]+=w[i-1];}for(int len=n-1;len>=1;len--){for(int l=1;r<=n;l++){num[l][r]=num[l][r]+num[l-1][r]+num[l][r+1]-num[l-1][r+1];}}for(int len=2;len<=n;len++){for(int l=1;r<=n;l++){f[l][r]=LLONG_MAX;for(int k=l;k<r;k++){f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+(w[k]-num[l][r]));}}}cout<<f[1][n]+qq<<'\n';
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809578.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Metasploit渗透测试框架学习(一)基本使用教程

1.Metasploit框架结构 1.1总览基础库文件Rex为最底层,实现网络套接字、网络应用协议、客户端服务端交互、数据库支持等 framework-core实现与上层模块交互的接口 framework-base对framework-core的扩展封装,用于提供各种接口供用户调用基于framework-base实现的六大模块Explo…

统计学(十三)——相关分析

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 相关分析是用于研究多个变量之间相互关系的统计方法,最早由英国统计学家卡尔皮尔逊(Karl Pearson)于1896年提出。皮尔逊通过对变量间线性关系的深入研究,…

前端模块化进化史:从全局 function 到 ES Modules

目前,前端开发已经离不开由 CommonJS、ES Modules 和 Webpack 构建的模块化开发环境。无论是 JavaScript、CSS、图片还是其他资源,都可以作为一个模块来处理。那么,模块化究竟是如何发展到今天的呢? 全局函数模式 最初的前端模块化尝试是通过 全局函数来实现的。例如,在一…

CF131C题解

贪心,优先队列,CF 2200传送门:https://codeforces.com/problemset/problem/134/C 关注到题目的两个限制:1. 一个人只能与另外同一人交换一张卡牌。2. 一个人只能交换自己原来颜色的卡牌。 对于2条限制条件,显然有贪心思路:尽量让更多的人手持原有的卡牌。对于当前待交换的…

『模拟赛』多校A层冲刺NOIP2024模拟赛03

『模拟赛记录』多校A层冲刺NOIP2024模拟赛03Rank 炸了,触底反弹A. 五彩斑斓(colorful) 签,又没签上。 考虑如何一步步优化暴力。最暴力的思想 \(\mathcal{O(n^4)}\) 枚举每个矩形,判断四个顶点颜色。稍微优化些,两次 \(\mathcal{O(n^2)}\) 跑出对于行/列每个点下一个与之…

加装spark-3.5.3

集群版本 hadoop-3.4.0 hive-3.1.3 zookeeper-3.9.2 hbase-2.6.0(1.0.0以上需要zookeeper-3.4.0以上) spark-3.5.3(只能选2.13.0) scala-2.13.0(jdk8仅支持x.x.0系)总结一下:JDK8和scala-2.13.0必选。1.安装scala 1.1 下载解压 tar zxvf scala-2.13.0.tgz 1.2 配置环境变…

高级程序语言第二次个人作业

高级程序语言第二次作业这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2024C/homework/13282学号 222200424姓名 赵伟豪编程练习3.13.23.33.43.53.63.73.8示例程序3.13.23.33.43.53.63.73.83.93.10总结与收获…

浏览器的渲染原理

浏览器渲染原理 五个渲染流程Parse 阶段:解析 HTMLStyle 阶段:样式计算三个阶段:收集,划分和索引所有样式表中存在的样式规则 访问每个元素并找到适用于该元素的所有规则,CSS 引擎遍历 DOM 节点,进行选择器匹配,并且匹配的节点执行样式设置 结合层叠规则和其他信息为节点…

CSP2024 前集训:多校A层冲刺NOIP2024模拟赛03

前言T1 没想到正难则反,脑瘫了没敢用 bitset(复杂度擦边但卡常能过),T2 空间开大了挂了 \(100pts\),\(T3\) 是原。 T1 五彩斑斓部分分 \(20pts\):\(O(n^4)\) 暴力。部分分 \(20+?pts\):进行一些优化,极限数据下仍是 \(O(n^4)\)。部分分 \(60\sim 100pts\):bitset 优化…

在C#中使用适配器Adapter模式和扩展方法解决面向的对象设计问题

之前有阵子在业余时间拓展自己的一个游戏框架,结果在实现的过程中发现一个设计问题。这个游戏框架基于MonoGame实现,在MonoGame中,所有的材质渲染(Texture Rendering)都是通过SpriteBatch类来完成的。举个例子,假如希望在屏幕的某个地方显示一个图片材质(imageTexture)…

React Fiber 原理

React Fiber 在 React 16 之前的版本对比更新 VirtualDOM 的过程是采用 Stack 架构实现的,也就是循环加递归,这种方式的问题是一旦任务开始进行就无法被中断。 如果应用中的组件数量庞大, Virtual DOM 的层级比较深,主线程被长期占用,知道整颗 Virtual DOM 树比对更新完成…