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的主要内容,如果未能解决你的问题,请参考以下文章