div3 C D F

Posted 钟钟终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了div3 C D F相关的知识,希望对你有一定的参考价值。

https://codeforces.com/contest/1538/problem/C

C
又忘记使用lower_bound()和upper_bound()
1.统计l-a[i]r-a[i]的个数,对于每a[i]进行累加。
2.
lower_bound找到第一个大于等于l-a[i]的坐标;
upper_bound找到第一个大于r-a[i]的坐标;
两者做差,正好为满足条件的个数。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn=2e5+5;
int a[maxn];
int main()
{
    int t;cin>>t;
    while(t--)
    {
       int n,l,r;
       cin>>n>>l>>r;
       for(int i=0;i<n;i++)
        cin>>a[i];
       sort(a,a+n);
      ll sum=0;
      for(int i=0;i<n;i++)
      {
          int ll=lower_bound(a+i+1,a+n,l-a[i])-a;
          int rr=upper_bound(a+i+1,a+n,r-a[i])-a;
          sum+=rr-ll;
      }
        cout<<sum<<endl;
    }
    return 0;
}

D
真服了,思路挺简单的。但给的数据太强,总是超时。
关键在于:模拟一下一个数最多能被整除几次

#include <bits/stdc++.h>

using namespace std;
bool judge(int q)
{
    int i;
    for(i=2;i<=sqrt(q);i++)
    {
        if(q%i==0) break;
    }
    if(i>sqrt(q)) return 1;
    else
        return 0;
}
int go(int a)
{
    int num1=0;
            for(int i=2;i*i<=a;i++)
            {
                    while(a%i==0)
                    {
                        a=a/i;
                        num1++;
                        if(a==1) break;
                    }
            }
            if(a>1) num1++;
            return num1;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int a,b,k;
        cin>>a>>b>>k;
       if(k==1&&(a%b==0||b%a==0)&&a!=b)
       {
           cout<<"YES"<<endl;
           continue;
       }
       int num1=go(a),num2=go(b);
      //cout<<num1<< " "<<num2<<endl;
       if(num1+num2>=k&&k>=2)
        cout<<"YES"<<endl;
       else
        cout<<"NO"<<endl;
    }
    return 0;
}

F
思维题。改变到10变化2位数字,改变到100变化三位数字,109变化到110改变两位数字。
1.先统计至少要进行多少次变化,不考虑具体变化情况。
2.
统计进行两次变化的有多少个,累加上;(注意不要重复计算)
统计进行三次变化的有多少个,再累加
……

#include <iostream>

using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int l,r;
        cin>>l>>r;
        long long tmp=r-l;
        while(l||r)
        {
            l/=10;
            r/=10;
            tmp+=r-l;
        }
        cout<<tmp<<endl;
    }
    return 0;
}

以上是关于div3 C D F的主要内容,如果未能解决你的问题,请参考以下文章

PHP 代码片段

cf1234-div3

# 756 div3 E1 E2(dfs F(双指针

D.polycarp and div3

树的直径| CF#615Div3 F. Three Paths on a Tree

思维题(取模)| CF#615Div3 D.MEX maximizing