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

Автор flamestorm, 4 месяца назад, По-английски

Thanks for participating. We hope you enjoyed the contest!

1999A - A+B Again?

Idea: flamestorm

Tutorial
Solution

1999B - Card Game

Idea: SlavicG

Tutorial
Solution

1999C - Showering

Idea: SlavicG

Tutorial
Solution

1999D - Slavic's Exam

Idea: SlavicG

Tutorial
Solution

1999E - Triple Operations

Idea: flamestorm

Tutorial
Solution

1999F - Expected Median

Idea: mesanu

Tutorial
Solution

1999G1 - Ruler (easy version)

Idea: flamestorm

Tutorial
Solution

1999G2 - Ruler (hard version)

Idea: flamestorm

Tutorial
Solution
Разбор задач Codeforces Round 964 (Div. 4)
  • Проголосовать: нравится
  • +77
  • Проголосовать: не нравится

»
4 месяца назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

you are so quickly!

»
4 месяца назад, # |
Rev. 4   Проголосовать: нравится -22 Проголосовать: не нравится

so fast!

»
4 месяца назад, # |
Rev. 2   Проголосовать: нравится +2 Проголосовать: не нравится

I will kill myself over B. UPD: Found my error

»
4 месяца назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

I spent lot's of time considering 1:0 situations in problem B.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

fast editorial

»
4 месяца назад, # |
  Проголосовать: нравится +25 Проголосовать: не нравится

Clarification: SlavicG and I actually are best friends, he's just playing hard to get.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

In problem E, my code was giving me expected/correct output in my local machine, but is giving wrong output during codeforce's testing 274941437

Could any one tell why is that?

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

    try using c++20 and then you will probably get wa on test2

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

    Maybe different machine use different implement causing the different output ? Better not use log in this problem I guess, I stuck on that too.

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

      hm, might be. My solution for d also passed test 1 but could not other ones,sad.

      But all in one, I am happy to solve atleast few :D

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

    probably rounding errors with log. safer not to use log when you dont have to

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

    Try not using log

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can't believe how much bad this one went

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

G1<<E or F

»
4 месяца назад, # |
  Проголосовать: нравится -6 Проголосовать: не нравится

can anyone help me, for which test case my code didn't work

//this code

#include<bits/stdc++.h>

using namespace std;

int main(){
    int t;
    cin>>t;
    while (t--)
    {
        int a1,a2,b1,b2;
        cin>>a1>>a2>>b1>>b2;
        int x1 = min(a1,a2), x2 = max(a1,a2);
        int y1 = min(b1,b2), y2 = max(b1,b2);

        if(x1==x2 && y1==y2 && x1==y1){
            cout<<0<<endl;
        }

        else if(x1>=y2){
            cout<<4<<endl;
        }

        else if(x2<=y1){
            cout<<0<<endl;
        }

        else{
            cout<<2<<endl;
        }
    }
    
    return 0;
}
  • »
    »
    4 месяца назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Bro your code is correct only with the first case

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

      Can you tell me where I am wrong? I don't know where I am wrong, for which test case my code is not working

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

    you should add else if(x2<y2||x1<y1) cout<<0<<endl;

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

      but bro the example you take 2 2 3 3,

      x1 = 2 and y1 = 3

      x2 = 2 an d y2 = 3

      the output for above example is 0 and my code gives the 0 as output

      • »
        »
        »
        »
        4 месяца назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
        Code

        Bro try this code. i just added a corner case to your code.

  • »
    »
    4 месяца назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    for example: 1 2 1 2, your answer is 2, but current answer is 0;
    1 3 2 2, your answer is 2, but current answer is 0;

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

my idea in D was right but i didn't code it

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

can someone help me with what's wrong with my solution of B?

Spoiler
»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I had the same intuition for F but I got stuck and I had no idea why my code was failing for the last provided test case. Values seem fine, but it keeps dumping to stack trace, isn't it just a O(n) loop with my factorials memoized?

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;

#define debug 1

const ll limit = 2e5;
const ll mod = 1e9+7;

template<typename... Args>
void mycout(const Args&... args) 
{
    #if debug
    ((cout << args << ", "), ...); // Fold expression
    cout << endl;
    #endif
}

unordered_map<ull, ull> factorials;

const ull factorial(const ull n) 
{
    if (n <= 1) 
        return 1;

    if(factorials.contains(n))
        return factorials[n];

    factorials[n] = n * factorial(n-1);

    return factorials[n];
}

