0309晚练——二分+二分答案

Done IOI Start at: 2025-3-9 18:45 5 hour(s) Host: 10

答案单调性才可以二分二分推荐视频超链接
把c题所有ac代码翻一遍,大家写得都很强,请思考细节对比优劣

注意《a+b》《a-b》问题在序列有序时的最优解是经典双指针/尺取法

和为给定数C24精品题解搬运

//双指针(尺取法),O(n)。但是本题给的乱序序列所以加上排序时间实际上O(nlogn) 
//@C24zhongzifan 
#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],s;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	cin>>s;
	sort(a+1,a+n+1);
	int l=1,r=n;
	while(l <= r){
		if(a[l]+a[r] == s){
			cout<<a[l]<<' '<<a[r];
			return 0;
		} 
		if(a[l]+a[r] > s){
			r--;
		} 
		if(a[l]+a[r] < s){
			l++;
		} 
	}
	cout<<"No";
	return 0;
} 
/*
//枚举+手写二分查找O(nlogn)
//@传奇猴哥 (C24wanghongming)
#include <iostream> 
using namespace std;
int a[100010],t,n,l,r,m;
bool f;
int main(){
	cin>>n;
	for(int i=0;i<n;i++)cin>>a[i];
	cin>>t;
	sort(a,a+n);
	for(int i=0;i+1<n;i++){
		int c=t-a[i];
		l=i,r=n,f=false;
		while(l+1!=r){
			m=(l+r)/2;
			if(a[m]<c)
				l=m;
			else 
				r=m;
			if(a[m]==c)
				f=true;
		}
		if(f){
			cout<<a[i]<<" "<<a[r];
			return 0;
		}
	}
	cout<<"No";
	return 0;
}
//map(红黑树本质二分)
//@C24zhouyanchen 
#include <iostream>
#include <map>
using namespace std;
map <int,int> a;
int n,target,tmp;
int main(){
	cin >> n;
	for (int i = 1;i <= n;i++){
		cin >> tmp;
		a[tmp]++;
	}
	cin >> target;
	map <int,int> :: iterator it = a.begin();
	for (;it != a.end();it++){
		if (it->first <= target - it->first && a[target - it->first] > 0){
			cout << it->first << ' ' << target - it->first << '\n';
			return 0;
		}
	}
	cout << "No\n";
	return 0;
} 

//multiset(set本质固定value的map)
//@nPr123f (C24zhengfujia)
//对比以下2组用例3的个数即知为何不可用set 
//input1:
//6
//1 3 3 1 1 8
//6 
//input2:
//6
//1 1 3 1 1 8
//6

#include<cstdio>
#include<set>
using namespace std;
multiset<int> s;
int n,m,t;
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;++i){
		scanf("%d",&t);
		s.insert(t);
	}
	scanf("%d",&m);
	for(auto it=s.begin();it!=s.end();++it)
		if(s.count(m-*it) && (m-*it!=*it || s.count(*it)>=2)){
			printf("%d %d",*it,m-*it);
			return 0;
		}
	puts("No");
	return 0;
}

//lower_bound、upper_bound from <algorithm> 
//@RRR (C24zhaozicheng)
#include <iostream>
#include<algorithm> 
using namespace std;
int a[100010];
int cnt[100010];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int m;
	cin>>m;
	sort(a+1,a+1+n);
	for(int i=1;i<=n;i++){
		int w1=lower_bound(a+1,a+n+1,m-a[i])-a;
		if(a[w1]==m-a[i]){
			cout<<min(m-a[i],a[i])<<" "<<max(m-a[i],a[i]);
			return 0;
		}
	}
	cout<<"No";
	return 0;
} 
*/



Status
Done
Rule
IOI
Problem
5
Start at
2025-3-9 18:45
End at
2025-3-9 23:45
Duration
5 hour(s)
Host
Partic.
10