MashaEdinorog
29.09.2022 08:12

Задача №1698. Гомо или гетеро? Максимальное время работы на одном тесте:

3 секунды

Максимальный объем используемой памяти:

256 мегабайт

Определим две операции над списком целых чисел:

insert number – добавляет заданное число в конец списка
delete number – удаляет первое вхождение заданного числа из списка. Если список не содержит заданного числа, то ничего не меняется.
Например, результатом добавления числа 4 в список [1, 2, 1] будет список [1, 2, 1, 4]. Если мы удалим число 1 из этого списка, то получим список [2, 1, 4], но если мы попытаемся удалить число 3 из списка [1, 2, 1, 4], то список останется неизменным.

Список называется гомогенным, если он содержит хоты бы два одинаковых числа и гетерогенным, если содержит хотя бы два различных числа. Например, список [2, 2] является гомогенным, список [2, 1, 4] – гетерогенным, список [1, 2, 1, 4] – одновременно и тем и другим, а пустой список не является ни гомогенным, ни гетерогенным.

Напишите программу, которая по последовательности операций добавления и удаления в пустой список, определяет после каждой из операций, является ли список гомогенным или гетерогенным.

Формат входных данных

Первая строка содержит целое число n – количество операций (1 ≤ n ≤ 100 000).

Следующие n строк содержат описания операций. Каждая операция описывается словом “insert” или “delete” и числом k – аргументом операции (-109 ≤ k ≤ 109).

Формат выходных данных

Для каждой операции выведите строку, содержащую единственное слово, описывающее состояние списка после этой операции:

“both” - если список одновременно является и тем и другим
“hetero” - если список является гетерогенным
“homo” - если список является гомогенным
“neither” - если список не принадлежит ни одному типу.

Нажмите на рекламу ниже и сразу увидите ответ
Популярные вопросы:
Ответ:
Bauer322
05.09.2022 01:01

Вычитаем первое число из второго.

Если результат отрицательный, то первое меньше второго.

Если нулевой, то они равны.

Если положительный, то первое больше второго.

Найдем разность между первым и вторым значением: c=a-b

Все что нам требуется сделать, это выяснить, является ли с положительным числом.

Например, используя функцию сигнум, можно получить вариант функции Хевисайда, которая будет принимать значение 1 только для положительных значений, а во всех остальных случаях обращаться в ноль. f(c)=[(sgn(c)+1/)2]

В нашем случае можно записать, что max(a,b)=a*f(c)+b*f(-c)

Так мы можем сравнить два числа, не прибегая к логическому сравнению.

Конечно, данный алгоритм реализуем при условии наличия встроенной функции сигнум (она присутствует даже в старом Бейсике ). Но даже если такой встроенной функции нет, ее написание не составит большого труда.

0,0(0 оценок)
Ответ:
NorthIndiana
17.10.2022 07:17
//PascalABC.NET 3.2 сборка 1318

var
  l, r, counter, i: integer;

function DifNum(a: integer): integer;
var  se: set of integer;
  i: integer;
begin
  while a > 0 do
  begin
    if a mod 10 in se then
    begin
      DifNum := 0;
      exit;
    end
    else include(se, a mod 10);
    a := a div 10;
  end;
  DifNum := 1;
end;

begin
  read(l, r);
  for i := l to r do
    counter += DifNum(i);
  writeln(counter);
end.

//Альтернативное решение на Паскале

Var
  l,r:integer;
begin
read(l,r);
writeln(range(l,r).where(x -> x.tostring.toarray.distinct.count=length(x.tostring)).Count);
end.

//Dev-C++ 5.11 (C)

#include <stdio.h>
#include <malloc.h>

int DifNum(int);

int main(void)
 {int l,r,counter=0;
 scanf("%d %d",&l,&r);
 for(int i=l;i<=r;i++)
  counter+=DifNum(i);
 printf("%d",counter);
return 0;}

int DifNum(int a)
 {int k=1,*nums;
 nums=(int*)malloc(k*sizeof(int));
 nums[0]=-1;
 while(a>0)
  {for(int i=0;i<k;i++)
   if(a%10==nums[i])
    return 0;
  k++;
  nums=(int*)malloc(k*sizeof(int));
  nums[k-1]=a%10;
  a/=10;}
 free(nums);
 return 1;}

Пример ввода:
1 12
Пример вывода:
11
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота