24.9.29

星期一:

补 cf round974 div3 H                                      cf传送门

题意:给一数组,q次询问,每次询问l-r区间内是否每个数字都出现偶数次

终于找到了梦中的随机数函数,这随机数真是非常顶级口牙

思路:众所周知异或前缀和可以除掉出现偶数次的数字,但直接异或前缀和很容易出错,比如1 2 3,我们给每个ai赋一个随机数,这样就会大大减少出错的概率

代码如下:

mt19937_64 rnd(time(0));const int N=2.2e6+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;
ll a[N];
void solve(){int q; cin >> n >> q;map<int,ll>mp;for(int i=1;i<=n;i++){cin >> a[i];if(!mp.count(a[i])) mp[a[i]]=rnd();a[i]=mp[a[i]];a[i]^=a[i-1];}while(q--){int l,r; cin >> l >> r;if(a[r]^a[l-1]) cout << "NO\n";else cout << "YES\n";}
}

既然找到了梦中情数,那就不得不来试试之前那道状压,看能不能用随机数加逆康托冲过去

上链接                                                       cf传送门

很典的状压dp,上周就想用随机+逆康托看能不能冲过去,可惜受限于初始rand()函数太拉跨

今时不同往日,有了无敌的 mt19937_64 rnd(time(0)),看我一举冲破敌人的数据

调了两次cnt,由于逆康托费拉不堪的n^2复杂度,跑2e6与1e6次会T,不过1e5足矣

代码如下:

mt19937_64 rnd(time(0));const int N=2.2e6+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;ll rng(ll l,ll r){return rnd()%(r-l+1)+l;
}
ll fac[N];
vector<int> rev_kt(ull k,int len){             //编号和排列长度vector<int>ans;k--;vector<int>ve;for(int i=1;i<=len;i++) ve.push_back(i);for(int i=1;i<=len;i++){int t=k/fac[len-i];ans.push_back(ve[t]);ve.erase(ve.begin()+t);k%=fac[len-i];}return ans;
}
void solve(){fac[0]=1;for(int i=1;i<=13;i++) fac[i]=fac[i-1]*i;int w; cin >> n >> w;map<int,int>mp;for(int i=1;i<=n;i++){int len; cin >> len;mp[len]++;}vector<int>ve; ve.push_back(0);for(auto [x,y]:mp) ve.push_back(y);int sz=mp.size();set<ll>st;int cnt=1e5,ans=13;while(cnt--){ll idx=rng(1,fac[sz]);if(st.find(idx)!=st.end()) continue;st.insert(idx);auto p=rev_kt(idx,sz);int day=1,lef=w;for(int i:p){if(ve[i]>lef) lef=w-ve[i],day++;else lef-=ve[i];if(day>=ans) break;}ans=min(day,ans);if((ll)st.size()==fac[sz]) break;}cout << ans;
}

逆康托。。感觉不如shuffle()函数,比逆康托快了200ms

代码如下:

mt19937_64 rnd(time(0));const int N=2.2e6+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;void solve(){int w; cin >> n >> w;map<int,int>mp;for(int i=1;i<=n;i++){int len; cin >> len;mp[len]++;}vector<int>ve; ve.push_back(0);for(auto [x,y]:mp) ve.push_back(y);int sz=mp.size();vector<int>p;for(int i=1;i<=sz;i++) p.push_back(i);int cnt=1e5,ans=13;while(cnt--){shuffle(p.begin(),p.end(),rnd);int day=1,lef=w;for(int i:p){if(ve[i]>lef) lef=w-ve[i],day++;else lef-=ve[i];if(day>=ans) break;}ans=min(day,ans);}cout << ans;
}

不过24百度之星决赛的状压无法用随机数冲过去,21!太大,ac概率跟买彩票差不多

学而时习之,不亦乐乎,重做道经典主席树             牛客传送门

思路:之前的文章已有:csdn传送门,此处不再赘述

代码方面看了下和上次的差别不大,除了fnd_sum写的更精简了些

不过太久没写主席树,这次写了个幽默的pushup(),还有ed给取成max了

代码如下:

const int N=6e5+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;
int a[N];
const int MAXN=6e5+10;
struct seg_Tree{
#define lc(p) t[p].ch[0]
#define rc(p) t[p].ch[1]struct nod{int ch[2];int sum,ed;}t[N*22];int tot,root[N];void insert(int x,int &y,int l,int r,int qv,int i){y=++tot; t[y]=t[x]; t[y].sum++;if(l==r){t[y].ed=i;return ;}int mid=l+r>>1;if(qv<=mid) insert(lc(x),lc(y),l,mid,qv,i);if(qv>mid) insert(rc(x),rc(y),mid+1,r,qv,i);t[y].ed=min(t[lc(y)].ed,t[rc(y)].ed);}int fnd_mex(int y,int l,int r,int ql){if(l==r) return l;int mid=l+r>>1;if(t[lc(y)].ed<ql) return fnd_mex(lc(y),l,mid,ql);else return fnd_mex(rc(y),mid+1,r,ql);}int fnd_sum(int x,int y,int l,int r,int qv){if(r<=qv) return t[y].sum-t[x].sum;int mid=l+r>>1;int res=0;res+=fnd_sum(lc(x),lc(y),l,mid,qv);if(qv>mid) res+=fnd_sum(rc(x),rc(y),mid+1,r,qv);return res;}
}tr;
void solve(){cin >> n;map<int,int>to;int cnt=0;for(int i=1;i<=n;i++){cin >> a[i];to[a[i]]=1;to[a[i]+1]=1;}for(auto &[x,y]:to) y=++cnt;for(int i=1;i<=n;i++) tr.insert(tr.root[i-1],tr.root[i],1,MAXN,to[a[i]],i);int q; cin >> q;while(q--){int l,r; cin >> l >> r;int mex=tr.fnd_mex(tr.root[r],1,MAXN,l);int sum=tr.fnd_sum(tr.root[l-1],tr.root[r],1,MAXN,mex);cout << r-l+1-sum << "\n";}
}

补 cf round 973 div2 D                                     cf传送门

曾作为牛客多校的签到题出现过,不过那题数据范围100以内

思路:易想到只要存在 ai > ai+1,就操作,最后是个单调不减,不过数据范围不允许暴力抹平,可以二分出最大的最小值和最小的最大值,来取得最小极差

代码如下:

const int N=3e5+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;
ll a[N];
bool check1(ll x){ll sum=0;for(int i=1;i<=n;i++){if(a[i]>x) sum+=a[i]-x;else if(sum<x-a[i]) return 0;else sum-=x-a[i];}return 1;
}
bool check2(ll x){ll sum=0;for(int i=1;i<=n;i++){if(a[i]>x) sum+=a[i]-x;else sum-=x-a[i],sum=max(0ll,sum);}return sum==0;
}
void solve(){cin >> n;ll mi=1e18,ma=0;for(int i=1;i<=n;i++){cin >> a[i];mi=min(a[i],mi);ma=max(a[i],ma);}ll ans1=0,ans2=0;ll l=mi,r=ma;while(l<=r){ll mid=l+r>>1;if(check1(mid)) ans1=mid,l=mid+1;else r=mid-1;}l=mi,r=ma;while(l<=r){ll mid=l+r>>1;if(check2(mid)) ans2=mid,r=mid-1;else l=mid+1;}cout << ans2-ans1 << "\n";
}

星期二:

cf edu round134 div2 D 位运算贪心                 cf传送门

思路:易想到从高位向低位贪心,ans怎样能在这位上为1呢,需要a中此位为0的数与b中此位为1的数能一一对应,即数量相等,反过来也是一样,若ans此位为1,接下来需要把a和b按此位01对应分为两组,以后每一低位需在每个小组内递推找对应。思路上不难,但代码如何实现是个问题

这里用到了神奇的sort,首先将a从小到大排,将b从大到小排,为什么这么做呢,将每个数看作二进制,排序时一定先按优先级最高的第一位来排,也就是如果a中最高位的0/1数量刚好能和b中最高位的1/0数量对应,那么一定存在 idx,使得任意i<=idx,ai此位为0,bi此位为1,任意i>=idx,ai此位为1,bi此位为0。