const ull pickKFromN(const ull n, const ull k)
{
    if(n <= 0)
        return 0;

    const ull top = factorial(n);
    const ull btm = factorial(k) * factorial(n-k);
    
    return top/btm;
}

int main()
{
    ios::sync_with_stdio(false); 
    cin.tie(0); 
    cout.tie(0);
    
    ll t;
    cin >> t;

    while(t--)
    {
        // k is odd
        ll n,k;
        cin >> n >>k;

        vector<ll> v(n);
        ll sum{};

        
        for(ll i{}; i < n; ++i)
        {
            cin >> v[i];

            sum = (sum + v[i]) % mod;
        }

        if(k == 1)
        {
            cout << sum << endl;
            continue;
        }

        sort(v.begin(),v.end());
        
        // eg 3 will be 2th element so index 1
        ll medianIndex = (k == 1 ? 0 : (k+1)/2 - 1);
        
        if(k == n)
        {
            cout << v[medianIndex] << endl;
            continue;
        }

        ll result{};

        // given median index
        // i can pick index elements on the left
        // then pick k - 2

        /*
            6 3
            1 0 1 0 1 1
            
            medianindex == 1
            0 0 1 1 1
              ^

            1*2*2 == 4
            1*3*1 == 3
            

            0 0 1 1

            i1 : 
        */
        
        for(ll i{medianIndex}; i < n; ++i)
        {
            if(v[i] == 0)
                continue;

            const ull leftElements = i;
            const ull rightElements = n-i-1;

            const ull pickLeft = medianIndex;
            const ull pickRight = k-(medianIndex+1);

            const ull left = pickKFromN(leftElements,pickLeft) % mod;
            const ull right = pickKFromN(rightElements,pickRight) % mod;
            const ull combined = (((v[i] * left) % mod) * right) % mod;
            
            mycout(i,result,combined);
            mycout(leftElements,pickLeft,left);
            mycout(rightElements,pickRight,right);
    
            result = (result + combined) % mod;
        }

        cout << result << endl;
    }

    return 0;
}
»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
from math import *
for _ in range(int(input())):
  l,r=map(int,input().split())
  ans=0
  if l<3:
    ans=1
  else:
    if power(l):
      ans+=ceil(log(l,3))+1
    else:
      ans+=ceil(log(l,3))
  before=ans
  print(ans,"BEFORE")
  for i in range(l+2,r+1):
    if power(i):
      ans+=ceil(log(i,3))+1
    else:
      ans+=ceil(log(i,3))
  print(ans,"AFTER")
  if r>l:
    ans+=ceil(log((3*before)*(l+1),3))+(1 if power((3*before)*(l+1)) else 0)
  print(ans,"ANSWER")

Got the Logic Couldn't make it up.

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

    You have to use floor instead of ceil. The bigger problem here was many people getting WA on test 2 i.e. 1 243, this happened because of the definition of log function which uses natural log to calculate the log of any number. This causes errors due in precision and floating point arithmetic in some cases. So either the better way is to just do repeated floor division by 3, or by changing how log3 is implemented. I defined log3(n) = log2(n)/log2(3) which worked better because log2 works with binary which means better precision and less errors.

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

      because r <= 2e5, you can do the array f[n] = ceil(log(n)), then f[i] = f[i/3] + 1, with f[0] = 0

»
4 месяца назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

In editorial of G2 , if a < x <= b, area should be a * (b + 1) but given (a+1) * b. May be it's a Typo SlavicG

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I think G1 and G2 were much easier than E and F... the most basic binary search in both versions

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

    they're equally easy... it's just in F you should be more careful when preprocessing the factorial and the inverse array, while in E, G1 and G2 it's much easier to implement the idea, which was already easy before

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

      I suppose you're right. It's just that to me F-like problems (with combinatorics etc.) are very difficult

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Why my code 274894324 is getting WA on E? I did all exactly as in editorial

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

i swear to god B took more time than A,C,D,E

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Should've been able to solve E. But we move

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Need to improve my comprehensive understanding of paragraphs , spend a lot of time on B,

missed the point that only one win is enough when the second one is draw (missed this one)

»
4 месяца назад, # |
Rev. 2   Проголосовать: нравится +4 Проголосовать: не нравится

Just got an observation for E:
[1, 3) -> all elements require 1 operations to become 0
[3, 9) -> all elements require 2 operations to become 0
[9, 27) -> all elements require 3 operations to become 0
[27, 81) -> all elements require 4 operations to become 0
[81, 81 * 3) -> all elements require 5 operations to become 0
and so on.

