Codeforces Round 959(Div. 1 + Div. 2) A~E

Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2) 阅读详情

A.Diverse Game(构造)

题意:

佩特看了谢尔盖的数据流,得出了一个矩阵aaa,由nnn行和mmm列组成(第iii行和第jjj列中的数字表示为ai,ja_{i,j}ai,j​),其中包含了从111到n⋅mn\cdot mn⋅m的所有整数。但是他并不喜欢这样的数字排列,现在他想出一个新的矩阵bbb,由nnn行和mmm列组成,同样包含从111到n⋅mn\cdot mn⋅m的所有整数,这样对于任意的1≤i≤n,1≤j≤m1\leq i\leq n,1\leq j\leq m1≤i≤n,1≤j≤m来说,ai,j≠bi,ja_{i,j}\ne b_{i,j}ai,j​=bi,j​都成立。

给你一个矩阵aaa,请构造出符合Petr要求的矩阵bbb,或者确定这是不可能的。

分析:

题目要求构造一个大小为n×mn\times mn×m且每个元素都与原排列不同的排列,直接让每个元素模n×mn\times mn×m再加111即可

代码:

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
int n, m;

void solve(){
    scanf("%d%d", &n, &m);
    if(n==1 and m==1){
        scanf("%*d");
        printf("-1\n");
        return;
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            int x;
            scanf("%d",&x);
            printf("%d%c", x % (n * m) + 1, " \n"[j == m]);
        }
    }
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--)
        solve();
    return 0;
}

B.Fun Game(异或)

题意:

沃瓦非常喜欢异或运算(表示为⊕\oplus⊕)。最近,他在睡觉时想出了一个有趣的游戏。

游戏开始时,沃瓦选择长度为nnn的两个二进制数列sss和ttt并把它们交给凡亚。二进制序列是仅由数字000和111组成的序列。凡亚可以选择整数l,rl,rl,r这样的1≤l≤r≤n1\leq l\leq r\leq n1≤l≤r≤n,并同时将所有l≤i≤rl\leq i\leq rl≤i≤r中的sis_isi​替换为si⊕si−l+1s_i\oplus s_{i-l+1}si​⊕si−l+1​,其中sis_isi​是序列sss的第iii个元素。

为了使游戏有趣,必须有获胜的可能性。如果在无限次的操作中,瓦尼亚能够从序列sss中得到序列ttt,那么他就赢了。判断序列sss和ttt的对局是否有趣。

分析:

我们先考虑极端情况,比如l=rl=rl=r的时候,sis_isi​被赋值为si⊕s1s_i\oplus s_1si​⊕s1​。如果s1=1s_1=1s1​=1,那么可以做到单点修改所有的数,答案肯定是yesyesyes。

基于这种思路,我们寻找AAA序列里第一个111,记其位置为xxx。构造操作(i−x+1,i)(i−x+1,i)(i−x+1,i),发现si−x+1,i−x+2,...,is_{i−x+1,i−x+2,...,i}si−x+1,i−x+2,...,i​分别异或上了s1,2,...xs_{1,2,...x}s1,2,...x​。因为xxx是AAA中第一个111,所以我们发现这就是只改一个数的理想操作。

然后把所有可改位置及Ax,x+1,...,nA_{x,x+1,...,n}Ax,x+1,...,n​标注出来,进行判断即可。

代码:

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const LL N=2e5+5;
LL n,m;
char a[N];
char b[N];
bool flag[N];

