Пожалуйста, прочтите новое правило об ограничении использования AI-инструментов. ×

Блог пользователя Vasiljko

Автор Vasiljko, история, 7 лет назад, По-английски

What is the idea behind this problem?

Link to the problem

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

»
7 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Use bitset.

  • »
    »
    7 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится

    Can you elaborate further?

    • »
      »
      »
      7 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится

      Giveaway:

      bitset<100001> posi; posi[0] = 1;
      F0R(i,N) {
          int x; cin >> x;
          posi |= posi<<x;
      }
      
      • »
        »
        »
        »
        7 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Sum can go upto 10^9 and we cannot have bitset with that no. of bits. How to proceed pls help

        • »
          »
          »
          »
          »
          7 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Read the constraints. You only care about sums up to 105.

        • »
          »
          »
          »
          »
          7 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          yes but the query asks for values upto 10^5 only.so, u dont dont have to care for numbers above 10^5.You have to update the bitset for every incoming x by shifting the bitset and doing or with previous bitset so that the bitset at the new possible sums become 1.you can refer to the snippet below.

          bitset<100001> bs;
             bs[0]=1;
             for(int i=0;i<n;++i)
             {
             	int x;
             	scanf("%d",&x);
             	bs|=bs<<x;
             }
             int s[100005]={0};
             for(int i=1;i<=100001;++i)
             	s[i]=s[i-1]+bs[i];
             while(q--)
             {
             	int a,b;
             	scanf("%d%d", &a, &b);
             	printf("%d\n", s[b]-s[a-1]);;
             }
          
»
7 лет назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

O