51nod 2202 做任务二
multiset
因为我要查找的是容器内有没有小于等于当前这个数的。因为stl没有这种操作,所以我们只需要将其转变为负值就行了。思想是如果一个人可以干就让他一直干,时间冲突了就加一个人。
每次把右端点放进去.然后查找的时候查找左端点就行了。排序的时候我一开始想的是r从小到大.
l从大到小.这样是不对的..
比如这样的图片只有1 3 2 4匹配这样是最优的。
#include<bits/stdc++.h> #define fp(i,a,b) for(int i=a;i<=b;i++) typedef long long ll; typedef double dl; using namespace std; const int N=2e5+7; const ll M=1e9+7; const int INF=0x3f3f3f3f; int n,m; struct node{ ll l,r; }s[N]; multiset<int> st; bool cmp(node a,node b) { if(a.r==b.r) return a.l<b.l; return a.r<b.r; } void solve() { st.clear(); ll ans=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%lld%lld",&s[i].l,&s[i].r); sort(s+1,s+n+1,cmp); for(int i=1;i<=n;i++) { auto it=st.lower_bound(-s[i].l); if(it!=st.end()) { ans++; st.erase(it); st.insert(-s[i].r); } else if(st.size()<m) { ans++; st.insert(-s[i].r); } } printf("%lld\n",ans); } int main() { //ios::sync_with_stdio(0); //cin.tie(0),cout.tie(0); int T; scanf("%d",&T); for(int i=1;i<=T;i++) solve(); }