记录编号 440230 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2014]飞扬的小鸟 最终得分 100
用户昵称 GravatarCSU_Turkey 是否通过 通过
代码语言 C++ 运行时间 0.641 s
提交时间 2017-08-22 20:32:03 内存使用 77.14 MiB
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int inf=10005;
  4. int n,m,k,up[inf],down[inf],a[inf][1005],f[inf][1005],s[inf];
  5. int main()
  6. {
  7. freopen("birda.in","r",stdin);
  8. freopen("birda.out","w",stdout);
  9. // freopen("1.txt","r",stdin);
  10. scanf("%d%d%d",&n,&m,&k);
  11. memset(f,0x3f,sizeof(f));
  12. for(int i=0;i<n;i++){
  13. scanf("%d%d",&up[i],&down[i]);
  14. }
  15. for(int i=1;i<=k;i++){
  16. int p,l,h;
  17. scanf("%d%d%d",&p,&l,&h);
  18. s[p]++;
  19. for(int j=0;j<=l;j++){
  20. a[p][j]=1;
  21. }
  22. for(int j=h;j<=m;j++){
  23. a[p][j]=1;
  24. }
  25. }
  26. for(int i=1;i<=m;i++){
  27. if(!a[0][i])
  28. f[0][i]=0;
  29. }
  30. for(int i=1;i<=n;i++){
  31. for(int j=up[i-1]+1;j<m;j++){
  32. f[i][j]=min(f[i][j],min(f[i-1][j-up[i-1]],f[i][j-up[i-1]])+1);
  33. }
  34. for(int j=m-up[i-1];j<=m;j++){
  35. f[i][m]=min(f[i][m],min(f[i-1][j],f[i][j])+1);
  36. }
  37. for(int j=1;j+down[i-1]<=m;j++){
  38. f[i][j]=min(f[i][j],f[i-1][j+down[i-1]]);
  39. }
  40. for(int j=1;j<=m;j++)//一开始我是没有这句的而是直接在循环里面判断a[i][j]是否被标记,我还以为这两种写法是等价的
  41. //卡了我n天,后来我发现,假设当前点为i,j,他可以从i-1,j-2*up[i-1]转移过来,但i,j-up[i-1]是墙,如果按我之前写法
  42. //直接判断标记continue掉,墙的位置不会被更新,i,j,也不会被更新,他只会被i-1,j-up[i-1],和i,j-up[i-1]更新
  43. // 但i,j-up[i-1]是墙,没被更新,事实上连点两下可以通过i-1,j-2*up[i-1]转移而来,但按我之前写法却没有
  44. //所以挽救方法就是先不判墙,让他能更新的全部更新,最后再为有墙的地方重新赋值f[0][0]
  45. if(a[i][j])f[i][j]=f[0][0];
  46. }
  47. int mi=0x3fffffff;
  48. for(int i=1;i<=m;i++){
  49. mi=min(mi,f[n][i]);
  50. }
  51. if(mi!=f[0][0]){
  52. cout<<1<<endl<<mi;
  53. }
  54. else{
  55. cout<<0<<endl;
  56. int book=0;
  57. int o;
  58. for(int i=n;i>=0;i--){
  59. for(int j=m;j>=1;j--){
  60. if(f[i][j]!=f[0][0]){
  61. o=i;
  62. book=1;
  63. break;
  64. }
  65. }
  66. if(book)
  67. break;
  68. }
  69. int ans=0;
  70. for(int i=o;i>=0;i--)
  71. if(s[i])ans++;
  72. cout<<ans;
  73. }
  74. return 0;
  75. }