概念


题目练习
区间合并

(归并排序应用)
cpp
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
node(){};
node(int xx,int yy)
{
x = xx;
y = yy;
}
};
node a[50010];
int n;
void guibin(int,int);
int main()
{
cin>>n;
for(int i = 1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
}
guibin(1,n);
// for(int i = 1;i<=n;i++)
// {
// cout<<a[i].x<<" "<<a[i].y<<endl;
// }
bool f = true;
for(int i = 1;i<n;i++)
{
if(a[i].y<a[i+1].x)
{
f = false;
break;
}
}
if(f==true) cout<<a[1].x<<" "<<a[n].y;
else cout<<"no";
return 0;
}
void guibin(int l,int r)
{
if(l==r) return;
int mid = (l+r)/2;
guibin(l,mid);
guibin(mid+1,r);
int i = l;
int j = mid+1;
node t[50010];
int lt = 0;
while(i<=mid&&j<=r)
{
if(a[i].x<=a[j].x)
{
t[++lt] = {a[i].x,a[i].y};
i++;
}
else
{
t[++lt] = {a[j].x,a[j].y};
j++;
}
}
while(i<=mid) t[++lt] = {a[i].x,a[i].y},i++;
while(j<=r) t[++lt] = {a[j].x,a[j].y},j++;
// cout<<l<<" "<<r<<endl;
for(i = 1;i<=lt;i++)
{
// cout<<t[i].x<<" "<<t[i].y<<endl;
a[i+l-1] = {t[i].x,t[i].y};
}
// cout<<endl;
// for(int i = 1;i<=n;i++)
// {
// cout<<a[i].x<<" "<<a[i].y<<endl;
// }
// cout<<endl<<endl;
return;
}
寻找第K大元素

(快速排序应用)
cpp
#include <bits/stdc++.h>
using namespace std;
int n,k,a[100010];
void kuaisu(int,int);
int main()
{
cin>>n>>k;
for(int i = 1;i<=n;i++)
{
cin>>a[i];
}
k = n-k+1;
kuaisu(1,n);
return 0;
}
void kuaisu(int l,int r)
{
int mid = (l+r)/2;
int res = a[mid];
int i = l;
int j = r;
int zhong = i;
while(i<=j)
{
while(a[i]<res) i++;
while(a[j]>res) j--;
if(i<=j)
{
swap(a[i],a[j]);
zhong = i;
i++;
j--;
}
else break;
}
// cout<<l<<" "<<mid<<" "<<r<<" "<<i<<" "<<j<<" "<<zhong<<endl;
// for(int i = 1;i<=n;i++)
// {
// cout<<a[i]<<" ";
// }
// cout<<endl;
// system("pause");
if(zhong==k) cout<<a[k];
else if(zhong<k) kuaisu(zhong+1,r);
else if(zhong>k) kuaisu(l,zhong);
return;
}
月度开销

(分治算法)
cpp
#include <bits/stdc++.h>
using namespace std;
int n,m,a[100010];
int sum,ma;
int main()
{
cin>>n>>m;
for(int i = 1;i<=n;i++)
{
cin>>a[i];
sum += a[i];
ma = max(ma,a[i]);
}
int l = ma,r = sum;
int mid;
while(l<=r)
{
mid = (l+r)/2;
int t = 0;
int sumt = 0;
for(int i = 1;i<=n;i++)
{
if(a[i]+sumt<=mid) sumt += a[i];
else t++,sumt = a[i];
}
if(t<m) r = mid-1;
else if(t>=m) l = mid+1;
}
cout<<mid;
return 0;
}