I think this could be optimal.

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

    This is exactly the idea I used in my solution 274869114

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

      I was not left with enough time since stucked in correcting B :(
      Btw your implementation is good.

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

    Yes, this can reach $$$O(\log\log n)$$$ complexity and also feasible to $$$r\le 10^{18}$$$.

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

    This is what I did too, although I ended up writing extremely messy code.

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

    actually this is only needed in the preprocessing phase so it won't improve the code much. also, the complexity goes from O(N + n) to O(log(log(N)) + n(log(n)), which is worse.

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

    another way would be to use dp, precompute the value for each number and then just add it by a for loop for the required l, r

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I love E, F, G2. Brilliant idea!!!

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone tell me how to test our code for an interactive problem?

  • »
    »
    4 месяца назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    You can write an answer function according to the description of problem. Then use it to simulate this whole process. Check my submission if you know python.

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

      Thanks for the reply!!

      But I did not quite understand it.

      Would be great if I could find a C++ solution for that.

»
4 месяца назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

For problem E why is this O(n) code getting TLE?(https://codeforces.net/contest/1999/submission/274854161)

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

    i dont think O(n) solutions passed, they used O(n) to precompute and then O(1) for each test case

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

    Sum of $$$r-l$$$ is not bounded by $$$10^5$$$

    For instance, $$$l=1, r=10^5$$$ can be given $$$10^4$$$ times. In that case, your approach will TLE

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

      I don't understand. The time limit given in questions is 'per test case', then how do we analyze multiple test cases? Shouldn't O(n) for l = 1, r = 10^5 always pass in 1 second?

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

        No, the time limit is per test file, not per test case. If $$$t = 10^4$$$, your code must solve all the $$$10^4$$$ test cases within the time limit. (If the code was allowed $$$1$$$ second to run per test case, it would take at most $$$10^4$$$ seconds to finish all the cases, which is obviously infeasible.)

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

    The problem doesn't guarantee the sum of $$$r-l$$$ is below $$$2\times 10^5$$$

»
4 месяца назад, # |
Rev. 5   Проголосовать: нравится 0 Проголосовать: не нравится

In G2, those who didn't understand how we are calculating value of a and b, here is the explanation:

Let, l < a < b < r, where a-l ≈ b-a ≈ r-b ≈ x, consider differences are almost same

So, we can say that r-l = 3x, where x = (r-l)/3, a = l + x, and b = l + 2x.

Hence, a = (2*l + r)/3 and b = (l + 2*r)/3

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

got humbled :'(

»
4 месяца назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

I'm so used to "Sum of n over all cases doesn't exceed $$$ 2 \times 10^5 $$$ " :)

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I always thought I didn't need them yet, till maybe Spclist or Xpert. After reading the editorial, now i feel pitiful not learning how to do interactive problems earlier.

»
4 месяца назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

In which test case my submission 274924034 for E is failing.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can some one tell the failing testcase for problem B for this code


#include<bits/stdc++.h> using namespace std; #define int long long int mod=1000000007; int MAX_INT=2147483647; int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t; cin>>t; while(t--){ int a1,a2,b1,b2; cin>>a1>>a2>>b1>>b2; int ans=0; if(a1>b1 && a2>=b2) ans++; if(a2>b1 && a1>=b2) ans++; if(a1>b2 && a2>=b1) ans++; if(a2>b2 && a1>=b1) ans++; cout<<ans<<endl; } return 0; }
»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I dont understand why this gives wrong ans; E

Your code here...
int fun(ll x){
  int count = 0;
  while(x){
    count++;
    x = x/3;
  }
  return count;
}

void solve() {
  ll l, r;
  cin >> l >> r;
  ll ans = 0;
  ans += fun(l);
  ans+= fun(3*ans*(l+1));
  for(int i = l+2; i <= r; i++){
    ans+=fun(i);
  }
  cout << ans << endl;
}
»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Why is my D solution so slow? 274970418 I am using the same two pointer strategy that the editorial mentions and get TLE every time. I have a single loop iterating through the string and that is it. Am I using any expensive operations without realizing it? Thanks in advance.

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

    In java, adding a letter to the end of a string is an O(n) operation, as it creates an entirely new string.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

F is a pretty simple combinatorics problem, and G1 is a simple binary search. However I somehow failed to solve those problems in the contest :(

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone tell that why in E O(n log n) doesn't work ? To be precise the overall complexity would be 2.5*10^6, which should pass in 1 sec. ? isn't it?

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

    'cuz the complexity is actually $$$O(tn\log n)$$$. Usually the problem guarantees the sum of $$$n$$$, $$$m$$$, etc. doesn't exceed $$$2\times 10^5$$$, but this problem does not.

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

    because sum of r-l over all test cases isnt guaranteed to be under 2*10^5, so your code runs in O(t*n*logn)

»
4 месяца назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

I got another simpler setup approach to E, perhaps.

We will make an array of the exponentiation of 3, like lt[0] = 1, lt[1] = 3, lt[2] = 9, lt[3] = 27, ..., lt[15] = 3^15. (Because r <= 2 . 10 ^ 5)

We will make a prefix sum before making the testcase. For each i, call j is the smallest number satisfying a[i] >= lt[j], (1 <= j <= 15).

For example, a[1] = 1, a[2] = 1, a[3] = 2, a[4] = 2, ..., a[8] = 2, a[9] = 3, a[10] = 3, ... After that we will make a prefix sum of a[] called f[]. For instance, f[1] = 1, f[2] = f[1] + a[2] = 2, f[3] = f[2] + a[3] = 4, ...

For each n, m in the testcase, to find the minimum operation needed, while n, m is typed from the keyboard, the answer will be pre[m] — pre[n-1].

Then plus the a[n], as we have to make n become 0 to minimize the operations, the final thing to do is f[m] — f[n-1] + a[n].

Link: My sub

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

    this is actually the same as the editorial, it's just you're adding two pointer to it. but it's still better, as you're precomputing in O(n). another similar idea is that you build the a[] array like this: a[i] = a[i/3] + 1 for all 1 <= i <= 2e5

»
4 месяца назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone help me find out the bug in my code for problem D? It passed all testcases, but it got hacked, and I don't know how to find the specific testcase in which it failed at.

https://codeforces.net/contest/1999/submission/274881476

Thanks in advance! If this is against the rules of the contest, please let me know so I can delete this comment.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

You know for the Showering question how did you not get a memory exceeded error??

#include <bits/stdc++.h>

using namespace std;


int main(){
  cin.tie(nullptr)->sync_with_stdio(false);
  int t,n,s,m;
  cin >> t; 
  int start, end;
  vector<int> time; 
  while (t--){
    time.clear();
    cin >> n >> s >> m;// 0 is free and 1 is busy
    while (n--){
      cin >> start >> end;
      while(start < end){
        time.push_back(start);
        start += 1;
      }
    }
    sort(time.begin(), time.end());
    int free_time = time[0];
    for (int x = 0; x<time.size() - 1; x++){
      if (time[x+1] - time[x] > 1 && time[x+1] - time[x] > free_time){
        free_time = time[x+1] - time[x] - 1;
      }
    }
    if (m - time[time.size()-1] - 1 > free_time){
      free_time = m - time[time.size() - 1] - 1;
    }
    if (s <= free_time){
      cout << "YES" << "\n";
    }
    else{
      cout << "NO" << "\n";
    }
  }
  return 0; 
}

I am also using a linked list to store the timings which aren't available. But test case 3 threw a memory exceeded error.

»
4 месяца назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

in the problem E as the editorial said f(x) = 1 + Math.floor(log(x) in base 3) then why the below code is giving wrong answer

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

    The set of representable numbers on fixed floating point arithmetic is finite, and numbers that do not belong to it are rounded to the nearest representable number. Hence, usually it is difficult to keep perfect precision while doing floating point operations as it can behave in unexpected ways.

    See this relevant blog: https://codeforces.net/blog/entry/78161

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

    I have the same error and take two hours to fix :))))) you can rewrite the log func with long long parameter.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

