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