【codeforces】Codeforces Round #276 (Div. 2) 题解

本文详细解析了Codeforces Round #276(Div.2)中的四道题目,包括A.485AFactory、B.485BValuableResources、C.485CBits和D.485DMaximumValue的解题思路和代码实现。文章涵盖了从模运算、循环判断、最大值求解、位运算等多个知识点,适合初学者和中级程序员学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门:Codeforces Round #276 (Div. 2)


A.485A Factory

按照题目规则改变a,a大于m时没意义,所以对m取模,根据题意,当a变化时变回到以前出现过的a时,说明出现循环,无解,否则会一直进行到出现a%m==0为止。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;

typedef long long LL ;

#define rep( i , a , b ) for ( int i = ( a ) ; i <  ( b ) ; ++ i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define travel( e , H , u ) for ( Edge* e = H[u] ; e ; e = e -> next )
#define clr( a , x ) memset ( a , x , sizeof a )

const int MAXN = 100005 ;

int vis[MAXN] ;
int a , m ;

void solve () {
    clr ( vis , 0 ) ;
    int ok = 0 ;
    while ( 1 ) {
        if ( a % m == 0 ) {
            ok = 1 ;
            break ;
        } else if ( vis[a % m] ) break ;
        vis[a % m] = 1 ;
        a = ( a + a % m ) % m ;
    }
    printf ( ok ? "Yes\n" : "No\n" ) ;
}

int main () {
    while ( ~scanf ( "%d%d" , &a , &m ) ) solve () ;
    return 0 ;
}


B.485B Valuable Resources

ans = max(maxx - minx , maxy - miny )^ 2。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;

typedef long long LL ;

#define rep( i , a , b ) for ( int i = ( a ) ; i <  ( b ) ; ++ i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define travel( e , H , u ) for ( Edge* e = H[u] ; e ; e = e -> next )
#define clr( a , x ) memset ( a , x , sizeof a )

const int INF = 0x3f3f3f3f ;

int n ;

void solve () {
    LL minx = INF , miny = INF ;
    LL maxx = -INF , maxy = -INF ;
    LL x , y ;
    For ( i , 1 , n ) {
        scanf ( "%I64d%I64d" , &x , &y ) ;
        minx = min ( minx , x ) ;
        maxx = max ( maxx , x ) ;
        miny = min ( miny , y ) ;
        maxy = max ( maxy , y ) ;
    }
    LL ans = max ( maxx - minx , maxy - miny ) ;
    printf ( "%I64d\n" , ans * ans ) ;
}

int main () {
    while ( ~scanf ( "%d" , &n ) ) solve () ;
    return 0 ;
}


C.485C Bits

从l的最低位开始每位挨个填1直到l>r为止,这样一定是1个数最多的且最小的,比这个1多的肯定不存在,剩下的都是比他大的。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;

typedef long long LL ;

#define rep( i , a , b ) for ( int i = ( a ) ; i <  ( b ) ; ++ i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define travel( e , H , u ) for ( Edge* e = H[u] ; e ; e = e -> next )
#define clr( a , x ) memset ( a , x , sizeof a )

LL l , r ;
int n ;

void solve () {
    scanf ( "%I64d%I64d" , &l , &r ) ;
    //LL ans = 0 ;
    rep ( i , 0 , 63 ) {
        if ( ( l | ( 1LL << i ) ) <= r ) {
            l |= ( 1LL << i ) ;
        }
    }
    printf ( "%I64d\n" , l ) ;
}

int main () {
    int T ;
    scanf ( "%d" , &T ) ;
    while ( T -- ) solve () ;
    return 0 ;
}


D.485D Maximum Value

我们可以对每个数ai的所有倍数,找从左端靠近的最接近这个倍数的数aj,同时要满足aj>ai,然后更新ans = max (ans,aj%ai)。

我们可以预处理出1~2000000内每个数x从左端靠近的最接近这个数的数,类似递推:

nearest[i] = hash[i - 1] ? i - 1 : nearest[i - 1]。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;

#define rep( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define For( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define rev( i , a , b ) for ( int i = a ; i >= b ; -- i )
#define clr( a , x ) memset ( a , x , sizeof a )

const int MAXN = 1000005 ;

int nearest[MAXN << 1] ;
bool hash[MAXN << 1] ;
int n ;

void solve () {
	int x , ans = 0 ;
	clr ( hash , 0 ) ;
	clr ( nearest , 0 ) ;
	For ( i , 1 , n ) {
		scanf ( "%d" , &x ) ;
		hash[x] = 1 ;
	}
	For ( i , 1 , 2000000 ) {
		if ( hash[i - 1] ) nearest[i] = i - 1 ;
		else nearest[i] = nearest[i - 1] ;
	}
	For ( i , 2 , 1000000 ) if ( hash[i] && ans < i - 1 ) {
		for ( int j = i + i ; j < 1000000 + i ; j += i ) {
			if ( nearest[j] > i ) {
				ans = max ( ans , nearest[j] % i ) ;
				if ( ans == i - 1 ) break ;
			}
		}
	}
	printf ( "%d\n" , ans ) ;
}

int main () {
	while ( ~scanf ( "%d" , &n ) ) solve () ;
	return 0 ;
}


### 关于Codeforces Round 704 Div. 2 的信息 对于Codeforces Round 704 Div. 2的比赛,虽然未直接提及具体题目解析或参赛体验的内容,但是可以根据平台的一贯风格推测该轮比赛同样包含了多种算法挑战。通常这类赛事会涉及数据结构、动态规划、图论等方面的知识。 考虑到提供的参考资料并未覆盖到此特定编号的比赛详情[^1],建议访问Codeforces官方网站查询官方题解或是浏览社区论坛获取其他选手分享的经验总结。一般而言,在赛后不久就会有详细的解答发布出来供学习交流之用。 为了帮助理解同类型的竞赛内容,这里提供了一个基于过往相似赛事的例子——如何通过居中子数组特性来解决问题的方法: ```cpp // 假设有一个函数用于处理给定条件下的数组恢复问题 vector<int> restoreArray(vector<vector<int>>& adjacentPairs) { unordered_map<int, vector<int>> adj; for (auto& p : adjacentPairs){ adj[p[0]].push_back(p[1]); adj[p[1]].push_back(p[0]); } int start = 0; for(auto& [num, neighbors] : adj){ if(neighbors.size() == 1){ start = num; break; } } vector<int> res(adjacentPairs.size() + 1); unordered_set<int> seen; function<void(int,int)> dfs = [&](int node, int idx){ seen.insert(node); res[idx] = node; for(auto next : adj[node]){ if(!seen.count(next)){ dfs(next, idx + 1); } } }; dfs(start, 0); return res; } ``` 上述代码展示了利用深度优先搜索(DFS)重建原始序列的一种方式,这与某些情况下解决Codeforces比赛中遇到的问题思路相吻合[^4]。 #### 注意事项 由于缺乏针对Codeforces Round 704 Div. 2的具体材料支持,以上解释更多依赖于对同类活动的理解以及编程技巧的应用实例来进行说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值