E is good, but isn't the data range a bit small? Many $$$O(Tn)$$$ algorithms can pass this problem, and it's hard to hack them.

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

    Can this solution pass higher constraints? Link

  • »
    »
    4 месяца назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    You cannot have a $$$\mathcal{O}(Tn)$$$ algorithm for Problem E as the statement does not guarantee that the sum of all $$$n$$$ over all test cases does not exceed $$$2 \times 10^5$$$.

    A $$$\mathcal{O}(Tn)$$$ algorithm could easily reach $$$2 \times 10^9$$$ iterations at worst, which is certainly not optimal to pass all tests under the time constraints imposed.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

For Problem E, I am running a loop here of size (b-a+1) each time. I tried hacking my solution on max size testcase $$$10000 \newline 1\;200000\newline....\newline....\newline1\;200000\newline$$$ . I don't know this solution got accepted? Can anybody tell the reason for the same or else try to hack it?

Submission link

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

    the compiler isnt that stupid, it can optimize out obviously unnecessary parts

  • »
    »
    4 месяца назад, # ^ |
      Проголосовать: нравится -8 Проголосовать: не нравится

    Firstly, you can't share hacks. Secondly, as the code works in $$$O(r - l)$$$ per test, the max amount of operations is 1e4 * 2e5, which is 2e9 operations, which is just enough to pass.

    • »
      »
      »
      4 месяца назад, # ^ |
        Проголосовать: нравится +4 Проголосовать: не нравится
      • Why can't you share hacks?

      • 2e9 operations shouldn't pass in 1 second. That part of the code is obviously optimized by the compiler.

      • »
        »
        »
        »
        4 месяца назад, # ^ |
          Проголосовать: нравится -10 Проголосовать: не нравится

        The hacking phase is still running, Posting your hack is technically the same as sharing your solution during the contest.

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

        You can't simply count the number of operations to decide whether it will run in a specific time or not. The 'weight' of an operation depends on many other aspects than just a simple number of CPU instructions, and in this case the naive part is a very very light one, because it's about simply iterating and summing through an array in order, which leads to perfect cache hit rates and doesn't include any kind of heavy operations. 2e9 of such operations can mostly fit in time with computers nowadays.

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

          But now that I see it, that specific solution is just compiler-optimized, and it didn't actually run the loop 2e9 times.

    • »
      »
      »
      4 месяца назад, # ^ |
      Rev. 4   Проголосовать: нравится +3 Проголосовать: не нравится

      Can I see where it is stated that open hacks can't be shared? It's a post-contest hack where people can discuss the solutions, so I don't see why the test part can't be discussed. Hacks don't even give additional points. I've never seen discussion on open hacks being prohibited by anyone before.

      Sometimes, the hack tests are added to the main tests early during the phase and people can see them so they're not even guaranteed to be private.

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

        Also, I think the main purpose of having an open hack phase is to strengthen the tests by making anti-tests against actual participants' solutions, because it is easy to miss them when you don't have enough samples to work with. For this purpose the discussion on hacks shouldn't be discouraged.

        • »
          »
          »
          »
          »
          4 месяца назад, # ^ |
          Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

          Noted! Learn from mistakes. I just was referring to

          ...

          • will not communicate with other participants, share ideas of solutions and hacks

          ...

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

