NOIP模拟赛2

news/2025/11/5 18:57:21/文章来源:https://www.cnblogs.com/why20031113/p/19194420

T2:游戏(game)

假设总共有 \(n\) 个点,因为A要先选,所以他可以选 \((n+1)/2\) 个点,我们设其为 \(len\) ,因为环太难搞了,我们把长度翻个倍,让它成一个链再处理。

如上图,假如A第一个点选A点,那么明显那 \(4\) 个颜色的区间就是可以选择的,因为B是聪明的,所以只要A的答案大一点,就会被B卡掉,所以A只能再这些结果中选取最小值,不然就不满足B是聪明的了。

那么答案就很明显了,我们枚举每一个点,找它可到达区间的最小值,再在这些中取最大值,以为 \(n=5e5\) ,所以要开一个线段树来维护一下。

点击查看代码
#include<bits/stdc++.h>
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
const int N=5e5+10;
int a[N<<1],n,sum[N<<1],t[N<<3],ans;
inline int in(){int k=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9') k=(k<<3)+(k<<1)+c-'0',c=getchar();return k*f;
}
void add(int x,int l,int r,int p,int v){if(l==r){t[x]=v;return;}int mid=(l+r)>>1;if(p<=mid) add(ls(x),l,mid,p,v);else add(rs(x),mid+1,r,p,v);t[x]=min(t[ls(x)],t[rs(x)]);return;
}
int query(int x,int l,int r,int xl,int xr){if(xl<=l&&r<=xr) return t[x];if(l>xr||r<xl) return 1e9;int mid=(l+r)>>1;return min(query(ls(x),l,mid,xl,xr),query(rs(x),mid+1,r,xl,xr));
}
signed main(){// freopen("ex_game4.in","r",stdin);freopen("1.out","w",stdout);freopen("game.in","r",stdin);freopen("game.out","w",stdout);n=in();for(int i=1;i<=n;i++) a[i]=a[i+n]=in();for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+a[i];int len=(n+1)/2;for(int i=len;i<=(n<<1);i++)add(1,1,n<<1,i,sum[i]-sum[i-len]);for(int i=len;i<=n+len-1;i++)ans=max(ans,query(1,1,n<<1,i,i+len-1));printf("%d\n",ans);return 0;
}
///////////////////////////////////////////////////
//                      ♪♪♪                      //
///////////////////////////////////////////////////
//つ ◕_◕ つ
//༼ つ ◕_◕ ༽つ

T3:海报(posters)

