1、求并集
由小到大输出两个单向有序链表的并集 如链表 A {1 -> 2 -> 5 -> 7} 链表 B {3 -> 5 -> 7 -> 8} 输出: {1 -> 2 ->3 - > 5 -> 7 ->8} 。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
scanf("%d%d",&n,&m);
vector<int>v(n+m);
for(int &i:v)scanf("%d",&i);
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
printf("%d",v.front());
for(int i=1;i<v.size();++i)printf(" -> %d",v[i]);
return 0;
}
2、小T找糖豆
已知连续序列A,包含1e18个元素,分别是[1,1e8]。 现在去除序列中的n个元素. 得到新的连续序列[X,1e8],该序列中 最小元素是?
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
vector<int>v(n);
for(int &i:v)scanf("%d",&i);
printf("%d",*max_element(v.begin(),v.end())+1);
return 0;
}
3、争风吃醋的豚鼠
N个节点两两建边。 不存在3个节点相互之前全部相连(3个节点连接成环) 。最多能建立多少条边?
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
long long ans=0;
while(n>0)ans+=n-1,n-=2;
printf("%lld",ans);
}
4、选择客栈
丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。 两位游客一起去丽江旅 游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一 家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p 。 他们想 知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn],b[maxn],k,lg,lg2[maxn],n,p,r[61],st[19][maxn];
vector<int>pos[61];
inline void build_st(){
for(int i=1;i<=n;++i)lg2[i]=lg2[i-1]+((2<<lg2[i-1])==i),st[0][i]=b[i];
lg=lg2[n];
for(int i=1;i<=lg;++i)
for(int j=1;j+(1<<i)-1<=n;++j)
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<i-1)]);
}
inline int query(int l,int r){
int k=lg2[r-l+1];
return min(st[k][l],st[k][r-(1<<k)+1]);
}
int main(){
scanf("%d%d%d",&n,&k,&p);
for(int i=1;i<=n;++i)scanf("%d%d",a+i,b+i),pos[a[i]].push_back(i);
build_st();
long long ans=0;
for(int i=1;i<=n;++i){
while(r[a[i]]<pos[a[i]].size()&&(pos[a[i]][r[a[i]]]<=i||query(i,pos[a[i]][r[a[i]]])>p))++r[a[i]];
ans+=pos[a[i]].size()-r[a[i]];
}
printf("%lld",ans);
return 0;
}