void solve() {
	cin>>n;
	cin>>a+1>>b+1;
	for(LL i=1;i<=n;i++) {
		flag[i] = 0;
	}
	for(LL i=1;i<=n;i++) {
		if(flag[i-1])
			flag[i]=1;
		if(a[i]=='1')
			flag[i]=1;
	}
	for(LL i=1;i<=n;i++) {
		if(a[i]!=b[i] && flag[i]==0) {
			cout<<"No"<<endl;
			return;
		}
	}
	cout<<"Yes"<<endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
	int t;
	cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

C.Hungry Games(二分)

题意:

雅罗斯拉夫正在玩一款电脑游戏,在其中一个关卡中,他遇到了nnn个排列成一排的蘑菇。每种蘑菇都有自己的毒性级别;从一开始的第iii个蘑菇的毒性级别为aia_iai​。雅罗斯拉夫可以选择两个整数1≤l≤r≤n1\le l\le r\le n1≤l≤r≤n,然后他的角色会从左到右轮流逐个吃掉这个分段中的蘑菇,也就是数字为l,l+1,l+2,…,rl,l+1,l+2,\ldots,rl,l+1,l+2,…,r的蘑菇。

角色的毒性等级为ggg,初始值等于000。电脑游戏由数字xxx定义–任何时候的最大毒性级别。当食用毒性等级为kkk的蘑菇时,会发生以下情况:

  1. 角色的毒性等级会增加kkk。
  2. 如果g≤xg\leq xg≤x,进程继续;否则,ggg变为零,进程继续。

雅罗斯拉夫感兴趣的是,有多少种方法可以选择lll和rrr的值,从而使ggg的最终值不为零。请帮助雅罗斯拉夫找到这个数字!

分析:

预处理从每个位置向后走到哪个位置刚好没被清零,记为g(i)g(i)g(i)。然后进行动态规划,设f(i)f(i)f(i)表示从iii向后走存在多少个sum>0sum>0sum>0的情况。

易得转移方程f(i)=f(g(i)+2)+(g(i)−i+1)f(i)=f(g(i)+2)+(g(i)−i+1)f(i)=f(g(i)+2)+(g(i)−i+1),倒着转移可以在O(n)O(n)O(n)内完成。

代码:

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const LL N = 2e5 + 5;
LL n,x;
LL s[N],a[N],g[N],f[N];

LL query(LL l,LL r) {
	return s[r]-s[l-1];
}

void init() {
	for (LL i = 1; i <= n; i++) {
		LL l=i,r=n;
		LL ans=i-1;
		while(l<=r) {
			LL mid=l+r>>1;
			if(query(i, mid) <= x) {
				ans=mid;
				l = mid + 1;
			} 
			else{
				r = mid - 1;
			}
		}
		g[i]=ans;
	}
}

void solve() {
	cin>>n>>x;
	for(LL i=1;i<=n;i++) {
		cin>>a[i];
		s[i]=s[i-1]+a[i];
	}
	init();
	f[n+1]=0;
	f[n+2]=0;
	LL ans=0;
	for(LL i=n;i;i--) {
		f[i]=(g[i]-i+1)+f[g[i]+2];
		ans+=f[i];
	}
	cout<<ans<<endl;
}

int main() {
	int t;
	cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

D.Funny Game(思维)

题意:

万尼亚有一个包含nnn个顶点(编号从111到nnn)和aaa个数组(包含nnn个整数)的图;最初,图中没有边。万尼亚觉得无聊,为了找点乐子,他决定进行n−1n-1n−1次操作。

操作数xxx(操作数从111开始依次编号)如下:

  • 选择222个不同的数1≤u,v≤n1\leq u,v\leq n1≤u,v≤n,使得∣au−av∣|a_u-a_v|∣au​−av​∣可以被xxx整除。
  • 在顶点uuu和vvv之间添加一条无向边。

使用n−1n-1n−1次操作帮助万尼亚得到一个连通图,或者确定这是不可能的。

分析:

因为只能连n−1n−1n−1条边,每次连边必须选择两个不同连通块的点连接。将操作倒序考虑,第xxx次操作时图中有x+1x+1x+1个连通块,在每个连通块中选择一个点,则根据抽屉原理,这x+1x+1x+1个点中一定有两个点满足ai≡aj(mod  x)a_i≡a_j(\mod x)ai​≡aj​(modx)。因此一定有解,只需将连接的点记录并顺序输出。

代码:

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;

const int N=2005;
int n,a[N],z[N],mod[N],ans[N][2];
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
        z[i]=1;
    }
	cout<<"YES"<<endl;
	for(int x=n-1;x>=1;x--){
		for(int i=1;i<=n;i++){
			if(z[i]){
				if(mod[a[i]%x]>0){
					ans[x][0]=i;
					ans[x][1]=mod[a[i]%x];
					z[i]=0;
					break;
				}
				mod[a[i]%x]=i;
			}			
		}
		for(int i=0;i<x;i++)
			mod[i]=0;
	}
	for(int i=1;i<n;i++)
	    cout<<ans[i][0]<<" "<<ans[i][1]<<endl;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
	int T;
    cin>>T;
	while(T--)
		solve();
    return 0;
}

