示例#1
0
        public override void Solve(IOManager io)
        {
            const int MaxDigit = 28;
            var       n        = io.ReadInt();
            var       a        = io.ReadIntArray(n);
            var       b        = io.ReadIntArray(n);
            var       bWork    = new int[n];

            var result = 0;

            for (int digit = 0; digit <= MaxDigit; digit++)
            {
                var highest = 1 << digit;
                var mask    = (1 << (digit + 1)) - 1;
                for (int i = 0; i < b.Length; i++)
                {
                    bWork[i] = b[i] & mask;
                }
                bWork.Sort();

                long count = 0;

                foreach (var ai in a)
                {
                    var currentA = ai & mask;
                    var zero     = SearchExtensions.GetGreaterEqualIndex(bWork, highest - currentA);
                    var one      = SearchExtensions.GetGreaterEqualIndex(bWork, highest * 2 - currentA);
                    var two      = SearchExtensions.GetGreaterEqualIndex(bWork, highest * 3 - currentA);
                    count += bWork.Length - two + one - zero;
                }

                result |= (int)(count & 1) << digit;
            }

            io.WriteLine(result);
        }
示例#2
0
        public override void Solve(IOManager io)
        {
            var n = io.ReadInt();
            var m = io.ReadInt();

            var children = io.ReadIntArray(n);
            var mines    = io.ReadIntArray(m);

            children.Sort();
            mines.Sort();

            var evens = new long[n / 2 + 1];
            var odds  = new long[n / 2 + 1];

            for (int i = 0; i + 1 < evens.Length; i++)
            {
                var even = children[i * 2 + 1] - children[i * 2];
                var odd  = children[i * 2 + 2] - children[i * 2 + 1];

                evens[i + 1] = evens[i] + even;
                odds[i + 1]  = odds[i] + odd;
            }

            long min = long.MaxValue;

            foreach (var mine in mines)
            {
                var  index = SearchExtensions.GetGreaterThanIndex(children, mine);
                long sum   = 0;

                if (index % 2 == 0)
                {
                    sum   += Math.Abs(mine - children[index]);
                    index /= 2;
                    index++;
                    sum += evens[index - 1] + odds[^ 1] - odds[index - 1];
示例#3
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var(cars, mechanics) = inputStream.ReadValue <long, int>();
            var initialPositions = new int[mechanics];

            for (int i = 0; i < initialPositions.Length; i++)
            {
                initialPositions[i] = inputStream.ReadInt();
            }

            bool CanCheckAll(long minutes)
            {
                long seen = 0;

                foreach (var x in initialPositions)
                {
                    var distance = x - (seen + 1);
                    if (distance > minutes)
                    {
                        return(false);
                    }
                    else if (distance > 0)
                    {
                        seen = Math.Max(x + minutes - distance * 2, x + (minutes - distance) / 2);
                    }
                    else
                    {
                        seen = x + minutes;
                    }
                }

                return(seen >= cars);
            }

            yield return(SearchExtensions.BoundaryBinarySearch(CanCheckAll, cars * 2, -1));
        }
示例#4
0
        /// <summary>
        /// 百度编辑器的文件列表管理
        /// </summary>
        /// <param name="pathToList">文件列表目录</param>
        /// <param name="searchExtensions">扩展名</param>
        /// <returns></returns>
        public ActionResult ListFileManager(string pathToList, string[] searchExtensions)
        {
            int Start;
            int Size;
            int Total;

            String[] FileList;
            String[] SearchExtensions;
            SearchExtensions = searchExtensions.Select(x => x.ToLower()).ToArray();
            try
            {
                Start = String.IsNullOrEmpty(Request["start"]) ? 0 : Convert.ToInt32(Request["start"]);
                Size  = String.IsNullOrEmpty(Request["size"]) ? UeditorConfig.GetInt("imageManagerListSize") : Convert.ToInt32(Request["size"]);
            }
            catch (FormatException)
            {
                return(Content(new
                {
                    state = "参数不正确",
                    start = 0,
                    size = 0,
                    total = 0
                }.ToJson()));
            }
            var buildingList = new List <String>();

            try
            {
                var localPath = Server.MapPath(pathToList).Replace("\\Utility\\", "\\ueditor\\");
                buildingList.AddRange(Directory.GetFiles(localPath, "*", SearchOption.AllDirectories)
                                      .Where(x => SearchExtensions.Contains(Path.GetExtension(x).ToLower()))
                                      .Select(x => pathToList + x.Substring(localPath.Length).Replace("\\", "/")));
                Total    = buildingList.Count;
                FileList = buildingList.OrderBy(x => x).Skip(Start).Take(Size).ToArray();
            }
            catch (UnauthorizedAccessException)
            {
                return(Content(new
                {
                    state = "文件系统权限不足",
                    start = 0,
                    size = 0,
                    total = 0
                }.ToJson()));
            }
            catch (DirectoryNotFoundException)
            {
                return(Content(new
                {
                    state = "路径不存在",
                    start = 0,
                    size = 0,
                    total = 0
                }.ToJson()));
            }
            catch (IOException)
            {
                return(Content(new
                {
                    state = "文件系统读取错误",
                    start = 0,
                    size = 0,
                    total = 0
                }.ToJson()));
            }

            return(Content(new
            {
                state = "SUCCESS",
                list = FileList == null ? null : FileList.Select(x => new { url = x }),
                start = Start,
                size = Size,
                total = Total
            }.ToJson()));
        }
示例#5
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            _ = inputStream.ReadInt();
            var a = inputStream.ReadIntArray();
            var b = inputStream.ReadIntArray();
            var c = inputStream.ReadIntArray();

            Array.Sort(a);
            Array.Sort(b);
            Array.Sort(c);

            long result = 0;

            foreach (var bi in b)
            {
                result += (long)(SearchExtensions.GetLessThanIndex(a, bi) + 1) * (c.Length - SearchExtensions.GetGreaterThanIndex(c, bi));
            }

            yield return(result);
        }
 public override ITypeSearch <T> Facet <T>(ITypeSearch <T> query, Filter filter) => SearchExtensions.TermsFacetFor(query, FieldName, null, filter);
示例#7
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var n = inputStream.ReadInt();
            var x = inputStream.ReadIntArray();
            var l = inputStream.ReadInt();

            var reachableHotels = new List <List <int> >();
            var listIndexes     = Enumerable.Repeat(-1, n).ToArray();

            for (int start = 0; start < listIndexes.Length; start++)
            {
                if (listIndexes[start] != -1)
                {
                    continue;
                }

                var listIndex = reachableHotels.Count;
                listIndexes[start] = listIndex;
                var currentReachableHotels = new List <int>();
                reachableHotels.Add(currentReachableHotels);

                int current = start;
                currentReachableHotels.Add(current);
                while (current < n - 1)
                {
                    current = SearchExtensions.GetLessEqualIndex(x, x[current] + l);
                    currentReachableHotels.Add(current);
                    if (listIndexes[current] != -1)
                    {
                        break;
                    }

                    listIndexes[current] = listIndex;
                }
            }

            var queries = inputStream.ReadInt();

            for (int q = 0; q < queries; q++)
            {
                var(from, to) = inputStream.ReadValue <int, int>();
                from--;
                to--;
                if (from > to)
                {
                    (from, to) = (to, from);
                }

                var days    = 0;
                var current = from;

                while (current < to)
                {
                    var listIndex    = listIndexes[current];
                    var currentList  = reachableHotels[listIndex];
                    var currentIndex = currentList.BinarySearch(current);
                    var nextIndex    = SearchExtensions.BoundaryBinarySearch(i => currentList[i] >= to, currentList.Count - 1, currentIndex);
                    days   += nextIndex - currentIndex;
                    current = currentList[nextIndex];
                }

                yield return(days);
            }
        }
