hdu5323 多校题
2015-07-30 11:26
351 查看
给你一个区间(L,R) 要你求n 对于一颗线段树根节点(0,n) 线段树中存在区间为(L,R)的节点 求最小的n 说一下思路吧 这就是相当于告诉你子节点 让你求根节点吧 ,分情况讨论了 先想想在线段树中如何根据根节点得到子节点的 容易想出父亲节点的4中情况吧
1.[ l , 2*r-l ]
2.[ l , 2*r+1-l ]
3.[ (l-1)*2-r , r ]
4.[ (l-1)*2+1-r , r ]
然后就可以dfs了 注意 这里有个地方容易错 就是搜的顺序 因为我们是要找最小的n 所以先往左边即3和4(就是尽量让l快点到0 这样就能得到小的n 可以减少很多情况) 开始没注意 爆栈了好多次==
1.[ l , 2*r-l ]
2.[ l , 2*r+1-l ]
3.[ (l-1)*2-r , r ]
4.[ (l-1)*2+1-r , r ]
然后就可以dfs了 注意 这里有个地方容易错 就是搜的顺序 因为我们是要找最小的n 所以先往左边即3和4(就是尽量让l快点到0 这样就能得到小的n 可以减少很多情况) 开始没注意 爆栈了好多次==
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; __int64 n; int dfs(__int64 l,__int64 r) { if(l==0) { if(n==-1) n=r; else { if(n>r) n=r; } return 0; } if( n != -1 && r >= n ) return 0; if( l < 0 ) return 0; if( r-l+1 > (l-1)*2 ) return 0; dfs((l-1)*2-r,r) ; dfs((l-1)*2+1-r,r) ; dfs(l,r*2-l) ; dfs(l,r*2+1-l); return 0; } int main() { __int64 l,r; while(~scanf("%I64d%I64d",&l,&r)) { n=-1; dfs(l,r); printf("%I64d\n",n); } return 0; }
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- C++深度优先搜索的实现方法
- 基于文本的搜索
- php实现搜索一维数组元素并删除二维数组对应元素的方法
- 使用Sphinx对索引进行搜索
- asp 多关键词搜索的简单实现方法
- C#使用foreach语句搜索数组元素的方法
- JavaScript中数组的排序、乱序和搜索实现代码
- C#编程实现Excel文档中搜索文本内容的方法及思路
- sqlserver中在指定数据库的所有表的所有列中搜索给定的值
- 可以用来搜索当前页面内容的js代码
- 全文搜索和替换
- javascript搜索自动提示功能的实现第1/3页
- mysql 模糊搜索的方法介绍
- 基于ASP.NET的lucene.net全文搜索实现步骤
- 做个自己站内搜索引擎
- PHP查找与搜索数组元素方法总结
- C语言按关键字搜索文件夹中文件的方法