E.Wooden Game(思维)

题意:

有一片森林,里面有kkk棵有根的树木∗^{\text{∗}}∗。伐木工蒂莫菲想通过以下操作砍伐整片森林:

  • 选择其中一棵树的任意顶点的子树†^{\text{†}}†,并将其从树中移除。

蒂莫菲喜欢位运算,因此他希望删除的子树的大小的按位或结果为最大值。请帮助他,找出他能得到的最大结果。

∗^{\text{∗}}∗树是没有循环、循环或多条边的连通图。在有根的树中,选定的顶点称为根。森林是一棵或多棵树的集合。

†^{\text{†}}†顶点vvv的子树是vvv位于该顶点到根的最短路径上的顶点集合,包括vvv本身。

分析:

观察发现,对于一棵大小为xxx的树可以随便删叶子,将删去整棵树的贡献调整为任意v∈[1,x]v∈[1,x]v∈[1,x]。对于按位或操作,发现对于一棵树若将其拆成多部分进行贡献,均可以转化成先删叶子再把整棵树全部删掉的形式,即树的形态不需要考虑,仅需考虑xxx即可。

考虑当前枚举到第iii棵树,使用前i−1i−1i−1棵树使得答案最大变成了sss。考虑拆位,从高位向低位检查第iii棵树的贡献,分情况进行讨论:

  • 若xxx该位为000则跳过。
  • 若xxx该位为111,sss该位为000,则应当保留该位的贡献使得sss中该位变为111,即不断删叶子后该位及更高位应当保留。
  • 若xxx该位为111,sss该位为111,则该位的贡献已经获得,此时一种最优的操作方案是不断删叶子,直至刚好删去该位将xxx的后面所有位均变为111,从而使sss中该位之后的所有位均变为111。此时即可结束。