示例#8
0
 private static long GetHandshakeCount(long minPow, long otherPow, long[] a) => SearchExtensions.BoundaryBinarySearch(myPowIndex => otherPow + a[myPowIndex] >= minPow, -1, a.Length) + 1;
示例#9
0
 public override IEnumerable <object> Solve(TextReader inputStream)
 {
     var(a, b, x) = inputStream.ReadValue <long, long, long>();
     yield return(SearchExtensions.BoundaryBinarySearch(n => a * n + b * GetMaxDigit(n) <= x, 0, 1_000_000_001));
 }
示例#10
0
 public virtual IEnumerable <SearchData> Search(string value)
 {
     return(SearchExtensions.Search(ResultKind.Name, _name, value));
 }
示例#11
0
        public void BisectionDoubleTest()
        {
            var answer = SearchExtensions.Bisection(x => Math.Log(x), 1e-8, 1e18);

            Assert.InRange(Math.Abs(1 - answer), 0, 1e-9);
        }
示例#12
0
        public void BisectionIntTest()
        {
            var answer = SearchExtensions.BoundaryBinarySearch(n => n * n >= 64, 100, 0);

            Assert.Equal(8, answer);
        }
示例#13
0
        public override void Solve(IOManager io)
        {
            var n          = io.ReadInt();
            var queryCount = io.ReadInt();
            var s          = io.ReadString();

            var queries = new Query[queryCount];

            for (int i = 0; i < queries.Length; i++)
            {
                var t = io.ReadString()[0];
                var d = io.ReadString()[0];

                queries[i] = new Query(t, d == 'L' ? Direction.Left : Direction.Right);
            }

            var left  = SearchExtensions.BoundaryBinarySearch(FallsLeft, -1, s.Length);
            var right = SearchExtensions.BoundaryBinarySearch(FallsRight, s.Length, -1);

            io.WriteLine(s.Length - (left + 1) - (s.Length - right));

            bool FallsLeft(int index)
            {
                foreach (var query in queries)
                {
                    if (s[index] == query.Char)
                    {
                        if (query.Direction == Direction.Left)
                        {
                            index--;
                        }
                        else
                        {
                            index++;
                        }
                    }

                    if (index < 0)
                    {
                        return(true);
                    }
                    else if (index >= s.Length)
                    {
                        return(false);
                    }
                }

                return(false);
            }

            bool FallsRight(int index)
            {
                foreach (var query in queries)
                {
                    if (s[index] == query.Char)
                    {
                        if (query.Direction == Direction.Left)
                        {
                            index--;
                        }
                        else
                        {
                            index++;
                        }
                    }

                    if (index < 0)
                    {
                        return(false);
                    }
                    else if (index >= s.Length)
                    {
                        return(true);
                    }
                }

                return(false);
            }
        }