POJ 1716 Integer Intervals
差分约束就是抠不明白了,找到了一个最水的题,貌似明白了一点。
题目大意:
在一个一维区间内需要一些整数点,给出一些这个一维区间中的小区间,每个区间内至少有两个点,求这个一维区间最少有几个点。
思路:
限制条件有三个:
1、对于区间,必定有num[start]>=num[end]-2;
2、对于整数点,必有num[i]<=num[i+1];
3、对于整数点,必有num[i+1]<=num[i]+1;
下面是代码:
#include <stdio.h> #include <string.h> struct node { int x,y; } qu[10006]; int num[10006]; int main() { int n; while(scanf("%d",&n)!=EOF) { int i,s=1<<30,e=0; for(i=0; i<n; i++) { scanf("%d%d",&qu[i].x,&qu[i].y); qu[i].y++; if(qu[i].x<s) { s=qu[i].x; } if(qu[i].y>e) { e=qu[i].y; } } bool flat=true; while(flat) { flat=false; for(i=0; i<n; i++) { if(num[qu[i].x]>num[qu[i].y]-2) { num[qu[i].x]=num[qu[i].y]-2; flat=true; } } for(i=s; i<e; i++) { if(num[i+1]>num[i]+1) { num[i+1]=num[i]+1; flat=true; } } for(i=e-1; i>=s; i--) { if(num[i]>num[i+1]) { num[i] = num[i+1]; flat = true; } } } printf("%d\n",num[e]-num[s]); } return 0; }