Harder Version of F if anyone wants to try. Sum of Medians

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can any one give me more explain for problem F , i did not Understand tut :(

  • »
    »
    4 месяца назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    yes, so basically a median from a subsequence is counted into sum only if the median is 1. So for having median of a subsequence of length k we need to have greater than or equal to (k+1)/2 number of 1s in the subsequence (since k is odd). For example if we have k=5 then we need to have at least three 1s in our subsequence. So for every array we try to find the number of ways of collecting at least (k+1)/2 1s and remaining 0s. For that we're using combinatorics...... For example, let's suppose n=10, k=5, and we have 7 ones and 3 zeroes. So, for having median 1 in subsequence of length 5 we need either 3 ones or 4 ones or all 5 ones in our subsequence. We'll sum up all 3 cases..... 1.) 3 ones out of 7 ---> 7C3, rest 2 elements in our subsequence must be zeroes, so 2 (k-ones) zeroes out of 3 --> 3C2, so this can be arranged in (7C3)*(3C2) ways. Similarly for the rest of the cases....

    This basically gives the formula inside the for loop:-

    Code

    link to my submission

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

      Hi, still very confused about this. Why does the median being 1 == there has to be at least k + 1 /2 1s? Can't it just be 1 in the middle, and 0s on both sides?

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I solved E without DP, iteratively and a bit of maths.. My Solution

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I spent much time on D,at first,i don't kown the meaning of it,due to this,i don't have time to solve E

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

For F, with x numbers 1, this formula $$$\binom{x}{k/2+1} * \binom{n-(k/2+1)}{k/2}$$$ is correct?

The logic is that we take $$$k/2+1$$$ from $$$x$$$ numbers of 1, and whatever others elements are(taking $$$k/2$$$ from the left $$$n - (k/2+1))$$$ the median will be 1

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can someone solve E when l and r are large i.e upto 1e18 it could possibly turn out to be a good math problem.Please do write if you have any idea on how to do it?

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Problem B is unreasonable

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I really appreciate problem E. I have seen the pattern: "To use the fewest number of operations possible, we should do the first step on the minimum number, since it has the fewest digits." after writing down a few cases, but I failed to come up with prefix sum part.

Thank you. Now I learn.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone let me know why this gives TLE.Even the solution code precomputes till 2e5.275010837

»
4 месяца назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

In problem E, function $$$f$$$ takes $$$O(\log_3 x)$$$ to compute on a number $$$x$$$, so your complexity is $$$O(n \log n)$$$, not $$$O(n)$$$. However, there is a simple way to compute $$$f(1), f(2), \ldots, f(n)$$$ in $$$O(n)$$$ overall, without utilizing any expensive math functions: notice that $$$f(x) = f(\lfloor x / 3 \rfloor) + 1$$$. The code is even shorter than before: 275014438.

»
4 месяца назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

why this code is giving me a TLE question E /*#include<bits/stdc++.h> using namespace std;

define ll long long

vectorv; void seiv(){ ll cnt=1; v.push_back(0); while(cnt<=200000ll){ v.push_back(cnt); cnt*=3; } } int main(){ seiv(); ll t; cin>>t; while(t--){ ll l,r; cin>>l>>r; ll ans=(upper_bound(v.begin(),v.end(),l)-v.begin()-1); ll c=ans; for(ll i=l;i<=r;i++){ if(v[c+1]==i){ c++; } if(v[c]<=i){ ans+=c; } } cout<<ans<<endl; } } */

»
4 месяца назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

G2 is just introduction to ternary search.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

can anyone tell why my e code of o(n) is giving tle ? :- https://codeforces.net/contest/1999/submission/274942317

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I regret not studying interactive problems!

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <ctype.h>
#include <queue>
#include <cstring>
#include <set>
#include <bitset>
#include <map>
#include <chrono>
#include <random>
#include <unordered_map>
#include <stdio.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef std::vector<int> vi;
typedef std::vector<bool> vb;
typedef std::vector<string> vs;
typedef std::vector<double> vd;
typedef std::vector<long long> vll;
typedef std::vector<std::vector<int> > vvi;
typedef vector<vll> vvll;
typedef std::vector<std::pair<int, int> > vpi;
typedef vector<vpi> vvpi;
typedef std::pair<int, int> pi;
typedef std::pair<ll, ll> pll;
typedef std::vector<pll> vpll;

const long long mod = 1000000007;
//ll gcd (ll a, ll b) {return b==0 ? a : gcd(b, a%b);}
//const unsigned gen_seed = std::chrono::system_clock::now().time_since_epoch().count();
//std::mt19937_64 gen(gen_seed);

#define all(c) (c).begin(),(c).end()
#define srt(c) sort(all(c))
#define srtrev(c) sort(all(c)); reverse(all(c))
#define forn(i, a, b) for(int i = a; i < b; i++)
#define read(x) scanf("%d", &x)
#define readv(x, n) vi x(n); forn(i,0,n) scanf("%d", &x[i])

#define pb push_back
#define mp make_pair


void solve ( ) {
ll l = 2 , r = 999  ;


               while ( r -l > 1  ){
                        ll mid = ( l+r)/2 ;

                        cout << "? 1 "<< mid << endl;

                       ll val ;

                       cin >> val;

                       if ( val == (mid+ 1)) {
                        r = mid ;
                       }
                       else {
                        l = mid ;
                       }


               }
        cout << "!" << " " << l+1 << endl;

}
int main()
{
#ifdef LOCAL
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
#endif

	ios::sync_with_stdio(false);
	cin.tie(nullptr);

    int ta;
    scanf("%d\n", &ta);

    forn(ifa,0,ta) {


        solve ( ) ;


    }


}

why this code is giving idelness ?

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

can anyone help me with this code of f? is this correct approach or not?

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define int long long int
int f(int i,int ones,int zeros,vector<int>&v,vector<vector<vector<int>>>&dp,int k,int m){
    if(k==0){
        if(ones>zeros)return 1;
        else 0;
    }
    if(i>=v.size())return 0;
    if(dp[i][ones][zeros]!=-1)return dp[i][ones][zeros];
    int a=0,b=0;
    if(v[i]==1){
        a=a+f(i+1,ones+1,zeros,v,dp,k--,m);
    }
    else{
         a=a+f(i+1,ones,zeros+1,v,dp,k--,m);
    }
    b=b+f(i+1,ones,zeros,v,dp,k,m);
    
    return dp[i][ones][zeros]=(a+b)%m;
    
}

int32_t main() {
    
    int t;
    cin>>t;
    while(t--){
        int n,k,one=0,zero=0;
    cin>>n>>k;
    vector<int>v;
    for(int i=0;i<n;i++){
        int a;
        cin>>a;
        v.push_back(a);
        if(a==1)one++;
        else zero++;
    }
    int m=1e9+7;
    vector<vector<vector<int>>>dp(n+2,vector<vector<int>>(one+2,vector<int>(zero+2,-1)));
    int ans=0;
       ans=f(0,0,0,v,dp,k,m)%m;
        cout<<ans<<endl;
        
    }
    
    
    
    return 0;
}
»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

task b literally sent me into a deep dark depression

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
#include <bits/stdc++.h>
using namespace std;
#define int long long


void solve(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int cnta=0,cntb=0;
    if(a>c&&a>d&&b>c&&b>d){
        cout<<4<<endl;    }
    else if((a>c&&b>d)||(a>d&&b>c)){
        cout<<2<<endl;
    }
    else if((a>c&&b==d)||(a>d&&b==c)||(b>c&&a==d)||(b>d&&a==c)){
        cout<<1<<endl;
    }
    else
    cout<<0<<endl;
}
int32_t main() {
	int t;
	cin>>t;
	while(t--){
	    solve();
	}

}

Can someone help which testcase I am missing

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

    Well, the answer can only be 0, 2, 4. For any game, we have a selection of Round 1 and Round 2 for which we won, we can change the order to the rounds(Round 1 as the second round and vice versa). And ordering doesn't here doesn't change the winner.

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

      Got it,Thanks

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

        A simple solution :

        int point_for_round(int diff){
            if(diff == 0) return diff;
            return diff> 0 ? 1 : -1;
        }
        
        void solve(){
            int a1,a2,b1,b2;
            cin>>a1>>a2>>b1>>b2;
         
            int ans = 0;
            ans += (point_for_round(a1-b1) + point_for_round(a2-b2) > 0 ? 1 : 0);
            ans += (point_for_round(a1-b2) + point_for_round(a2-b1) > 0 ? 1 : 0);
         
            cout<<ans*2<<endl;
        };
         
        int main(){
            int t;
            cin>>t;
            while(t--){
                solve();
            }
            return 0;
        }
        
»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

The code I have for problem 1999E functions properly in ide (usaco,sublime), but it returns an incorrect answer in testcase 1. 1999E - Triple Operations

i get all correct answer for testcase 1 but the judge return Wrong Answer solution id:

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

When will we get the rating updates? Im kinda excited

»
4 месяца назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

hey all, for problem E, why does the following not work?

code

the idea is :

  1. first, i find the number of operations to obtain the first 0 from L

  2. for all other numbers, i calculate the number of operations required to reach 0 as well

  3. i sum the number of operations required for all other numbers + the additional operations due to making L into 0

thank you in advance !

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I never saw a question like E problem which fails for O(nt). Weird question

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can somebody point out what is wrong?: 274922968

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

If problem F was to count odd length subsequences having median as 1. What can be the solution?

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Is there a standard rating criteria for div 4 problems? I've noticed that the last div 4 contest you organized had the last task as a 2100-rated 2-SAT problem, while this one had the last two tasks being standard binary and ternary search problems. Both were fun btw so thanks :)

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

help me in B ~~~~~~~~~ int Solve() { int a1,a2,b1,b2; cin>>a1>>a2>>b1>>b2; int ans=0; if(a1>b1){ if(a2>b2){ ans+=2; }else if(a2==b2){ ans+=1; } }else if(a1==b1){ if(a2>b2){ ans++; } } if(a1>b2 ){ if(a2>b1){ ans+=2; }else if(a2==b1){ ans+=1; } }else if(a1==b2){ if(a2>b1){ ans++; } }

return ans; } ~~~~~~~~~~~~~~~~ This is my solution for B problem and i am not able to understand why it is failing i have covered all the possible cases can anyone please help me!

»
4 месяца назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone help me out with my code for card game question in java

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

int wins = 0;

        if(a1>b1&&a2>b2)
        {
            wins+=2;
        }
        if(a1>b2 && a2>b1)
        {
            wins+=2;
        }
        System.out.println(wins);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

It is inconceivable that the solution to my problem E was not successfully hacked.Obviously O (nT) solutions should be given to TLE.But in 37 hacks, no one succeeded.I feel like I will be given TLE in the final test due to excessive time

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Alternate solution to problem E, works in O(log3(r))

Basically make the smallest element (l) zero and then use that to make other elements zero as well. While we were making l zero (divide by 3k), we also multiplied some element by 3k and hence first we remove that. Then we just iterate over different powers of 3 (since they decide how many times we divide a number to make it zero) and find number of elements to divide by that number (the power tells us number of times this division is required)

`void tripleOperations(int l, int r)`
`{`
`    vector<int> power3;`
`    power3.push_back(1);`
`` 
`    while (power3.back() <= r) power3.push_back(3 * power3.back());`
`    int const n = power3.size();`
`` 
`    int ix = upper_bound(power3.begin(), power3.end(), l) - power3.begin();`    
`    long long ans = 2*ix;`
`    l++;`
`` 
`    while (ix <= n-1)`
`    {`
`        ans += (min(r, power3[ix] - 1) - l + 1) * (ix);`
`        l = power3[ix];`
`        ix++;` 
`    }`
`` 
`    cout<<ans<<'\n';`
`}`
»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

its more than 24 hours contest had been ended, still the result is not out yet. Why?

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Rating not updated

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

In E,my submission fails at test case 1, where as it works well in my local machine as well as in online cpp shell. Can anyone let me know why it happened, Thanks.

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

    using log function might be the case it create inconsistencies you could have used while loop to count same thing

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone help me in G2? I am getting wrong answer Integer 0 violates the range [1, 1000] (test case 1) in Test 1. I even manually wrote exceptions, that if my variable is 0, output 1 instead. Still, I do not know why I am getting output 0 https://codeforces.net/problemset/submission/1999/275154103

»
4 месяца назад, # |
Rev. 6   Проголосовать: нравится 0 Проголосовать: не нравится

275163443

Why my this solution for E giving me TLE? Isn't this only O(N)?

Thanks :)

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

    O(N) will give TLE as there is no limit across all test cases. So, O(N) will take t*(r-l)= 2*10^9. Think. you can do much better than O(N)