利用这点,我们就无形中做到了分组,如果ans此位不能为1,就将a,b所有数此位全设为0或1,重新排序,避免以后低位时受到这一位对排序的影响,如果能为1,就保留原来情况

代码如下:

const int N=2e5+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;
int a[N],b[N];
void solve(){cin >> n;for(int i=1;i<=n;i++) cin >> a[i];for(int i=1;i<=n;i++) cin >> b[i];sort(a+1,a+n+1);sort(b+1,b+n+1,greater<>());int ans=0;for(int i=30;~i;i--){bool if1=1;for(int j=1;j<=n;j++) if((a[j]&1<<i)==(b[j]&1<<i)){if1=0; break;}if(if1) ans|=1<<i;else{for(int j=1;j<=n;j++) a[j]|=1<<i,b[j]|=1<<i;sort(a+1,a+n+1);sort(b+1,b+n+1,greater<>());}}cout << ans << "\n";
}

星期三:

补 23 CCPC秦皇岛 F                                      cf传送门

首先注意读题,ai属于正整数集合,也就是说不能把ai改成0

思路:这题有一个大胆的前置结论,对于奇偶性相同的x,y,存在无穷个z使得x+z与y+z为质数

也就是说,若 ai-1与ai+1奇偶性相同,修改ai一定能满足ai+ai-1与ai+ai+1都为质数。实际上这题和石碑文很像,都是先定义状态,然后大力分类讨论来转移

题解定了4个状态,我自己定了7个

1-改为1,2-改为2,3-改为任意奇数,4-改为任意偶数,5-不变,6-改为质数-1,7-改为质数-2

注意分类讨论需要比较细

代码如下:

const int N=2e6+10,M=1e4+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;
int dp[N][8];
int p[N],idx;
bool vi[N];
void getp(int x){for(int i=2;i<=x;i++){if(!vi[i]) p[++idx]=i;for(int j=1;1ll*i*p[j]<=x;j++){vi[i*p[j]]=1;if(i%p[j]==0) break;}}
}
void solve(){getp(2e5+10);cin >> n;int lst=0;cin >> lst;memset(dp,0x3f,sizeof dp);dp[1][1]=(lst!=1);dp[1][2]=(lst!=2);dp[1][3]=dp[1][4]=1;dp[1][5]=0;dp[1][6]=vi[lst+1];dp[1][7]=vi[lst+2];for(int i=2;i<=n;i++){int a; cin >> a;dp[i][1]=min({dp[i-1][1],dp[i-1][2],dp[i-1][4],dp[i-1][6]})+(a!=1);dp[i][2]=min({dp[i-1][1],dp[i-1][3],dp[i-1][7]})+(a!=2);if(lst&1) dp[i][3]=dp[i-1][4]+1,dp[i][4]=min(dp[i-1][3],dp[i-1][5])+1;else dp[i][3]=min(dp[i-1][4],dp[i-1][5])+1,dp[i][4]=dp[i-1][3]+1;dp[i][3]=min(dp[i-1][2]+1,dp[i][3]);dp[i][4]=min(dp[i-1][1]+1,dp[i][4]);if(a==1) dp[i][5]=min({dp[i-1][1],dp[i-1][2],dp[i-1][4],dp[i-1][6]});else if(a==2) dp[i][5]=min({dp[i-1][1],dp[i-1][3],dp[i-1][7]});else{if(a&1) dp[i][5]=dp[i-1][4];else dp[i][5]=dp[i-1][3];}if(!vi[lst+a]) dp[i][5]=min(dp[i-1][5],dp[i][5]);if(!vi[a+1]) dp[i][5]=min(dp[i-1][1],dp[i][5]),dp[i][6]=dp[i][5];if(!vi[a+2]) dp[i][5]=min(dp[i-1][2],dp[i][5]),dp[i][7]=dp[i][5];dp[i][6]=min(dp[i-1][1]+(vi[a+1]),dp[i][6]);dp[i][7]=min(dp[i-1][2]+(vi[a+2]),dp[i][7]);lst=a;}cout << *min_element(dp[n]+1,dp[n]+8) << "\n";
//	for(int j=1;j<8;j++) cout << j << " \n"[j==7];
//	cout << "\n";
//	for(int i=1;i<=n;i++)
//		for(int j=1;j<8;j++) cout << dp[i][j] << " \n"[j==7];
}

