24.11.3

星期一:

补24武汉高校联合程序设计新生赛 C                    cf传送门

最开始用倍增+树链刨分,稳定T

思路:处理出树链刨分的dfn序和重链等前置信息,然后对每条重链开个set(常见方法,用于存断开的边,每次询问先对y所在重链进行查询,若无断边或断边深度大于y,则前往上一条重链,直到根节点

沿重链往上跑复杂度为log,set查询也是log,询问复杂度为O(q*log2n),开O3优化后2900ms左右(脸黑可能会T

代码如下:

const int N=2e6+10,M=1e4+10;
const int INF=0x3f3f3f3f;
const int mod=998244353;
ll n;
int fa[N][22],dep[N],top[N],sz[N],son[N],dfn[N],tim;
vector<int>ve[N];
map<PII,int>mp;
int to[N];
struct point{int x;bool operator <(const point &b)const{   //断边按深度排序return dep[x]>dep[b.x];}
};
//map<int,set<point>>ump;
set<point>ump[N];
inline void dfs(int u,int f){if(mp.count({u,f})) to[mp[{u,f}]]=u;else if(mp.count({f,u})) mp[{f,u}]=u;dep[u]=dep[f]+1;fa[u][0]=f;for(int j=1;j<=20;j++) fa[u][j]=fa[fa[u][j-1]][j-1];sz[u]=1;for(int v:ve[u]) if(v!=f){dfs(v,u);sz[u]+=sz[v];if(sz[v]>sz[son[u]]) son[u]=v;}
}
inline void dfs2(int u,int t){dfn[u]=++tim;top[u]=t;if(!son[u]) return ;dfs2(son[u],t);for(int i:ve[u]){if(i==son[u] || i==fa[u][0]) continue;dfs2(i,i);                              //注意dfs2的第二个参数也是i}
}
void solve(){int q; cin >> n >> q;for(int i=1;i<n;i++){int u,v; cin >> u >> v;ve[u].push_back(v);ve[v].push_back(u);mp[{u,v}]=mp[{v,u}]=i;}dfs(1,1);dfs2(1,1);while(q--){int x,y; cin >> x >> y;x=to[x];
//		update(x,x);
//		int an=y;
//		for(int j=__lg(dep[y])+1;~j;j--)
//			if(query(y,fa[an][j])>=0) an=fa[an][j];
//		if(an!=1 && !query(an,an)) an=fa[an][0];
//		cout << an << "\n";auto it=ump[top[x]].find({x});if(it!=ump[top[x]].end()) ump[top[x]].erase(it);else ump[top[x]].insert({x});int an=y;while(an!=1){if(ump[top[an]].empty()){an=fa[top[an]][0]; continue;}auto p=ump[top[an]].lower_bound({an});if(p==ump[top[an]].end()){an=fa[top[an]][0]; continue;}an=(*p).x;break;}cout << an << "\n";}
}

补24 icpc昆明邀请赛 E                                       cf传送门

初见有点让人摸不着头脑

思路:这题利用到了gcd的一个很重要的性质,前缀gcd只有logV种,所以每当前缀gcd即pre【i】变化时,可枚举一遍操作的区间,l固定为 i,枚举 r,先预处理出后缀gcd,即可得到操作区间为    i-j的全局gcd,ans取max

代码如下:

const int N=2e6+10,M=1e4+10;
const int INF=0x3f3f3f3f;
const int mod=998244353;
ll n;
ll a[N],pre[N],suf[N];
void solve(){ll k; cin >> n >> k;for(int i=1;i<=n;i++){cin >> a[i];pre[i]=__gcd(a[i],pre[i-1]);}suf[n+1]=0;for(int i=n;i;i--) suf[i]=__gcd(a[i],suf[i+1]);ll ans=pre[n];for(int i=1;i<=n;i++) if(pre[i]!=pre[i-1]){ll gc=0;for(int j=i;j<=n;j++){gc=__gcd(a[j]+k,gc);ans=max(__gcd(pre[i-1],__gcd(gc,suf[j+1])),ans);}}cout << ans << "\n";
}

补 cf round981 div3 D                                         cf传送门

按理说补了24牛客多校7的D,不应该反应不过来。

思路:遍历时记录所有出现过的前缀和,若一个值出现了两次,即出现了一个区间的sum为0,可直接贪心地ans++,并清空map的记录,记得遍历前和每次清空后定mp【0】= 1

代码如下:

const int N=2.2e6+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;void solve(){cin >> n;map<ll,int>mp;ll sum=0,ans=0;mp[0]=1;for(int i=1;i<=n;i++){ll a; cin >> a;sum+=a;if(!a || mp.count(sum)) ans++,sum=0,mp.clear(),mp[0]=1;else mp[sum]++;}cout << ans << "\n";
}

星期二:

vp 2024 CCPC 哈尔滨,5题,但第五题出的不是J,而是osir出了B的计几

24 ICPC成都上 cf了,交了自以为的最后一发提交代码,以为会在很后面wa,没想到直接过了

原来是最后一发因为之前调试,把一个else if的else给漏了,样例都没过,但当时根本没想到测样例,只能说还是粗糙了😿😿😿

悟以往之不谏,知来者之可追,当下该做的是及时调整状态,为下个月的沈阳站做准备

连一刻都没有为成都站的失利哀悼,立刻赶到战场的是11月23日沈阳!

星期三:

补24 CCPC 哈尔滨 J                                               cf传送门

就该多写写这种构式贪心题

思路:思路一眼,实现赤石。建议动手前先想清楚到底会有哪几种情况

按下一个充电桩的下标给要用的电池排序,优先队列实现

遍历充电桩,再不断地取电池出来用,若电池不够,直接输出答案,否则开始讨论

设当前充电桩可充电电池为 ba,那么ba不可能满电,只有用完和没用完两种情况。

若没用完,此时优先队列队头必是ba,取出来给充满电重新放回去,若后面还有充电桩,下标为下一充电桩下标,否则m+1,即压箱底的电池

若用完了,先把取出来的队头电池放回去,后续操作同上述情况

代码如下:

const int N=2e6+10,M=1e4+10;
const int INF=0x3f3f3f3f;
const int mod=998244353;
ll n;
ll a[N],x[N],t[N];
vector<int>ve[N];
void solve(){ll m; cin >> n >> m;for(int i=1;i<=n;i++){cin >> a[i];ve[i].clear();}for(int i=1;i<=m;i++){cin >> x[i] >> t[i];ve[t[i]].push_back(i);}for(int i=1;i<=n;i++) reverse(ve[i].begin(),ve[i].end());priority_queue<PII,vector<PII>,greater<>>pq;for(int i=1;i<=n;i++){if(ve[i].empty()) pq.push({m+1,a[i]});else pq.push({ve[i].back(),a[i]}),ve[i].pop_back();}for(int i=1;i<=m;i++){ll dis=x[i]-x[i-1];while(dis && !pq.empty()){auto [id,lef]=pq.top(); pq.pop();ll mi=min(dis,lef);dis-=mi,lef-=mi;if(lef) pq.push({id,lef});}if(dis){cout << x[i]-dis << "\n"; return ;}if(!pq.empty()){auto [id,lef]=pq.top(); pq.pop();if(id!=i){pq.push({id,lef});if(ve[t[i]].empty()) pq.push({m+1,a[t[i]]});else pq.push({ve[t[i]].back(),a[t[i]]}),ve[t[i]].pop_back();}else {if(ve[t[id]].empty()) pq.push({m+1,a[t[id]]});else pq.push({ve[t[id]].back(),a[t[id]]}),ve[t[id]].pop_back();}}else{if(ve[t[i]].empty()) pq.push({m+1,a[t[i]]});else pq.push({ve[t[i]].back(),a[t[i]]}),ve[t[i]].pop_back();}}ll mo=0;while(!pq.empty()) mo+=pq.top().second,pq.pop();cout << x[m]+mo << "\n";
}

星期四:

补24牛客多校10 K                                                 牛客传送门

思路:易想到至多转折一次分数最高,但误判转折时机为二次函数导致写了个错误三分,其实决定转折点后能走到哪明显是可以二分求出的,那么可想到转折时机大概率需要全部枚举一遍

代码如下:

const int N=2e5+10,M=1e4+10;
const int INF=0x3f3f3f3f;
const int mod=998244353;
ll n;
ll a[N],b[N],ai,bi;
void solve(){cin >> n;ai=bi=0;ll ad=0;for(int i=1;i<=n;i++){ll d; cin >> d;if(!d) ad++;if(d>0) a[++ai]=d;if(d<0) b[++bi]=-d;}sort(a+1,a+ai+1);sort(b+1,b+bi+1);ll ans=0;for(int i=0;i<=ai;i++){if(a[i]>ai-i) break;int l=0,r=bi,res=0;while(l<=r){int mid=l+r>>1;if(bi-mid>=a[i]+b[mid]) res=mid,l=mid+1;else r=mid-1;}ans=max(1ll*i+res,ans);}for(int i=0;i<=bi;i++){if(b[i]>bi-i) break;int l=0,r=ai,res=0;while(l<=r){int mid=l+r>>1;if(ai-mid>=b[i]+a[mid]) res=mid,l=mid+1;else r=mid-1;}ans=max(1ll*i+res,ans);}cout << ans+ad << "\n";
}

贴cf global round27 C 构造                                   cf传送门

观察下样例能得到明显的启发

思路:若n为奇数,最后一次是&操作,那么答案肯定<=最后一个数,尝试让 n在最后构造出 n,易得最后四个数可以为 1 3 n-1 n

若n为偶数,可以补齐n的所有二进制0位,定m为n的二进制相反数,m一定是奇数,按上述构造方法构造出m,最后填n,n|m即可在二进制位上全1,注意m为1或3需要特判

代码如下:

const int N=2e6+10,M=1e4+10;
const int INF=0x3f3f3f3f;
const int mod=998244353;
ll n;void solve(){cin >> n;if(n&1){cout << n << "\n";for(int i=1;i<n-1;i++) if(i!=1 && i!=3) cout << i << " ";cout << "1 3 " << n-1 << " " << n << "\n";}else{ll m=0;for(int j=20;~j;j--) if((1<<j)<n && !(n&1<<j)) m+=(1<<j);cout << (n|m) << "\n";if(m==1){for(int i=2;i<n;i++) cout << i << " ";cout << "1 " << n << "\n"; return ;}else if(m==3){for(int i=4;i<n;i++) cout << i << " ";cout << "1 2 3 " << n << "\n"; return ;}for(int i=1;i<n;i++) if(i!=1 && i!=3 && i!=m-1 && i!=m) cout << i << " ";cout << "1 3 " << m-1 << " " << m << " " << n << "\n";}
}

补24牛客多校10 L                                                  牛客传送门

数据范围非常小,初见没什么思路,但看了题解后其实挺好写的

思路:一共有10^n种密码,一个暴力解法是对于每个限制条件的s和t,将s暴力搜一遍,搜出所有可行的密码,最后统计满足m个条件的密码,复杂度为 10^n * n^3 * m,应该会T

但注意到025到014和000到099操作是等价的,所以可以对s做一个偏移,偏移为0,就只需要以00000为起点暴搜一次,暴搜使用bfs实现即可

如何判断是否满足条件,大多情况下只要t>=dis就行,但需特判t为1和n为1的情况

这里写的判断条件粗糙了,前两个if进行了特判,但第三个if没判t!=1 && n!=1,放特判进去了,以后需注意

代码如下:

const int N=2e5+10,M=1e4+10;
const int INF=0x3f3f3f3f;
const int mod=998244353;
ll n;
ll dis[N],p10[6]={1,10,100,1000,10000,100000};
void init(){memset(dis,-1,sizeof dis);   //dis需初始化为-1而不是0queue<int>qu;dis[0]=0;qu.push(0);while(!qu.empty()){int num=qu.front(),tnum=num; qu.pop();int a[6]={0};for(int i=n;i;i--) a[i]=tnum%10,tnum/=10;for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){      //枚举操作区间int num1=0,num2=0;for(int k=1;k<=n;k++){if(k<i || k>j) num1=num1*10+a[k],num2=num2*10+a[k];else num1=num1*10+(a[k]+1)%10,num2=num2*10+(a[k]+9)%10;}if(dis[num1]==-1) dis[num1]=dis[num]+1,qu.push(num1);if(dis[num2]==-1) dis[num2]=dis[num]+1,qu.push(num2);}}}
}
void solve(){n=5;init();int tc; cin >> tc;while(tc--){ll m; cin >> n >> m;int cnt[N]={0};for(int i=1;i<=m;i++){string s;int t; cin >> s >> t;int py[6]={0};for(int i=1;i<=n;i++) py[i]=s[i-1]-'0';      //每位上的偏移量for(int num=0;num<p10[n];num++){int tonum=0,a[6]={0},tnum=num;for(int i=n;i;i--) a[i]=tnum%10,tnum/=10;for(int i=1;i<=n;i++) tonum=tonum*10+(a[i]-py[i]+10)%10;if(t==1 && dis[tonum]==t) cnt[num]++;else if(n==1 && (dis[tonum]&1)==(t&1) && dis[tonum]<=t) cnt[num]++;else if(t!=1 && n!=1 && dis[tonum]<=t) cnt[num]++;
//				if(dis[tonum]==0 && t==1) continue;
//				if(n==1 && (abs(t-dis[tonum])&1)) continue;
//				if(dis[tonum]<=t) cnt[num]++;}}ll ans=-1,ifm=0;for(int num=0;num<p10[n];num++) if(cnt[num]==m){if(ans!=-1){ifm=1; break;}ans=num;}if(ifm) cout << "MANY\n";else if(ans==-1) cout << "IMPOSSIBLE\n";else{for(int i=n-1;~i;i--) cout << ans/p10[i]%10; cout << "\n";}}
//	cout << dis[0];
}

星期六:

blg输给了t1

如今23号沈阳站已近在咫尺,我必须思考这是否是我此生仅有的机会

周日:

补24牛客多校10 D                                                    牛客传送门

思路:注意到k>=0.1,也就是最新的一局表现分至少占总分的十分之一,其实这个比例很大,若注意到了这一点,可以写个随机化模拟,会发现在350局左右后,初始分的影响已在精度范围内消失

然后写个dp,反而dp这部分我还没太搞懂,感觉需要再精进一下

代码如下:

const int N=2e5+10,M=1e4+10;
const int INF=0x3f3f3f3f;
const int mod=998244353;
ll n;
double p[N];
double dp[N][351],qk[N];
void solve(){ll m;double k; cin >> n >> m >> k;
//	double r=0; cin >> r;for(int i=0;i<=n;i++) cin >> p[i];p[0]/=k;qk[0]=1;for(int i=1;i<=n;i++) qk[i]=qk[i-1]*(1-k);		double ans=0;for(int j=1;j<=350;j++) dp[n+1][j]=-1e18;for(int i=n;~i;i--){for(int j=1;j<=350;j++) if(n-i+1-j<=m){dp[i][j]=max(dp[i+1][j],dp[i+1][j-1]+p[i]*qk[j-1]);if(!i || j==350) ans=max(dp[i][j],ans);}}cout << fixed << setprecision(12) << ans*k << "\n";
}

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

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

相关文章

大端存储和小端存储

大端存储和小端存储 在计算机系统中&#xff0c;数据在内存中的存储方式并不是唯一的。对于多字节的数据类型&#xff08;如 int、float 等&#xff09;&#xff0c;计算机可以以不同的方式在内存中存储它们。这些存储方式通常分为两种&#xff1a;大端存储&#xff08;Big-En…

如何使用RabbitMQ和Python实现广播消息

使用 RabbitMQ 和 Python 实现广播消息的过程涉及设置一个消息队列和多个消费者&#xff0c;以便接收相同的消息。RabbitMQ 的 “fanout” 交换机允许你将消息广播到所有绑定的队列。以下是如何实现这一过程的详细步骤。 1、问题背景 在将系统从Morbid迁移到RabbitMQ时&#x…

C#-类:成员变量

声明在类语句块中&#xff0c;描述对象的特征&#xff0c;可为任意变量类型 可包含&#xff1a;枚举、结构体、类、其他 1. 类成员的详细定义 特征->成员变量&#xff1a;包括类的数据&#xff1a;变量、常量、事件的成员行为->成员方法&#xff1a;普通方法、属性、构…

PAT甲级-1133 Splitting A Linked List

题目 题目大意 给定一个链表的首节点地址和节点个数&#xff0c;以及一个数k。要求重新排列该链表&#xff0c;使其按<0 &#xff0c;> 0 && < k&#xff0c;>k 的顺序排序。但是不改变原有顺序&#xff0c;比如-4 -> -6 -> -2&#xff0c;不需要再…

【spark的集群模式搭建】spark集群之Yarn集群模式搭建(清晰明了的搭建流程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接&#xff08;如果在Standalone模式中创建有就删除&#xff09;4、配置spark环境变量5、修改spark-env.sh配置文件6、修改spark-defaults.conf 配置文件7、修改log4j.properties配置文件8、上传spark jar包…

Android IPC机制(三)进程间通信方式

在Android中有以下几种进程间通信方式: 目录 1.Bundle 2.文件共享 3.Messenger 4.ContentProvider 5.AIDL 1.Bundle Bundle是Android中用于存储一组键值对的类&#xff0c;它实现了Parcelable接口。这使得Bundle能够在不同的进程之间传递数据。当我们通过Intent启动其他应…

GEE数据集:全球天然林和人工林数据集提供了一张高分辨率(30 米)地图,用于区分截至 2021 年全球的天然林和人工林

目录 简介 全球天然林和人工林 数据生成和分类 代码 引用 License 网址推荐 知识星球 机器学习 GEE数据集&#xff1a;全球天然林和人工林数据集提供了一张高分辨率&#xff08;30 米&#xff09;地图&#xff0c;用于区分截至 2021 年全球的天然林和人工林 简介 全球…

基于SpringBoot司机信用评价的货运管理系统【附源码】

基于SpringBoot司机信用评价的货运管理系统 效果如下&#xff1a; 系统主页面 系统注册页面 司机注册页面 管理员主页面 订单评价页面 货物信息页面 个人信息页面 研究背景 随着我国物流行业的迅猛发展&#xff0c;货运管理系统的效率与安全性日益受到重视。在货运过程中&am…

<项目代码>YOLOv8 煤矸石识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

netty之实现一个redis的客户端

写在前面 本文看下如何使用redis来实现一个类似于redis官方提供的redis-cli.exe的客户端工具。 1&#xff1a;用到的模块 主要需要用到netty针对redis的编解码模块&#xff0c;可以解析redis的协议&#xff0c;从而可以实现和redis交互的功能。 2&#xff1a;正文 首先来…

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143388189 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ground…

不用买PSP,画质甚至更好,这款免费神器让你玩遍经典游戏

作为掌机游戏爱好者的福音&#xff0c;PPSSPP模拟器为玩家带来了前所未有的PSP游戏体验&#xff0c;彻底改变了掌机游戏的体验方式。这款精湛的软件不仅完美复刻了PSP主机的游戏体验&#xff0c;更通过先进的模拟技术&#xff0c;将经典游戏提升到了全新的高度。对于那些珍藏PS…

第15课 算法(下)

掌握冒泡排序、选择排序、插入排序、顺序查找、对分查找的的基本原理&#xff0c;并能使用这些算法编写简单的Python程序。 一、冒泡排序 1、冒泡排序的概念 冒泡排序是最简单的排序算法&#xff0c;是在一列数据中把较大&#xff08;或较小&#xff09;的数据逐次向右推移的…

golang通用后台管理系统03(登录校验,并生成token)

代码 package serviceimport ("fmt"//"fmt""gin/common""gin/config"sysEntity "gin/system/entity"sysUtil "gin/system/util""github.com/gin-gonic/gin""log" )func Login(c *gin.Contex…

Java环境下配置环境(jar包)并连接mysql数据库

目录 jar包下载 配置 简单连接数据库 一、注册驱动&#xff08;jdk6以后会自动注册&#xff09; 二、连接对应的数据库 以前学习数据库就只是操作数据库&#xff0c;根本不知道该怎么和软件交互&#xff0c;将存储的数据读到软件中去&#xff0c;最近学习了Java连接数据库…

快速遍历包含合并单元格的Word表格

Word中的合并表格如下&#xff0c;现在需要根据子类&#xff08;例如&#xff1a;果汁&#xff09;查找对应的品类&#xff0c;如果这是Excel表格&#xff0c;那么即使包含合并单元格&#xff0c;也很容易处理&#xff0c;但是使用Word VBA进行查找&#xff0c;就需要一些技巧。…

「C/C++」C/C++标准库 之 #include<ctime> 时间日期库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

使用wordcloud与jieba库制作词云图

目录 一、WordCloud库 例子&#xff1a; 结果&#xff1a; 二、Jieba库 两个基本方法 jieba.cut() jieba.cut_for_serch() 关键字提取&#xff1a; jieba.analyse包 extract_tags() 一、WordCloud库 词云图&#xff0c;以视觉效果提现关键词&#xff0c;可以过滤文本…

深入解析缓存模式下的数据一致性问题

今天&#xff0c;我们来聊聊常见的缓存模式和数据一致性问题。 常见的缓存模式有&#xff1a;Cache Aside、Read Through、Write Through、Write Back、Refresh Ahead、Singleflight。 缓存模式 Cache Aside 在 Cache Aside 模式中&#xff0c;是把缓存当做一个独立的数据源…

ffmpeg视频滤镜:膨胀操作-dilation

滤镜介绍 dilation 官网链接 > FFmpeg Filters Documentation 膨胀滤镜会使图片变的更亮&#xff0c;会让细节别的更明显。膨胀也是形态学中的一种操作&#xff0c;在opencv中也有响应的算子。此外膨胀结合此前腐蚀操作&#xff0c;可以构成开闭操作。 开操作是先腐蚀…