1424G
题意:有n个人,每个人都有出生和死亡时间,求存活人数最多的年份,
以及存活人数;
题解:假如一个人在b—d-1存活,在b——d-1标记成1,这里可以使用差分数组,给一个区间进行加减;由于年份可能非常大,因此使用map存储;
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
#define x first
#define y second
int main(){
int n;
cin>>n;
int b,d;
map<int,int> mp;
for(int i=1;i<=n;i++){
cin>>b>>d;
mp[b]++;
mp[d]--;
}
int year;
int sum=0,ans=0;
for(auto i:mp){
sum+=i.y;//前缀和;
if(ans<sum){
ans=sum;
year=i.x;
}
}
cout<<year<<' '<<ans<<endl;
return 0;
}
1424J
题意:
假如两个不同数字a,b,使得gcd(a,b) ,a/gcd(a,b) ,b/gcd(a,b)这三个能够组成一个三角形,则称这两个数是友好的;
找1~n中与任何一个数都不友好的数的个数;
题解:
首先考虑两个质数,gcd(a,b)=1,则要求a,b,1,组成一个三角形,因为a,b互质,所以a,b至少相差1,所以两个质数是一定不是友好的; 然后看一个质数,一个合数的情况,令gcd(a,b)=x;则要求x,1,k,这三个数组成三角形,通过联立不等式可得k只能等于x,即两个数是x,x*x; 最后看合数,合数,合数一定能够被分解成若干个因数相乘;并且这个因数是合数之前存在的,只要这个合数是这个因数的平方即可,这时候因数和这个合数都是友好数字;
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 2000010;
int prime[N];
bool st[N];
int s[N];
void isprime() {
int cnt = 0;
for (int i = 2; i <= N; i++) {//质数筛
if (!st[i]) prime[cnt++] = i;
for (int j = 0; prime[j] <= N / i; j++) {
st[prime[j]*i] = true;
if (i % prime[j] == 0) break;
}
}
for (int i = 2; i <= N; i++) {
if (!st[i])
s[i]++;
int p = (sqrt(i));
if (p * p == i and !st[p]) s[i]--;//从i开始,p不再是孤独的数;
}
}
int main() {
int n;
scanf("%d",&n);
int x;
s[1] = 1;
isprime();
for(int i=1;i<=N;i++) s[i]+=s[i-1];
for (int i = 1; i <= n; i++) {
scanf("%d",&x);
printf("%d\n",s[x]);
}
return 0;
}