补 24 ICPC武汉邀请赛 F 难得交互                      cf传送门

思路:二分答案,如何check是个问题,从左下角开始走,若当前元素<=mid,则同列以上所有数都<=mid,sum加上行数,往右走,若当前元素>mid,则往上走,步数最多 2*n,再加个log1e6,询问在4e4之内

代码如下:

const int N=2e6+10,M=1e4+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;
ll ask(int x,int y,ll mid){cout << "? " << x << " " << y << " " << mid << endl;bool ifx=0; cin >> ifx;return ifx;
}
void solve(){ll k; cin >> n >> k;k=n*n-k+1;ll l=1,r=n*n,ans=0;while(l<=r){ll mid=l+r>>1;int px=n,py=1,sum=0;while(px && py<=n){if(ask(px,py,mid)) sum+=px,py++;else px--;}if(sum>=k) ans=mid,r=mid-1;else l=mid+1;}cout << "! " << ans;
}

贴道 B                                                          cf传送门

平心而论并不算难的贪心题,但赛时这题花了3h

思路:从高位到低位放,放这位的前提是低位放满都不够,放的话尽量这位多放点

代码如下:

void solve(){cin >> n;ll sum=0;for(int i=1;i<=n;i++){int a; cin >> a;sum+=a;}ll ans=0;for(int i=31;~i;i--){ll one=1ll<<i;if(one>sum) continue;ll ma=((1ll<<i)-1)*n;if(ma<sum){ans|=1<<i;sum-=min(n,sum/one)*one;}}cout << ans;
}

星期四:

补24 ICPC武汉邀请赛 M                                   cf传送门

思路:注意到合并操作必定是一奇一偶合成一个奇数,所以偶数是用一个少一个,可以把偶数从大到小来考虑,例如 num是一偶数,应优先看有无 num+1或能否合成,若无,再检查 num-1

如何判断能否得到数 num+1呢,已知num+1可确定由num0和num1合成,若无num0,那么肯定无法合成,若还有num0,再判断能否得到num1。相信聪明的你已经发现了,判断可用递推递归实现

记录数的数量用map,注意带着map跑dfs时别 RE了

代码如下:

ll n;
map<ll,int>mp;
bool dfs(ll num){ll num0=num/2,num1=num/2;if(num0&1) num0++;else num1++;              //找出由哪俩数合成if(mp[num0]<=0) return 0; //先看最重要偶数mp[num0]--;               //若有,先给扣掉,以免影响递推的dfs判断if(mp[num1]>0 || dfs(num1)){mp[num1]--,mp[num]++;n--;return 1;}else{mp[num0]++;       //无法合成,记得给num0还回来return 0;}
}
void solve(){cin >> n;vector<ll>ve;for(int i=1;i<=n;i++){ll a; cin >> a;mp[a]++;if(!(a&1)) ve.push_back(a);}sort(ve.begin(),ve.end(),greater<>());for(ll num:ve) if(mp[num]>0){mp[num]--;if(mp[num+1]>0 || dfs(num+1)) mp[num+1]--,mp[num*2+1]++,n--;else if(mp[num-1]>0 || dfs(num-1)) mp[num-1]--,mp[num*2-1]++,n--;else mp[num]++;}cout << n << "\n";for(auto [x,y]:mp) for(int i=1;i<=y;i++) cout << x << " ";
}

星期五:

补 D                                                                cf传送门

注意题目有说明,异或只是输出答案的方式,与解法无关

思路:g【i】【j】表示从 i开始走 j步不折返的最大价值,f【i】【j】表示折返一次