»
4 месяца назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

why did i use RMQ on E? :skull:

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Thanks for the problem G2.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

275239437 why is this giving me TLE while i have the exact same logic as the solution

»
4 месяца назад, # |
Rev. 17   Проголосовать: нравится 0 Проголосовать: не нравится

In this contest, the question was just about if else and due to which it matched with some one. How can you declare that I was cheating in that contest. Please look into this matter. Thanks mine : aritg/274372105 23CS02002/274399627

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Got stuck at problem E :( found the logic but was trying to implement it in a complicated manner.

thanks for this wonderful contest and fast editorial.

»
4 месяца назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Can any one tell me what is the mistake in the code for G2 275301648

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

can anybody please tell me why my G2 is giving TLE?

It does not give TLE if I run a loop for 6 times. Why r-l > 2 gives TLE? I know sometimes it can get stuck when l and r remains same. But with my logic, l and r will must change, hence the loop will end.

275323221

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

getting the detail right on problem b was so easy yet frustrating

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I'm not sure if anyone else said this already but the title for the tutorial of 1999G2 isn't translated to english

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

In G2, according to the solution, would there be 8 queries in worst case (binary search has 7 and the if condition of r-l=2 has 1 query) Can anyone explain?

»
4 месяца назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

"E. Triple Operations" my code is giving different answer on codeforces compiler and vs code in my machine. I also checked on online c++ compiler it is showing exactly same as vs code output but codeforces is giving wrong answer. Please Help.!

Code: ~~~~~

include<bits/stdc++.h>

using namespace std;

define endl "\n"

define int long long

signed main(){ ios_base::sync_with_stdio(false); cin.tie(0);cout.tie(0); int t; cin >> t; while(t--){ int l,r; cin >> l >> r; float ans=0.0; if(l == 1){ ans = 2.0; } else{ ans = ceil(log(l)/log(3)); ans *= 2; }

for(int i=l+1; i<=r; i++){
    ans += ceil(log(i)/log(3));
    if(ceil(log(i)/log(3)) == log(i)/log(3)){
      ans++;
    }

  }
  cout << (int)ans << "\n";
}

} ~~~~~

for the input l = 19 & r = 84 it is giving ans = 262 but in vs code as well as in online c++ compiler it is showing 263 which is correct. please help.

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

can anyone help me with Triple Operations problem: https://codeforces.net/contest/1999/submission/276881314

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Alternative solution for A, write an if statement for each of the 90 possible inputs. This is very efficient because you don't use a for loop or any other costly operation such as division or modulo. My code: https://codeforces.net/contest/1999/submission/277148166

»
4 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

knew G2 is ternary search but can't implement :skull:

»
2 месяца назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

i can't understand E. this methods is so difficult for me