Educational Codeforces Round 49

打edu的比赛确实要轻松多了,但是我真的是死脑筋,C题T了很久,其实不要遍历区间的写法反而短了很多并且一发就过了,但是 我当时一直不愿意去写,真的是。。。

A
判断回文

#include <bits/stdc++.h>
#define cl(a) memset(a,0,sizeof(a))
#define ll long long
#define pb(i) push_back(i)
#define mp make_pair
using namespace std;
const int maxn=1e5+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
ll fpow(ll n, ll k, ll p = mod) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n%p; n = n * n%p;} return r;}
ll inv(ll a, ll p = mod) {return fpow(a, p - 2, p);}
//head
string s;
bool check(int i,int j)
{
    char x,y;
    x=s[i]; y=s[j];
    if(x+1==y+1||x+1==y-1)return true;
    if(x-1==y+1||x-1==y-1)return true;
    else return false;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        int flag=1;
        cin>>s;
        for(int i=0;i<n/2;i++)
        {
            if(!check(i,n-i-1)){flag=0;break;}
        }
        if(flag) puts("YES");
        else puts("NO");
    }
    return 0;
}

B
找规律

#include <bits/stdc++.h>
#define cl(a) memset(a,0,sizeof(a))
#define ll long long
#define pb(i) push_back(i)
#define mp make_pair
using namespace std;
const int maxn=1e5+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
ll fpow(ll n, ll k, ll p = mod) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n%p; n = n * n%p;} return r;}
ll inv(ll a, ll p = mod) {return fpow(a, p - 2, p);}
//head
string s;
ll n,q;
ll res;
ll solve(int x,int y)
{
    ll t = (x-1)/2;
    ll ans = (ll)t*n;
    if((x+y)%2) ans +=res;
    x = x - t*2;
    if(x==1) ans+= (ll)((y-1)/2)+1;
    else if(x==2)
    {
        if(n%2)
        {
            if(y%2) ans+=(n/2)+(y/2)+1;
            else ans+=(n/2)+1+y/2;
        }
        else ans+=(y-1)/2+1+n/2;
    }
   return ans;
}
int main()
{
    cin>>n>>q;
    res = (n*n+1)/2;
    for(int i=1;i<=q;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%I64d\n",solve(x,y));
    }
    return 0;
}

C 数学,求导

#include <bits/stdc++.h>
#define cl(a) memset(a,0,sizeof(a))
#define ll long long
#define pb(i) push_back(i)
#define mp make_pair
using namespace std;
const int maxn=1e6+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
ll fpow(ll n, ll k, ll p = mod) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n%p; n = n * n%p;} return r;}
ll inv(ll a, ll p = mod) {return fpow(a, p - 2, p);}
int a[maxn];
const int maxm=1e4+500;
int cnt[maxn];
int idx=0;
int v[maxm];
int read() {
    int x = 0;
    char c = getchar();
    while (c < '0' || c > '9')c = getchar();
    while (c >= '0' && c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x;
}
int main()
{

    int t;
    scanf("%d",&t);
    while(t--)
    {
        idx=0;
        int n;
        scanf("%d",&n);
        int res=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        sort(a+1,a+1+n);
        int x,y;
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            int k=a[i];
            int p=upper_bound(a+1,a+1+n,k)-lower_bound(a+1,a+1+n,k);
            if(p>=4)
            {
                flag=1;
                printf("%d %d %d %d\n",k,k,k,k);break;
            }
            else if(p>=2)
            {
               v[idx++]=a[i];
            }
            i+=p-1;
        }
        if(flag)continue;
        sort(v,v+idx);
        int len = idx;
        int p0=v[0],q0=v[1];
        for(int i=0;i<len-1;i++)
        {
            //cout<<v[i]<<" ";
            int p =v[i],q=v[i+1];
            if(p*q0>q*p0)
            {
                p0=p;
                q0=q;
            }
        }
        printf("%d %d %d %d\n",p0,p0,q0,q0);
    }
    return 0;
}

D 拓扑排序找环