emmm,没什么好说的,显然新的海报要么贴着别的海报的边,要么贴着边界最优,搜索+剪枝,我没改,直接粘zzy的了。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=205;
int n,m,k,ans,vis[N][N],c[N];
struct square{int w,h,s;bool operator < (const square &b){return s > b.s;}
}a[10];
void out(){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) cout<<vis[i][j];cout<<'\n';}cout<<'\n';
}
void solve(){memset(vis,0,sizeof vis);for(int i=1;i<=k;i++){if(i==1){for(int x=1;x<=a[c[i]].w;x++)for(int y=1;y<=a[c[i]].h;y++) vis[x][y]=1;continue;}if(i==2){for(int x=n-a[c[i]].w+1;x<=n;x++)for(int y=m-a[c[i]].h+1;y<=m;y++) vis[x][y]=1;continue;}// if(i==3){//     int res=a[c[i]].s,id;//     for(int j=1;j+a[c[i]].h-1<=m;j++){//     int cs=0;//     for(int x=1;x<=a[c[i]].w-1;x++)//     for(int y=j;y<=j+a[c[i]].h-1;y++)//     if(vis[x][y]) cs++;//     if(cs < res) res=cs,id=j;// }// for(int x=1;x<=a[c[i]].w;x++)// for(int y=id;y<=id+a[c[i]].h-1;y++) vis[x][y]=1;// continue;// }int res=a[c[i]].s,idx,idy;for(int ii=1;ii+a[c[i]].w-1<=n;ii++)for(int j=1;j+a[c[i]].h-1<=m;j++){int cs=0;for(int x=ii;x<=ii+a[c[i]].w-1;x++)for(int y=j;y<=j+a[c[i]].h-1;y++)if(vis[x][y]) cs++;if(cs < res) res=cs,idx=ii,idy=j;// if(cs > pre && cs > lpre) break;}for(int x=idx;x<=idx+a[c[i]].w-1;x++)for(int y=idy;y<=idy+a[c[i]].h-1;y++) vis[x][y]=1;}int res=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) if(vis[i][j]) res++;ans=max(ans,res);
}
signed main(){freopen("posters.in","r",stdin);freopen("posters.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m>>k;for(int i=1;i<=k;i++) cin>>a[i].w;for(int i=1;i<=k;i++) cin>>a[i].h;for(int i=1;i<=k;i++) a[i].s=a[i].w*a[i].h;if(k==1){cout<<min(n*m,a[1].s)<<'\n';return 0;}if(k==2){ans=a[1].s+a[2].s;if(a[1].w+a[2].w > n && a[1].h+a[2].h > m)ans-=(a[1].w+a[2].w-n)*(a[1].h+a[2].h-m);ans=min(ans,n*m);cout<<ans<<'\n';return 0;}sort(a+1,a+k+1);for(int i=1;i<=k;i++) c[i]=i;do{// if(c[1]==k || c[1]==k-1) continue; solve();}while(next_permutation(c+1,c+k+1));cout<<ans<<'\n';return 0;
}

T4: 环(ring)

先不考虑别的,先考虑暴力。

咱们有两种暴力的方法:

1.求前缀和,然后 \(O(1)\) 查询,\(O(n)\) 修改。

2.记录每一个环转了几次,\(O(1)\) 修改,每次查询找它这个位置实际是那个数,\(O(n)\) 的查询。

这俩个肯定都不行,所以我们考虑根号分治给他们合起来。

修改:

若这个环内数的个数小于等于 \(\sqrt n\),我们直接暴力硬换,\(O(\sqrt n)\) 的时间复杂度。

若这个环内数的个数大于 \(\sqrt n\) ,我们记录一个数组 \(tim\),来维护它转了多少次,时间复杂度为 \(O(1)\)

查询:

把询问分为两部分,若这个数所处的环内数的个数小于等于 \(\sqrt n\),我们分块记录和,给它统计进去,然后就可以 \(O(\sqrt n)\) 查询。

数所处的环内数的个数大于 \(\sqrt n\) 的部分我们就可以开个vector存前缀和,二分在询问区间内的左右端点,时间复杂度为 \(O(n \log_2 n)\),这个需要处理一下,因为你这个询问是记录的翻转次数,可能导致你实际的 \(l\) 大于 \(r\),具体的直接看我代码。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1.5e5+10,kN=400;
int a[N],pos[N],beg[kN],en[kN],n,m,q,c[N],tim[N],siz[N],len,st[N],top,lim,pos1[N];
ll sum[kN],sum2[N];
vector<int> vec[N];
vector<ll> sum1[N];
inline int in(){int k=0;char c=getchar_unlocked();while(c<'0'||c>'9') c=getchar_unlocked();while(c>='0'&&c<='9') k=(k<<3)+(k<<1)+c-'0',c=getchar_unlocked();return k;
}
inline ll query(int l,int r){ll res=0;int kp=pos[l],kq=pos[r];if(kp==kq){for(int i=l;i<=r;++i){if(siz[c[i]]<=lim)res+=a[i];else{int x=pos1[i];x=vec[c[i]][x-tim[c[i]]+(x-tim[c[i]]<0)*siz[c[i]]];res+=a[x];}}}else{for(int i=l;i<=en[kp];++i)res+=(siz[c[i]]<=lim)*a[i];for(int i=kp+1;i<=kq-1;++i)res+=sum[i];for(int i=beg[kq];i<=r;++i)res+=(siz[c[i]]<=lim)*a[i];for(int i=1;i<=top;++i){int x=st[i];int xr=siz[x]-1,xl=0,ansl=-1,ansr=-1;while(xl<=xr){int mid=(xl+xr)>>1;if(vec[x][mid]>=l) xr=mid-1,ansl=mid;else xl=mid+1;}if(ansl==-1) continue;xr=siz[x]-1,xl=0;while(xl<=xr){int mid=(xl+xr)>>1;if(vec[x][mid]<=r) xl=mid+1,ansr=mid;else xr=mid-1;}if(ansr==-1) continue;if(ansr<ansl) continue;ansl-=tim[x],ansr-=tim[x];if(ansl<0) ansl+=siz[x];if(ansr<0) ansr+=siz[x];if(ansl<=ansr){if(ansl==0) res+=sum1[x][ansr];else res+=sum1[x][ansr]-sum1[x][ansl-1];}elseres+=sum1[x][ansr]+sum1[x][siz[x]-1]-sum1[x][ansl-1];}}return res;
}
inline void zhuan(int x){if(siz[x]<=lim){for(int i=vec[x].size()-1;i>=1;--i){sum[pos[vec[x][i]]]=sum[pos[vec[x][i]]]-a[vec[x][i]]+a[vec[x][i-1]];sum[pos[vec[x][i-1]]]=sum[pos[vec[x][i-1]]]+a[vec[x][i]]-a[vec[x][i-1]];swap(a[vec[x][i]],a[vec[x][i-1]]);}}elsetim[x]=(tim[x]+1>=siz[x])?tim[x]+1-siz[x]:tim[x]+1;
}
signed main(){// freopen("1.in","r",stdin);freopen("1.out","w",stdout);freopen("ring.in","r",stdin);freopen("ring.out","w",stdout);n=in(),m=in(),q=in();len=450;lim=670;for(int i=1;i<=n;++i) c[i]=in(),siz[c[i]]++,vec[c[i]].emplace_back(i),pos1[i]=siz[c[i]]-1;for(int i=1;i<=n;++i){pos[i]=(i-1)/len+1;a[i]=in();if(siz[c[i]]<=lim) sum[pos[i]]+=a[i];if(!beg[pos[i]]) beg[pos[i]]=i;en[pos[i]]=i;}for(int i=1;i<=m;++i)if(siz[i]>lim){st[++top]=i;for(int j=1;j<=siz[i];j++)sum2[j]=sum2[j-1]+a[vec[i][j-1]];sum1[i].reserve(siz[i]+1);for(int j=1;j<=siz[i];j++)sum1[i].push_back(sum2[j]);}for(int s=1;s<=q;++s){int op=in();if(op==1){int l=in(),r=in();printf("%lld\n",query(l,r));}else{int x=in();zhuan(x);}}return 0;
}
///////////////////////////////////////////////////
//                      ♪♪♪                      //
///////////////////////////////////////////////////
//つ ◕_◕ つ
//༼ つ ◕_◕ ༽つ

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

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

相关文章

LIN总线-帧的结构

1、LIN是什么LIN是Local Interconnect Network 的缩写,是基于通用异步串口收发器/串行通信协议,可用于汽车、家电、办公设备等多种领域。LIN是一种低成本的串行总线,其一般不会单独存在,通过CAN-LIN网关,经常与上…

[Record] 杂题选做

感觉很多题过了就跑很不够……不能再颓了! P13866 [SWERC 2020] Daisys Mazes 很有趣的一道题。 比较傻地对栈序列 dp,显然状态数量是 NP 的。考虑如何减少状态。 假设一种简单情形,也即在出发点和结束点栈都为空,…

汉字识别代码

import os import random import numpy as np import matplotlib.pyplot as plt from PIL import Image, ImageDraw, ImageFont import torch import torch.nn as nn import torch.optim as optim from torch.utils.da…

函数的描述符特性与绑定方法的生成机制

函数的描述符特性与绑定方法的生成机制 一、为什么把两件事放在同一篇讲 在 Python 中,「函数」(function)本身是一种非数据描述符(non-data descriptor)。 解释器把函数放进类属性槽里时,正是靠描述符协议把它*…

猴子测试

1.核心思想:让测试像一只猴子在胡乱敲击键盘一样,完全随机地、无目的地对软件进行操作,以发现那些在常规、有逻辑的测试中难以发现的深层错误。 2.目的:不是为了验证功能是否正确,而是为了测试软件的健壮性、稳定…

如何选择适合的海外外呼系统电销服务商?

随着越来越多企业将业务拓展到海外市场,外呼系统成为连接客户与企业的重要桥梁。然而,跨境通信的复杂性远高于国内,不同国家的通信法规、时区差异、语音质量、合规要求等问题都可能影响销售效果。许多企业在选择海外…

循环队列通用模版

循环队列: RingQ.h#ifndef RINGQ_H #define RINGQ_H#include <stdint.h> #include <stddef.h> #include "stm32g4xx_hal.h"#ifndef RINGQ_DEFAULT_CAP #define RINGQ_DEFAULT_CAP (2048U) /…

如何选择一个人工智能项目

如何选择一个人工智能项目1.可以使用人工智能完成的项目,并且具有很大的业务价值。

Flutter 开发文档

Flutter 开发文档https://docs.flutter.cn/resources/architectural-overview demo: https://github.com/flutter/samples/tree/main/gemini_tasks

别再只用S3了!RustFS的权限管理系统更安全?

别再只用S3了!RustFS的权限管理系统更安全?在数据安全事件频发的2025年,传统S3兼容存储的权限控制已显乏力。而当一款国产开源存储系统RustFS以其精细化的IAM模块实现三级权限控制和​实时安全策略,是否意味着对象…

STL初识project11

STL基本概念 为了建立数据结构和算法的一套标准,诞生了STL STL(Standard Template Library标准模板库) STL从广义分为容器(container)算法(algorithm)迭代器(iterator) 容器和算法之间通过迭代器进行无缝衔接 S…

告别漫长GC停顿:深入解析G1如何实现可预测的毫秒级响应

告别漫长GC停顿:深入解析G1如何实现可预测的毫秒级响应G1(Garbage-First)垃圾回收器是一款面向服务端应用、为大内存和多处理器系统设计的革命性垃圾回收器。G1的核心设计目标是在满足高吞吐量的同时,建立一个“可…

CSS 中 overflow 属性的两个分属性 overflow-x 和 overflow-y 互相影响问题

CSS 中 overflow 属性的两个分属性 overflow-x 和 overflow-y 互相影响问题修改 CSS3 中的 overflow-x 属性,会影响同一元素的 overflow-y 属性。 举例: <div class="relative overflow-y-scroll overflow-x…

C#项目工程文件中,删除两头相同字符串,中间不一样的内容

示例: /// <para>Представляет TCP-прослушиватель, который ожидает подключения клиентов.</para>输入匹配:///\s*<para>[^<]*…

Day13显示模式

标签在网页的显示方式称为显示模式 共有三种不同的显示模式,其作用也各不相同<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="vie…

人工智能加持,海外市场无限可能!AI外呼助您轻松拓展全球业务!

在全球化竞争愈发激烈的今天,越来越多企业将目光投向海外市场。然而,真正踏出国门后才会发现,跨境业务的挑战远比想象中复杂。语言沟通障碍、时区差异、客户响应慢、人工成本高,这些都成为阻碍企业有效拓展海外客户…

从编码到部署:5大AI工具盘活你的全栈开发流程

​ 全栈开发者的日常,往往是在不同工具间不断切换。今天,我们来聊聊那些真正能提升效率的AI工具,看看它们如何各司其职,又在哪些场景下能协同作战。 一、前端原型:快速构思的得力助手 在前端构思阶段,一些AI工具…

如何是一个人工智能公司

如何是一个人工智能公司在公司业务层面,使用人工智能手段并达到了比较优秀的程度,带来了显著价值。

虚拟中间号和手机号有什么区别?

在企业通信和客户隐私保护场景中,“虚拟中间号”这个词越来越常被提及。很多企业在选择通信方案时,往往会纠结:虚拟中间号与普通手机号到底有什么区别?两者能否互换?其实,这背后牵涉的不仅仅是号码本身,更是企业…

关于OpenGL在AMD设备无法显示内容的解决方法

无任何报错,但是看不到任何渲染的东西,源程序在Intel CPU+Nv卡上没有问题。 使用的是4.3版本. 此时调试输出内容为 GL Renderer: AMD Radeon(TM) Graphics GL Version: 4.6.0 Compatibility Profile Context 25.10.2…