静态查找之顺序查找
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],pos[N];
int id[N];
int n,m;
void solve(){
bool flag=false;
int t;
cin>>t;
int p;
for(int i=1;i<=n;i++)
if(a[i]==t){
p=i;
flag=true;
break;
}
if(flag){
cout<<p<<endl;
}
else puts("error");
}
int main(){
freopen("d:\\in.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
问题 B: DS静态查找之折半查找
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],pos[N];
int id[N];
int n,m;
void solve(){
bool flag=false;
int t;
cin>>t;
int pos=lower_bound(a+1,a+1+n,t)-a;
if(a[pos]==t) cout<<pos<<endl;
else puts("error");
}
int main(){
freopen("d:\\in.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
静态查找之顺序索引查找
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],pos[N];
int id[N];
int n,m;
void solve(){
int t;
cin>>t;
int p,cnt=0;
int start;
bool flag=false;
for(int i=1;i<=m;i++){
cnt++;
if(t<=id[i]){
start=i;
break;
}
}
for(int i=pos[start-1]+1;i<=pos[start];i++){
cnt++;
if(a[i]==t){
p=i;
flag=true;
break;
}
}
if(flag){
cout<<p<<"-"<<cnt<<endl;
}
else puts("error");
}
int main(){
freopen("d:\\in.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>m;
for(int i=1;i<=m;i++) cin>>id[i];
for(int i=1;i<=m;i++){
int j;
for(j=pos[i-1]+1;j<=n;j++){
if(a[j]>id[i]) break;
}
pos[i]=j-1;
}
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
查找——折半查找求平方根
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
void solve(){
int t;
cin>>t;
double l=0,r=t;
while(r-l>0.00001){
double mid=(l+r)/2;
if(mid*mid<t) l=mid;
else r=mid;
}
printf("%.3lf\n",l);
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
问题 E: 无线网络 (Ver. I)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int fa[N];
int x[N],y[N];
bool st[N];
int d;
int find(int x){
if(fa[x]!=x) return fa[x]=find(fa[x]);
return fa[x];
}
void merge(int x,int y){
int a=find(x),b=find(y);
fa[a]=b;
}
bool cal(int i,int j){
if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])<=d*d) return true;
else return false;
}
int main(){
int n;
cin>>n>>d;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
for(int i=1;i<=n;i++) fa[i]=i;
char op;
while(cin>>op){
if(op=='O'){
int pos;
cin>>pos;
st[pos]=true;
for(int i=1;i<=n;i++){
if(i!=pos&&st[i]){
if(cal(pos,i)) merge(pos,i);
}
}
}
else{
int a,b;
cin>>a>>b;
if(find(a)==find(b)){
puts("SUCCESS");
}
else puts("FAIL");
}
}
return 0;
}