#include <bits/stdc++.h>
#define cl(a) memset(a,0,sizeof(a))
#define ll long long
#define pb(i) push_back(i)
#define mp make_pair
using namespace std;
const int maxn=2e5+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
ll fpow(ll n, ll k, ll p = mod) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n%p; n = n * n%p;} return r;}
ll inv(ll a, ll p = mod) {return fpow(a, p - 2, p);}
int in[maxn];
int vis[maxn];
ll a[maxn];
int g[maxn];
int n;
ll ans=0;
vector<int>c;
void check(int y)
{
    if(vis[y])return;
    ll res =inf;
    c.push_back(y);
    vis[y]=1;
    int tmp = g[y];
    res =min(a[tmp],a[y]);
    while(!vis[tmp])
    {
        vis[tmp]=1;
        tmp = g[tmp];

        res=min(res,a[tmp]);
    }
    ans+=res;
}
void solve()
{
    queue<int>q;
    for(int i=1;i<=n;i++)
    {
        if(!in[i])
        {
            q.push(i);
        }
    }
    while(!q.empty())
    {
        int tmp=q.front();
        q.pop();
        int son =g[tmp];
        in[son]--;
        if(in[son]==0) q.push(son);
    }
}
int main()
{

    cin>>n;cl(vis);cl(in);
    for(int i=1;i<=n;i++)
    {
        scanf("%I64d",&a[i]);
    }
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        g[i]=x;
        in[x]++;
    }
    solve();
    for(int i=1;i<=n;i++)
    {
        if(in[i])check(i);
    }
    cout<<ans<<endl;
    return 0;
}
### Codeforces Educational Round 26 比赛详情 Codeforces是一个面向全球程序员的比赛平台,其中Educational Rounds旨在帮助参与者提高算法技能并学习新技巧。对于具体的Educational Round 26而言,这类比赛通常具有如下特点: - **时间限制**:每道题目的解答需在规定时间内完成,一般为1秒。 - **内存限制**:程序运行所占用的最大内存量被限定,通常是256兆字节。 - 输入输出方式标准化,即通过标准输入读取数据并通过标准输出打印结果。 然而,关于Educational Round 26的具体题目细节并未直接提及于提供的参考资料中。为了提供更精确的信息,下面基于以往的教育轮次给出一些常见的题目类型及其解决方案思路[^1]。 ### 题目示例与解析 虽然无法确切描述Educational Round 26中的具体问题,但可以根据过往的经验推测可能涉及的问题类别以及解决这些问题的一般方法论。 #### 类型一:贪心策略的应用 考虑一个问题场景,在该场景下需要照亮一系列连续排列的对象。假设存在若干光源能够覆盖一定范围内的对象,则可以通过遍历整个序列,并利用贪心的思想决定何时放置新的光源以确保所有目标都被有效照射到。这种情况下,重要的是保持追踪当前最远可到达位置,并据此做出决策。 ```cpp #include <bits/stdc++.h> using namespace std; bool solve(vector<int>& a) { int maxReach = 0; for (size_t i = 0; i < a.size(); ++i) { if (maxReach < i && !a[i]) return false; if (a[i]) maxReach = max(maxReach, static_cast<int>(i) + a[i]); } return true; } ``` #### 类型二:栈结构处理匹配关系 另一个常见问题是涉及到成对出现元素之间的关联性判断,比如括号表达式的合法性验证。这里可以采用`<int>`类型的栈来记录左括号的位置索引;每当遇到右括号时就弹出最近一次压入栈底的那个数值作为配对依据,进而计算两者间的跨度长度累加至总数之中[^2]。 ```cpp #include <stack> long long calculateParens(const string& s) { stack<long long> positions; long long num = 0; for(long long i = 0 ; i<s.length() ;++i){ char c=s[i]; if(c=='('){ positions.push(i); }else{ if(!positions.empty()){ auto pos=positions.top(); positions.pop(); num+=i-pos; } } } return num; } ``` #### 类型三:特定模式下的枚举法 针对某些特殊条件约束下的计数类问题,如寻找符合条件的三位整数的数量。此时可通过列举所有可能性的方式逐一检验是否符合给定规则,从而统计满足要求的结果数目。例如求解形如\(abc\)形式且不含重复数字的正整数集合大小[^3]。 ```cpp vector<int> generateSpecialNumbers(int n) { vector<int> result; for (int i = 1; i <= min(n / 100, 9); ++i) for (int j = 0; j <= min((n - 100 * i) / 10, 9); ++j) for (int k = 0; k <= min(n % 10, 9); ++k) if ((100*i + 10*j + k)<=n&&!(i==0||j==0)) result.emplace_back(100*i+10*j+k); sort(begin(result), end(result)); return result; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值