51nod 1091 线段的重叠
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e4+5;
struct node{
int l,r;
}a[maxn];
bool cmp(node a,node b){
if(a.l==b.l) return a.r>b.r;
return a.l<b.l;
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].l,&a[i].r);
}
sort(a+1,a+1+n,cmp);
int x,y,ans = 0;
node pre=a[1];
for(int i=2;i<=n;i++){
if(a[i].r<=pre.r) {
ans = max(ans,a[i].r-a[i].l);
}
else{
ans = max(ans,pre.r-a[i].l);
pre = a[i];
}
}
printf("%d\n",ans);
return 0;
}
51nod 1133 不重叠的线段
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll setoff = 1e9;
const int maxn = 5e4+5;
struct node{
ll l,r;
}a[maxn];
bool cmp(node a,node b){
if(a.r==b.r) return a.l<b.r;
return a.r<b.r;
}
int main(){
int n,x,y;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%lld%lld",&a[i].l,&a[i].r);
a[i].l+=setoff,a[i].r+=setoff;
}
sort(a+1,a+1+n,cmp);
int ans = 0,end = 0;
for(int i=1;i<=n;i++){
if(a[i].l>=end){
ans++;
end = a[i].r;
}
}
printf("%d\n",ans);
return 0;
}
POJ 1089 Intervals
误以为a[n].r是最大的r
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll setoff = 1e9;
const int maxn = 5e4+5;
struct node{
int l,r;
}a[maxn];
bool cmp(node a,node b){
if(a.l==b.l) return a.r<b.r;
return a.l<b.l;
}
int main(){
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].l,&a[i].r);
sort(a+1,a+1+n,cmp);
int mx = a[1].r;
printf("%d ",a[1].l);
for(int i=2;i<=n;i++){
if(a[i].l > mx)
printf("%d\n%d ",mx,a[i].l);
mx = max(mx,a[i].r);
}
printf("%d\n",mx);
return 0;
}
POJ1752 Advertisement 贪心区间选点问题
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1e3+5;
const int setoff = 1e4;
struct node{
int l,r;
}a[maxn];
bool cmp(node a,node b){
return a.r < b.r;
}
bool vis[30000];
vector<int> res;
int ans;
int main(){
int n,k;
scanf("%d%d",&k,&n);
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].l,&a[i].r);
a[i].l += setoff;
a[i].r += setoff;
if(a[i].l > a[i].r) swap(a[i].l,a[i].r);
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
if(a[i].r-a[i].l+1 <= k){
for(int j=a[i].l;j<=a[i].r;j++){
if(vis[j]==0){
ans++;
vis[j]=1;
res.push_back(j);
}
}
}
else {
int cnt=0;
for(int j=a[i].l;j<=a[i].r;j++){
if(vis[j]==1) cnt++;
}
if(cnt>=k) continue;
for(int j=a[i].r;j>=a[i].l;j--){
if(vis[j]==0){
ans++;
cnt++;
vis[j]=1;
res.push_back(j);
if(cnt>=k) break;
}
}
}
}
printf("%d\n",ans);
sort(res.begin(),res.end());
for(auto it : res){
printf("%d\n",it-setoff);
}
return 0;
}
也可以 离散化+差分约束
POJ 1201 Intervals
也可 差分约束