先处理出 g的值,将 f的左右折返分开看,f【i】【j】若向左折返一步,则等于g【i-1】【j-1】,折返两步等于g【i-2】【j-2】,以此类推,若向右折返一步等于g【i+1】【j-1】,两步为g【i+2】【j-2】,以此类推

到这即可使用n^2枚举 i,j,同时g【i】【j】一直向上个状态取最大值,即可处理出f

注释语句也可处理出 f

代码如下:

ll n;
ll a[5050];
ll f[5050][5050*2],g[5050][5050*2];
void solve(){cin >> n;for(int i=1;i<=n;i++){cin >> a[i];a[i]+=a[i-1];}for(int i=1;i<=n;i++){for(int j=1;j<=2*n;j++){int l=max(i-j,1),r=min(1ll*i+j,n);g[i][j]=max(a[i]-a[l-1],a[r]-a[i-1]);}}for(int i=1;i<=n;i++){for(int j=1;j<=2*n;j++){g[i][j]=max(g[i-1][j-1],g[i][j]);f[i][j]=g[i][j];
//			f[i][j]=max(f[i-1][j-1],g[i][j]);}}for(int i=n;i;i--){for(int j=1;j<=2*n;j++){g[i][j]=max(g[i+1][j-1],g[i][j]);f[i][j]=max(g[i][j],f[i][j]);
//			f[i][j]=max(f[i+1][j-1],f[i][j]);}}ll ans=0;for(int i=1;i<=n;i++){ll tmp=0;for(int j=1;j<=2*n;j++) tmp^=f[i][j]*j;ans^=tmp+i;}cout << ans;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在线SQL模拟器

前言 有时候我们想学习下SQL&#xff0c;但是缺少数据库环境&#xff0c;多种数据库类型&#xff0c;MySQL&#xff0c;SQL server&#xff0c;Oracle&#xff0c;PostgreSQL等等&#xff0c;自己安装&#xff1f;耗时费力&#xff0c;占用电脑资源&#xff0c;要是有一个在线…

理解 Vue 的 setup 应用程序钩子

title: 理解 Vue 的 setup 应用程序钩子 date: 2024/9/30 updated: 2024/9/30 author: cmdragon excerpt: 摘要:本文详细介绍了Vue 3中setup函数的应用,包括其概念、特性、使用方法及重要性。setup函数作为组合API的核心,在组件实例化前被调用,用于设置响应式状态、计算…

如何构建一个生产级的AI平台(2)?

书接上回&#xff0c;继续往下讲,本节会说一下如何给大模型应用构建安全防护机制 为大模型应用构建安全防护 构建安全防护有助于降低 AI 风险&#xff0c;不仅可以保护您的用户&#xff0c;还可以保护您&#xff08;开发人员&#xff09;。只要有可能发生故障&#xff0c;就应…

Redis篇(应用案例 - UV统计)(持续更新迭代)

目录 一、HyperLogLog 二、测试百万数据的统计 一、HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。 1天内同一个用户多次访问该网站&#xff0c;只记录…

大盘点|9月独家爆款SVG模版(互斥伸长、扑克出牌、预感应滑动等)

九月即将结束&#xff0c;黑科技 SVG 编辑器作为业界天花板&#xff0c;在本月又发明了哪些一骑绝尘的 SVG 特效大杀器&#xff1f;一起来看看我们的盘点与推荐吧&#xff01;如需体验&#xff0c;不妨直接登陆黑科技编辑器一探究竟。 1️⃣互斥伸长/互斥切换-伸长 E2 平台的…

C# C++ 笔记

第一阶段知识总结 lunix系统操作 1、基础命令 &#xff08;1&#xff09;cd cd /[目录名] 打开指定文件目录 cd .. 返回上一级目录 cd - 返回并显示上一次目录 cd ~ 切换到当前用户的家目录 &#xff08;2&#xff09;pwd pwd 查看当前所在目录路径 pwd -L 打印当前物理…

如何使用 Python 读取数据量庞大的 excel 文件

使用 pandas.read_excel 读取大文件时&#xff0c;的确会遇到性能瓶颈&#xff0c;特别是对于10万行20列这种规模的 .xlsx 文件&#xff0c;常规的 pandas 方法可能会比较慢。 要提高读取速度&#xff0c;关键是找到更高效的方式处理 Excel 文件&#xff0c;特别是在 Python 的…

Android Stuido中编译信息出现乱码的解决方式

打开菜单File -> Settings&#xff0c;选择Editor -> File Encodings 窗口&#xff0c;将编码设置为正确的字符集&#xff0c;保证 Global Encoding、Project Encoding 和 Default Encoding for properties files 都设置为 UTF-8。

当今爆火的RPA其实就是自动化测试

最近有机会看到了 RPA 在实际工作中的重度应用&#xff0c;深刻感受到了自动化的强大实力&#xff0c;以后的应用前景时完全可期的。 RPA (Robotic Process Automation) 简介 Robotic Process Automation (RPA) 是一种技术&#xff0c;使用软件机器人&#xff08;或称“机器人…

APO v0.5.0 发布:可视化配置告警规则;优化时间筛选器;支持自建的ClickHouse和VictoriaMetrics

APO 新版本 v0.5.0 正式发布&#xff01;本次更新主要包含以下内容&#xff1a; 新增页面配置告警规则和通知 在之前的版本中&#xff0c;APO 平台仅支持展示配置文件中的告警规则&#xff0c;若用户需要添加或调整这些规则&#xff0c;必须手动编辑配置文件。而在新版本中&a…

09_OpenCV彩色图片直方图

import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inlineimg cv2.imread(computer.jpeg, 1) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.show()plot绘制直方图 plt.hist(img.ravel(), 256) #ravel() 二维降一维 256灰度级…

【使用resnet18训练自己的数据集】

1.背景及准备 书接上文【以图搜图代码实现】–犬类以图搜图示例 总结了一下可以优化的点&#xff0c;其中提到使用自己的数据集训练网络&#xff0c;而不是单纯使用预训练的模型&#xff0c;这不就来了&#xff01;&#xff01; 使用11类犬类微调resnet18网络模型&#xff1a…

如何构建一个生产级的AI平台(1)?

本文概述了生成式 AI 平台的常见组件、它们的作用以及它们的实现方式。 本文重点介绍部署 AI 应用程序的整体架构。 它讨论了需要哪些组件以及构建这些组件时的注意事项。 它不是关于如何构建 AI 应用程序。 这就是整体架构的样子。 这是一个相当复杂的系统。 这篇文章将从最…

css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis、::before的使用

1、~的使用直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:…

SpringBoot技术栈:打造下一代网上租赁系统

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…

传统操作系统和分布式操作系统的区别

分布式操作系统和传统操作系统之间的区别&#xff0c;根植于它们各自的设计哲学和目标。要理解这些差异&#xff0c;需要从操作系统的基本定义、结构、功能以及它们在不同计算环境中的表现进行分析。每种系统都试图解决特定的计算挑战&#xff0c;因此在不同的使用场景下具有各…

基于springboot+vue的社区流浪动物救助系统

摘要 本文介绍了一个基于Spring Boot和Vue.js技术的社区流浪动物救助系统。该系统采用前后端分离架构&#xff0c;后端使用Spring Boot框架进行开发&#xff0c;负责业务逻辑的处理和数据的交互&#xff1b;前端则使用Vue.js框架&#xff0c;为用户提供友好的交互界面。系统实现…

Springboot学习笔记(4)MybatisPlus

1. MybatisPlus 1.1 ORM介绍 ORM&#xff08;Object Relational Mapping&#xff0c;对象关系映射&#xff09;是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术。 比如&#xff0c;将java中的对象传递到关系型数据库中去&#xff0c;或者将关系型数据库传递到jav…

HarmonyOS Next系列之水波纹动画特效实现(十三)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

Webpack 打包后文件过大,如何优化?

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介Webpack 打包后文件过大&#xff0c;如何优化&#xff1f;1. 代码分割&#xff08;Code Splitting&#xff09;1.1 概念1.2 Webpack 的 SplitChunksPlugin示例配置&#xff1a; 1.3 按需加载&#xff08;Lazy Loading&#xff09;示…