Codeforces Round 827 (Div. 4)

D
注意到 a i a_i ai 的范围在 1000 以内,开一个桶把数量存下来暴力判断即可,这样就把 2 e 5 2e5 2e5 个数的运算量缩小到了 1 e 3 1e3 1e3 n 2 n^2 n2 暴力即可。

#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
   
using namespace std;
using ll = long long;

const int maxn = 1005;
int cnt[maxn];

void solve()
{
    memset(cnt,0,sizeof(cnt));
    int n; cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x; cin>>x;
        cnt[x]=i;
    }
    int ans=-1;
    for(int i=1;i<=1000;i++)
    {
        for(int j=1;j<=1000;j++)
        {
            if(cnt[i]&&cnt[j])
            {
                if(__gcd(i,j)==1)
                {
                    ans=max(abs(cnt[j]+cnt[i]),ans);
                }
            }
        }
    }
    cout<<ans<<endl;
    return ;
}

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

E
找到最多可以到的那个台阶即可,我们维护一个前缀最大值的数组,再维护一个前缀和,二分找到位置直接输出即可。

#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
   
using namespace std;
using ll = long long;

const int maxn = 2e5+3;
int a[maxn];
int n,t,k; 
ll prefix[maxn];
int premax[maxn];

void solve()
{
    cin>>n>>t;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    for(int i=1;i<=n;i++)
    premax[i]=max(premax[i-1],a[i]);
    for(int i=1;i<=n;i++)
    prefix[i]=prefix[i-1]+a[i];
    ll ans;
    while(t--)
    {
        cin>>k;
        ans=upper_bound(premax+1,premax+1+n,k)-premax;
        cout<<prefix[ans-1]<<" ";
    }   
    cout<<endl;
}

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

F
只要 t 追加了除了 a 以外的任何字符,将 s 的第一个放 a,t 的第一个放不是 a 的一定可以满足。在 t 没有出现大于 a 的字符但 s 出现时,无论怎么排列 s 一定会大于 t,此时输出 N O NO NO ,剩下的情况就是 s 和 t 全部由 a 构成,判断大小即可。

#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
   
using namespace std;
using ll = long long;

void solve()
{
    int n; cin>>n;
    int op,k;
    string s="a",t="a";
    ll lens=1,lent=1;
    string x;
    int siga=0,sigb=0;
    for(int i=1;i<=n;i++)
    {
        cin>>op>>k>>x;
        if(op==1)
        {
            if(!siga)
            {
                for(auto q:x)
                {
                    if(q!='a') siga=1; 
                }
            }
            lens+=k*x.length();
        }
        else 
        {
            if(!sigb)
            {
                for(auto q:x)
                {
                    if(q!='a')
                    {
                        sigb=1;
                        break;
                    }
                }
                lent+=k*x.length();
            }
        }
        // cout<<siga<<" "<<sigb<<"-------"<<endl;
        if(sigb)  
        {
            cout<<"YES"<<endl;
        } 
        else if(siga) 
        {
            cout<<"NO"<<endl;
        }
        else 
        {
            if(lens<lent) 
            cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
    }
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T; cin>>T;
    while(T--)
    solve();
    return 0;
}
### Codeforces Round 927 Div. 3 比赛详情 Codeforces是一个面向全球程序员的比赛平台,定期举办不同级别的编程竞赛。Div. 3系列比赛专为评级较低的选手设计,旨在提供更简单的问题让新手能够参与并提升技能[^1]。 #### 参赛规则概述 这类赛事通常允许单人参加,在规定时间内解决尽可能多的问题来获得分数。评分机制基于解决问题的速度以及提交答案的成功率。比赛中可能会有预测试案例用于即时反馈,而最终得分取决于系统测试的结果。此外,还存在反作弊措施以确保公平竞争环境。 ### 题目解析:Moving Platforms (G) 在这道题中,给定一系列移动平台的位置和速度向量,询问某时刻这些平台是否会形成一条连续路径使得可以从最左端到达最右端。此问题涉及到几何学中的线段交集判断和平面直角坐标系内的相对运动分析。 为了处理这个问题,可以采用如下方法: - **输入数据结构化**:读取所有平台的数据,并将其存储在一个合适的数据结构里以便后续操作。 - **时间轴离散化**:考虑到浮点数精度误差可能导致计算错误,应该把整个过程划分成若干个小的时间间隔来进行模拟仿真。 - **碰撞检测算法实现**:编写函数用来判定任意两个矩形之间是否存在重叠区域;当发现新的连接关系时更新可达性矩阵。 - **连通分量查找技术应用**:利用图论知识快速求解当前状态下哪些节点属于同一个集合内——即能否通过其他成员间接相连。 最后输出结果前记得考虑边界条件! ```cpp // 假设已经定义好了必要的类和辅助功能... bool canReachEnd(vector<Platform>& platforms, double endTime){ // 初始化工作... for(double currentTime = startTime; currentTime <= endTime ;currentTime += deltaT){ updatePositions(platforms, currentTime); buildAdjacencyMatrix(platforms); if(isConnected(startNode,endNode)){ return true; } } return false; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值