代码:

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int N=1e6+5;
int k,s[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int T; 
    cin>>T;
    while(T--){
        cin>>k;
        for(int i=1;i<=k;++i) {
            cin>>s[i];
            for(int j=1,x;j<s[i];++j)
                cin>>x;
        }
        sort(s+1,s+k+1);
    
        int ans=0;
        for(int i=k;i;--i) {
            for(int j = 21; j >= 0; -- j) {
                int x = ans >> j & 1;
                int y = s[i] >> j & 1;
                int pow2 = 1 << j;
                if (y == 0) 
                    continue;
                if (x == 0) {
                    ans |= pow2;
                } 
                else {
                    ans |= pow2 - 1;
                    break;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

别再只会插拔了!深入Linux内核,手把手调试USB热插拔中断(以高通平台为例) 本文深入探讨了Linux内核中USB热插拔中断的调试方法,特别针对高通平台提供了详细的实战指南。从硬件基础到内核机制,再到中断调试工具和常见问题排查,帮助开发者系统性地解决USB设备识别问题。通过监控中断状态、分析处理流程和高级调试技巧,提升USB热插拔的稳定性和性能。 阅读详情

相关推荐

大模型事件抽取学习——论文学习笔记《LLMs Learn Task Heuristics from Demonstrations:......》

本篇博客介绍一篇发表在2024 ACL main上的文章:《LLMs Learn Task Heuristics from Demonstrations: A Heuristic-Driven Prompting Strategy for Document-Level Event Argument Extraction》 方向:大模型事件抽取 本篇博客为个人阅读论文的总结与笔记,在这里进行简单的分享 论文链接:https://arxiv.org/abs/

weixin_53751318的博客 1852

Codeforces Round 959(Div. 1 + Div. 2)A~C

差点爆零了,最近div2打的越来越艰难了,好多不会累死,脑子完全不够用,上次div3刚上的绿就掉了。

小白的博客 1010

AI智能体Codex实战:外贸客户开发自动化,85家精准客户深度分析

如果你在外贸行业,特别是工业品领域,一定遇到过这样的困境:想开发海外客户,但不知道从何下手。Google搜索出来的要么是B2B平台上的老面孔,要么是信息残缺的过时黄页。手动筛选、整理、验证,一个客户信息就要花上半小时,效率低得让人抓狂。 更头疼的是,好不容易找到一些公司名称,却不知道他们的采购决策人是谁、公司规模如何、业务是否匹配。传统的客户开发就像大海捞针,投入大量时间成本,回报却充满不确定性。 今天要介绍的这个工具,可能会彻底改变你的工作流。它不是另一个CRM软件,而是一个基于AI的智能客户开发与情报分

weixin_29054399的博客 346

Codeforces Round 959 (Div. 1 + Div. 2 ABCDEFG 题) 文字讲解+视频讲解

Codeforces Round 959 (Div. 1 + Div. 2 ABCDEFG 题) 文字讲解+视频讲解

Edward Shi的博客 1130

泛微OAe9实战:如何从零搭建一个车辆预约系统(附完整代码)

本文详细介绍了如何利用泛微OA e9的建模引擎,从零开始构建一个企业级车辆预约管理系统。文章深入解析了核心数据模型设计、前后端双重预约冲突校验机制,并重点演示了如何配置自定义资源看板以实现车辆使用状态的可视化监控。该系统设计思路通用,可扩展至会议室、设备等各类共享资源的管理。

weixin_28363123的博客 142

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

wgl307293845的博客 2079

Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)解题报告(A-C)

链接:题目大意:将所给矩阵进行变换为一个与原矩阵不同的矩阵解题思路:每行矩阵的值都右移一位,如果每行都只有一个值,则每列下移一位。

2301_79876716的博客 1384

光学设计仿真软件:Code V_(8).场曲和色差校正

通过以上步骤和代码示例,用户可以更好地理解如何在Code V中进行场曲和色差的校正。这些技术不仅有助于提高光学系统的成像质量,还可以为后续的光学设计提供重要的参考。在实际应用中,用户可以根据具体需求选择合适的校正方法和优化策略,以达到最佳设计效果。

kkchenjj的博客 1784

Codeforces Round 959

Codeforces Round 959

青少年趣味编程 631

Codex 接入自定义大模型终极教程:插件解锁、会话管理、国产模型一键搞定

🚀 Codex 默认只能使用 OpenAI 官方模型?这篇文章带你从零接入 DeepSeek、通义千问、GLM 等国产大模型,并彻底解锁插件、会话删除、多模型切换等隐藏功能。配置原理、常见坑点、傻瓜式增强工具分享,小白也能轻松上手!🔥

XiaoqiangClub的博客 3144

【笔记篇】Davinci Configurator OS模块(上)

主要讲解了AUTOSAR OS配置项和Vector MICROSAR OS的特性

weixin_47571898的博客 2273

Codeforces Round 959 (Div. 1 + Div. 2) C. Hungry Games题解

ACM、Codeforces、DP、Algorithm

Nsy1448361880的博客 912

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2) (个人题解)(未完成)

前言:这是本人参加的第一场cf比赛吧,之前对Codeforces这个平台早有耳闻,也一直有想试一试的想法,但由于这种比赛的阴间时间我一直没有啥机会(试问晚十一点断电断网的学校怎么打这比赛),不过方法总比困难多,想打总是有办法打的,以后我也打算长期打一打这个比赛,希望借此锻炼自己的能力吧!正文:

Wzh20060111的博客 730

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Codeforces Round 959 (Div. 1 + Div. 2) A题-C题

讲解都在视频里(❁´◡`❁)

Xyrsis的博客 330

Codeforces Round 999

Codeforces Round 999

青少年趣味编程 834

Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2) 20240718 A B

彼得看着谢尔盖的流,想出了一个矩阵a,由n行和m列组成(i第一行和j第列中的数字表示为aij​),它包含了从1到n⋅m的所有整数。但是他不喜欢这些数字的排列,现在他想要提出一个新的矩阵b,由n行和m列组成,它也将包含从1到n⋅m的所有整数,这样对于任何1≤i≤n1≤j≤m它都包含aij​bij​。给定矩阵a,构造任意满足彼得要求的矩阵b,或者确定它是不可能的。快点!否则,他会把所有的钱都捐给小溪来寻找问题的答案。输入。

2302_80423900的博客 1228

Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2) VP

首先我们枚举左端点为l的贡献,我们二分出来第一个从i---j的sum>x的j的位置,这样j不可以选,但是j前面到i的都是答案,而我们发现从j开始变成了0,我们再考虑j+1,j+2...n,因为在j的位置重置为0,因此其答案就是以j+1为左端点的答案,因此我们令dp[i]表示以i为左端点的贡献即可。首先由鸽巢原理:n个数,%(n-1)一定有两个一样,于是我们把那个联通,此时剩下n-1个连通块,对于%n-2,一定有两个连通块可以相连,依次类推,最终一定可以变成树。

cocoack的博客 368

Codeforces Round #473 (Div. 2) Solution

又是只\(A\)了四题...\(\rm E,F\)都很水但是开\(\rm vp\)的时候脑子抽掉了一直在想\(\rm F\)的\(\rm fwt\)做法就没时间了.... Codeforces Round #473 (Div. 2) Solution 比赛链接:https://codeforc.es/contest/959 题目链接就不放了 才不是因为懒 A. Mahmoud and Ehab a...

weixin_30414245的博客 116

codeforces round 959(A~C)

codeforces 周赛题解A~C

jzka666zh的博客 798

D. Funny Game (Codeforces Round 959)

D. Funny Game (Codeforces Round 959)

KyLen_Mou的博客 1353

Codeforces(951-1000)

Codeforces(951-1000)

青少年趣味编程 1549

A. XORwice(思维)Codeforces Round #676 (Div. 2)

原题链接: https://codeforces.com/contest/1421/problem/A 测试样例 input 6 6 12 4 9 59 832 28 14 4925 2912 1 1 output 10 13 891 18 6237 0 Note For the first test case Sana can choose x=4 and the value will be(6⊕4)+(12⊕4)=2+8=10(6⊕4) + (12⊕4) = 2+8 = 10(6⊕4)+(12⊕

pursuit的博客 636

Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2) C. Hungry Games

主要思路:找前缀和第一次大于k的下标idx(二分),然后我们发现idx+1的方案数相当于把idx+1当作左端点来算,然后我们就想到dp[i]代表以i为左端点的方案数。总结:在比赛的时候找到了idx,但是因为没有想到用dp来表示,所以是一直递归下去,然后因为一些边界问题还是没有写出来。一般这种区间的问题,就是以左端点或者右端点为起点,然后在较小的时间复杂度内找到符合条件的区间数。ps:本题因为需要用到后面的状态,所以我们从后往前二分来做。本题大意就是找到最后g不等于0的区间个数。

m0_74067861的博客 428

Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2) <一维表示二维>

【代码】Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2) <一维表示二维>

2402_82371019的博客 282
上一篇: Codeforces Round #956 (Div. 2) A~E
下一篇: AtCoder Beginner Contest 364 A~F
AC-Panda
博客等级 码龄5年 1736粉丝 191原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值