• Source
    1. #include <cstdio>
    2. #include <cstring>
    3. #include <algorithm>
    4. #include <queue>
    5. // by zrt
    6. // problem:
    7. // 无论你在什么时候开始,重要的是开始以后就不要停止。
    8. using namespace std ;
    9. typedef long long LL ;
    10. const double eps(1e-10) ;
    11. const int inf(0x7f3f3f3f) ;
    12. int H[540],X[4000050],P[4000050],flow[4000050],cap[4000050],tot;
    13. int bian[4000050];
    14. int n,m;
    15. int duan[54050],from[450],to[450];
    16. int v[205],a[205],b[205];
    17. int c[550],t;
    18. int tt[450];
    19. int S,T,kase;
    20. struct N{
    21. int l,r;
    22. }xl[550];
    23. inline void add(int x,int y,int z){
    24. P[++tot]=y;X[tot]=H[x];H[x]=tot;flow[tot]=cap[tot]=z;
    25. }
    26. inline bool cmp(N a,N b){
    27. return a.l<b.l;
    28. }
    29. int d[540];
    30. queue<int> q;
    31. bool bfs(){
    32. memset(d,0,sizeof d);
    33. d[S]=1;int k;q.push(S);
    34. while(!q.empty()){
    35. k=q.front();q.pop();
    36. for(int i=H[k];i;i=X[i]){
    37. if(flow[i]>0&&!d[P[i]]){
    38. d[P[i]]=d[k]+1;
    39. q.push(P[i]);
    40. }
    41. }
    42. }
    43. return d[T];
    44. }
    45. int dfs(int x,int a){
    46. if(x==T||a==0) return a;
    47. int tmp,f=a;
    48. for(int i=H[x];i;i=X[i]){
    49. if(flow[i]>0&&d[P[i]]==d[x]+1){
    50. tmp=dfs(P[i],min(flow[i],a));
    51. a-=tmp;
    52. flow[i]-=tmp;
    53. flow[i^1]+=tmp;
    54. if(!a) break;
    55. }
    56. }
    57. if(f==a) d[x]=-1;
    58. return f-a;
    59. }
    60. int Dinic(){
    61. int f(0);
    62. while(bfs()) f+=dfs(S,inf);
    63. return f;
    64. }
    65. int main(){
    66. #ifdef LOCAL
    67. freopen("in.txt","r",stdin) ;
    68. freopen("out.txt","w",stdout) ;
    69. #endif
    70. while(scanf("%d%d",&n,&m)==2){
    71. S=0,T=439;kase++;
    72. int sum(0);
    73. memset(H,0,sizeof H);tot=1;t=0;
    74. for(int i=1;i<=n;i++){
    75. scanf("%d%d%d",&v[i],&a[i],&b[i]);
    76. c[t++]=a[i];c[t++]=b[i];
    77. sum+=v[i];
    78. }
    79. sort(c,c+t);
    80. t=unique(c,c+t)-c;
    81. t--;
    82. for(int i=0;i<t;i++){
    83. from[i]=c[i];to[i]=c[i+1];
    84. duan[c[i]]=i;
    85. }
    86. for(int i=1;i<=n;i++){// duan + 105
    87. add(S,i,v[i]);add(i,S,0);
    88. for(int j=duan[a[i]];;j++){
    89. add(i,j+105,to[j]-from[j]);
    90. bian[tot]=j;
    91. add(j+105,i,0);
    92. if(to[j]==b[i]) break;
    93. }
    94. }
    95. for(int i=0;i<t;i++){
    96. add(i+105,T,m*(to[i]-from[i]));
    97. add(T,i+105,0);
    98. }
    99. if(Dinic()!=sum){
    100. printf("Case %d: No\n",kase);
    101. }else{
    102. printf("Case %d: Yes\n",kase);
    103. memset(tt,0,sizeof tt);
    104. for(int i=1;i<=n;i++){
    105. int sz=0;
    106. for(int j=H[i];j;j=X[j]){
    107. if(cap[j]>0&&cap[j]!=flow[j]){
    108. if(tt[bian[j]]==to[bian[j]]-from[bian[j]]) tt[bian[j]]=0;
    109. if(tt[bian[j]]+cap[j]-flow[j]>to[bian[j]]-from[bian[j]]){
    110. xl[sz].l=tt[bian[j]]+from[bian[j]];
    111. xl[sz].r=to[bian[j]];
    112. sz++;
    113. flow[j]+=to[bian[j]]-from[bian[j]]-tt[bian[j]];
    114. tt[bian[j]]=0;
    115. }
    116. xl[sz].l=tt[bian[j]]+from[bian[j]];
    117. tt[bian[j]]+=cap[j]-flow[j];
    118. xl[sz].r=tt[bian[j]]+from[bian[j]];
    119. sz++;
    120. }
    121. }
    122. sort(xl,xl+sz,cmp);
    123. int num(1);
    124. for(int i=0;i<sz-1;i++){
    125. if(xl[i].r!=xl[i+1].l) num++;
    126. }
    127. printf("%d",num);
    128. int j=0;
    129. while(num--){
    130. printf(" (%d,",xl[j].l);
    131. while(j<sz-1&&xl[j].r==xl[j+1].l) j++;
    132. printf("%d)",xl[j].r);
    133. j++;
    134. }
    135. puts("");
    136. }
    137. }
    138. }
    139. return 0 ;
    140. }
    141.