20231027 比赛总结

news2024/12/23 5:21:25

比赛链接

反思

A

感觉不难,出了点小问题也及时解决了,感觉不错

B

对标去年 N O I P    T 2 NOIP\;T2 NOIPT2 是吧,卡了我 2 h 2h 2h 不会,一直在想如何构造,甚至开始搜哈密顿路的定理( d i r a c dirac dirac 定理),感觉正式比赛中应该先跳,失策了

C

果然对标 N O I P 2022 NOIP2022 NOIP2022,比 T 2 T2 T2 简单很多,有一个比较显然的贪心写法,但数据很水,随便怎么都能过(指时间),但 c a i = c b i c_{a_i}=c_{b_i} cai=cbi 的部分没有处理好,导致 − 50 p t s -50pts 50pts

D

没看

题解

A

直接跑最短路

#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
const int N=600100;
typedef pair<int,int> pii;
int a,b,dis[N];
bool vis[N];
priority_queue<pii,vector<pii>,greater<pii> > pq;
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
void upd(int x,int Dist){
    if(dis[x]>Dist) dis[x]=Dist,pq.push({Dist,x});
}
int main(){
    freopen("perfect.in","r",stdin);
    freopen("perfect.out","w",stdout);
    a=read(),b=read();
    memset(dis,0x3f,sizeof(dis));
    dis[a]=0,pq.push({0,a});
    if(a) dis[0]=3,pq.push({3,0});
    while(!pq.empty()){
        int u=pq.top().second;pq.pop();
        if(vis[u]) continue;
        vis[u]=1;
        if(u) for(int d=2;u*d<N;d++) upd(u*d,dis[u]+4+(d-1)*2);
        if(u+1<N) upd(u+1,dis[u]+1);
        if(u) upd(u-1,dis[u]+1);
    }
    printf("%d\n",dis[b]);
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

B

很妙的一道题,但是是 原
我们需要维护处一条 R R R 链和一条 B B B 链,链上颜色都为 R e d Red Red B l u e Blue Blue
考虑增量法
如果我们现在拥有 R R R u → x u\to x ux B B B v → y v\to y vy,需要新增一个点 z z z
即下图中的情况:
在这里插入图片描述如果 x → z x\to z xz R R R y → z y\to z yz B B B 直接接上即可
现在需要考虑的是 x → z x\to z xz B B B y → z y\to z yz B B B x → y x\to y xy 的颜色是没有本质区别的,可以只考虑 R R R 的情况
不难想到直接 R R R 链为 u → x → y → z u\to x\to y\to z uxyz,然后把 B B B 链中删除 y y y 即可

现在我们的问题是如何保证当前枚举的起点 S t St St 为一条链的链头,显然只有当这条链删空时 S t St St 会改变位置,不难发现, S t St St 会变成另一条链的链尾,直接 r e v e r s e reverse reverse 即可
时间复杂度 O ( n 2 ) O(n^2) O(n2)

#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define pb emplace_back
using namespace std;
const int N=2100;
int n;
bool col[N][N];
vector<int> R,B;
char str[N];
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
void solve(int St){
    R.clear(),B.clear();
    R.pb(St);
    bool cur=0;
    for(int i=1;i<=n;i++){
        if(i==St) continue;
        if(B.empty()){ B.pb(i);continue;}
        if(R.empty()){ R.pb(i);continue;}
        int x=R.back(),y=B.back(),z=i;
        if(!col[x][z]){ R.pb(z);continue;}
        if(col[y][z]){ B.pb(z);continue;};
        if(!col[x][y]){
            if(cur&&B.size()==1){
                R.pb(y),reverse(R.begin(),R.end());B.pop_back(),B.pb(z);
                cur^=1;
            }
            else B.pop_back(),R.pb(y),R.pb(z);
        }
        else{
            if(!cur&&R.size()==1){
                B.pb(x),reverse(B.begin(),B.end());R.pop_back(),R.pb(z);
                cur^=1;
            }
            else R.pop_back(),B.pb(x),B.pb(z);
        }
    }
    if(!cur){
        for(int ans:R) printf("%d ",ans);
        for(int ans:B) printf("%d ",ans);
    }
    else{
        for(int ans:B) printf("%d ",ans);
        for(int ans:R) printf("%d ",ans);
    }
}
int main(){
    freopen("hamil.in","r",stdin);
    freopen("hamil.out","w",stdout);
    n=read();
    for(int i=2;i<=n;i++){
        scanf("%s",str+1);
        for(int j=1;j<i;j++) col[i][j]=col[j][i]=str[j]=='R';
    }
    for(int i=1;i<=n;i++) printf("%d\n",n),solve(i),puts("");
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

C

因为加了 n i n^i ni 的系数,且每个数都 ≥ n \ge n n,所以我们考虑贪心
第一反应应该是建图(虽然我不是),考虑 b i → a i b_i\to a_i biai 连边,那么这就是基环树和树森林,考虑一个基环树是无法交换的,所以只可能是树上交换
不难发现,树上交换的一定是一条从根开始的链
根据这个性质,如果 c a i = c b i c_{a_i}=c_{b_i} cai=cbi,直接跳过
c a i > c b i c_{a_i}>c_{b_i} cai>cbi,打上标记, a a a 不能被交换
c a i < c b i c_{a_i}<c_{b_i} cai<cbi,我们每次暴力一点每次直接往上跳,现在的问题是如何判断是否可以跳,用数据结构不难维护
时间复杂度 O ( n ) O(n) O(n)

#include <bits/stdc++.h>
#define pb push_back
#define lowbit(x) x&-x
using namespace std;
const int N=100100;
int n,m,k,a[N],b[N],c[N];
bool tag[N],good[N],vis[N],isrev[N];
int V,E,rt[N],ee[N];
int dfn[N],dfs_clock,siz[N],depth[N],up[N][20];
vector<int> G[N],ans;
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
struct BIT{
	int tr[N];
	void add(int x,int v){ for(;x<=n;x+=lowbit(x)) tr[x]+=v;}
	int ask(int x){
		int res=0;
		for(;x;x-=lowbit(x)) res+=tr[x];
		return res;
	}
}BIT;
void dfs(int u,int Rt){
	V++,vis[u]=1,rt[u]=Rt;
	for(int v:G[u]) E+=!vis[v];
	for(int v:G[u]) if(!vis[v]) dfs(v,Rt);
}
void dfs_prev(int u){
	depth[u]=depth[up[u][0]]+1,dfn[u]=++dfs_clock,siz[u]=1;
	for(int v:G[u]) up[v][0]=u,dfs_prev(v),siz[u]+=siz[v];
}
int get_lca(int x,int y){
    if(depth[x]>depth[y]) swap(x,y);
    for(int i=18;i>=0;i--) if(depth[up[y][i]]>=depth[x]) y=up[y][i];
    if(x==y) return x;
    for(int i=18;i>=0;i--) if(up[x][i]!=up[y][i]) x=up[x][i],y=up[y][i];
    return up[x][0];
}
int get_root(int x){ return x==rt[x]?x:rt[x]=get_root(rt[x]);}
void make_tag(int x){ BIT.add(dfn[x],1),BIT.add(dfn[x]+siz[x],-1);}
int get_dist(int x,int y){
	int lca=get_lca(x,y);
	if(BIT.ask(dfn[x])+BIT.ask(dfn[y])-2*BIT.ask(dfn[lca])) return 1e9;
	return depth[x]+depth[y]-2*depth[lca];
}
int main(){
	freopen("equipment.in","r",stdin);
	freopen("equipment.out","w",stdout);
	n=read(),m=read(),k=read();
	for(int i=1;i<=n;i++) c[i]=read();
	for(int i=1;i<=n;i++) tag[i]=1;
	for(int i=1;i<=m;i++) a[i]=read(),b[i]=read(),G[b[i]].pb(a[i]),ee[a[i]]=i,tag[a[i]]=0;
	for(int i=1;i<=n;i++)
		if(tag[i]){
			V=E=0,dfs(i,i);
			if(V==E) continue;
			good[i]=1;
			dfs_prev(i);
		}
	for(int j=1;j<=18;j++) for(int i=1;i<=n;i++) up[i][j]=up[up[i][j-1]][j-1];
	for(int i=m;i;i--){
		if(isrev[i]||!good[rt[a[i]]]||c[a[i]]==c[b[i]]) continue;
		if(c[a[i]]>c[b[i]]) make_tag(a[i]);
		else if(get_dist(a[i],get_root(rt[a[i]]))<=k){
			int root=get_root(rt[a[i]]);
			vector<int> tmp;
			for(int x=a[i];x!=root;x=up[x][0]) tmp.pb(ee[x]),isrev[ee[x]]=1;
			reverse(tmp.begin(),tmp.end());
			for(int x:tmp) ans.pb(x),k--;
			make_tag(a[i]);
			rt[root]=rt[a[i]]=a[i],good[a[i]]=1;
		}
	}
	printf("%d\n",ans.size());
	for(int x:ans) printf("%d\n",x);
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

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

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

相关文章

【iPad已停用】解锁教程

iPad多次输错密码时&#xff0c;会自动锁定并停用&#xff0c;这时候你可以使用iTuens或Tenorshare进行解锁。 一、使用iTunes解锁 下载并安装iTunes 使用数据线将iPad连接上电脑 让iPad进入恢复模式&#xff0c;同时安装iPad电源键和Home键&#xff0c;直到Logo出现也不要松…

Spring Cloud:四 【详细】

目录 统一网关Gateway 网关的实现 搭建网关 编写配置文件 路由断言工程 路由的过滤器 全局过滤器 网关过滤器执行顺序 网关的cors跨域配置 问题及解决 统一网关Gateway 网关的实现 SpringCloud中存在两种网关 gateway&#xff1a;基于Spring5中提供的WebFlux实现&a…

MatlabR2019b安装教程

下载安装包关闭网络。关闭防火墙。在“Windows安全中心”关闭病毒防护。 然后解压安装包。“R2019b_win64”是安装文件&#xff0c;“crack”是破解文件。 进入“R2019b_win64”文件夹&#xff0c;选中“setup”&#xff0c;鼠标右击选择【以管理员身份运行】。 选择【使用文件…

【计算机视觉】图像分割与特征提取——基于Log、Canny的边缘检测

个人简介&#xff1a; > &#x1f4e6;个人主页&#xff1a;赵四司机 > &#x1f3c6;学习方向&#xff1a;JAVA后端开发 > ⏰往期文章&#xff1a;SpringBoot项目整合微信支付 > &#x1f514;博主推荐网站&#xff1a;牛客网 刷题|面试|找工作神器 > &#…

回归算法|长短期记忆网络LSTM及其优化实现

本期文章将介绍LSTM的原理及其优化实现 序列数据有一个特点&#xff0c;即“没有曾经的过去则不存在当前的现状”&#xff0c;这类数据以时间为纽带&#xff0c;将无数个历史事件串联&#xff0c;构成了当前状态&#xff0c;这种时间构筑起来的事件前后依赖关系称其为时间依赖&…

雨云游戏云面板服使用教程我的世界Forge服务端开服教程(翼龙面板)

雨云面板服目前支持一键开服的游戏有&#xff1a;Minecraft Java版、Minecraft 基岩版、泰拉瑞亚、饥荒&#xff0c;还提供纯Java/Linux环境&#xff08;Docker&#xff09;&#xff0c;方便开自己开其他游戏服。 其中Minecraft Java版支持一键开服的有Arclight、Mohist、CatS…

Python基于微博的舆情分析、热搜可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 1. 简介 基于Python Django的微博热搜、微博舆论可视化系统。通过微博舆情分析系统获取到最新微博舆情分析…

Day13力扣打卡

打卡记录 奖励最顶尖的 k 名学生(哈希表排序) 用哈希表对所有的positive与negative词条进行映射&#xff0c;然后遍历求解。tip&#xff1a;常用的分割字符串的操作&#xff1a;1.stringstream配合getline() [格式buf, string, char]2.string.find()[find未找到目标会返回npos…

51单片机-串口

电脑与单片机通过串口交互 设置波特率&#xff08;根据这个代码&#xff0c;去配置urt_Init()&#xff09; 参照上面配置下面这个&#xff0c;然后删掉上面这个代码 使用SUBF进行发送&#xff0c;TI0代表结束&#xff0c;结束后需要复位 下载、打开串口&#xff0c;设置波特率…

AutoCAD 2022安装及激活

下载好AutoCAD2022安装文件后&#xff0c;直接解压&#xff0c;会看到这个名字的安装文件AutoCAD_2022_Simplified_Chinese_Win_64bit_dlm.sfx&#xff0c;我们双击打开就会进入安装过程。 安装文件需要自解压&#xff0c;我们默认到C盘就可以了&#xff0c;这些文件我们在安装…

exFAT文件系统的目录与文件存储

目录与文件存储的差异 在exFAT文件系统中&#xff0c;目录和文件的存储方式是不同的。 目录和文件都是以簇&#xff08;Cluster&#xff09;为单位进行存储&#xff0c;但它们的数据结构和用途不同。 目录的存储&#xff1a;目录&#xff08;子目录&#xff09;是用于组织和管…

linux入门---多线程的控制

目录标题 线程库pthread_create如何一次性创建多个线程线程的终止线程的等待线程取消分离线程如何看待其他语言支持的多线程线程id的本质线程的局部存储线程的封装 线程库 要想控制线程就得使用原生线程库也可以将其称为pthread库&#xff0c;这个库是遵守posix标准的&#xf…

Servlet 与Spring对比!

前言&#xff1a; Spring相关的框架知识&#xff0c;算是目前公司在用的前沿知识了&#xff0c;很重要&#xff01;&#xff01; 那么以Spring为基础的框架有几个&#xff1f; 以Spring为基础的框架包括若干模块&#xff0c;其中主要的有Spring Framework、Spring Boot、Spring…

三十八、【进阶】最左前缀法则

1、理解 最左前缀法则&#xff0c;如果索引了多列(联合索引)&#xff0c;要遵守最左前缀法则&#xff0c;最左前缀法则是致&#xff0c;查询从索引的最左列开始&#xff0c;并且不跳过索引中的列。 如果跳过某一列&#xff0c;索引将部分失效(该索引后面的字段索引全部失效)。 …

锐捷EG易网关 phpinfo.view.php 信息泄露

致未经身份验证获取敏感信息 访问漏洞url&#xff1a; /tool/view/phpinfo.view.php漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利用此文所提供的信息、技术或方法而造成的任何…

代码签名证书如何申请

代码签名证书也称之为软件数字证书&#xff0c;也可以叫作微软信任证书&#xff0c;主要给软件进行身份确定及保护知识产权&#xff0c;也可以被操作系统给信&#xff0c;对于软件开发企业是一项最基本的产品之一。 代码签名证书分为OV和EV两种类型&#xff0c;虽然认证步骤大同…

爬取抖音用户的个人基本信息

今年夏季&#xff0c;大概七八月份&#xff0c;刀郎开通抖音账号&#xff0c;并在抖音上发布多首作品&#xff0c;一时之间其热度暴涨&#xff0c;其粉丝也是与日俱增。 有人为了蹭热度&#xff0c;直播刀郎粉丝的实时变化情况&#xff0c;直播热度最高的时候同时几千人在线观…

SpringBoot内置工具类之断言Assert的使用与部分解析

先例举一个service的demo中用来验证参数对象的封装方法&#xff0c;使用了Assert工具类后是不是比普通的 if(xxx) { throw new RuntimeException(msg) } 看上去要简洁多了&#xff1f; 断言Assert工具类简介 断言是一个判断逻辑&#xff0c;用来检查不该发生的情况&#xff…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写

红队专题 招募六边形战士队员[1]远控介绍及界面编写1.远程控制软件演示及教程简要说明主程序可执行程序 服务端生成器主机上线服务端程序 和 服务文件管理CMD进程服务自启动主程序主对话框操作菜单列表框配置信息 多线程操作非模式对话框 2.环境&#xff1a;3.界面编程新建项目…

MD5加密后16位与32位的区别 [ 详细 ]

文章目录 前言MD5加密算法说明MD516位和32位有何区别关于MD5的一些常见问题1、使用MD5对密码加密有什么用&#xff1f;2、为什么通过md5.cn在线加解密站还能解出明文呢&#xff1f; 总结 前言 MD5是HASH函数的一种&#xff0c;HASH函数又称杂凑函数&#xff0c;是在信息安全领…