Wonsei's blog

By Wonsei, history, 4 years ago, In English

Help I gained 30 points that round

I should be purple..

the color blue is bringing me PTSD..

plz fix QwQ

Full text and comments »

  • Vote: I like it
  • +63
  • Vote: I do not like it

By Wonsei, history, 4 years ago, In English
#include <iostream>
#include <cstring>

using namespace std;

int main() {
	int ll = 1, rr = 1000000;
	int ans;
	while (ll <= rr) {
		int mid = (ll + rr) / 2;
		cout << mid;
		fflush(stdout);
		string s;
		cin >> s;
		if (s == ">=") {
			ans = mid;
			ll = mid + 1;
		}
		else {
			rr = mid - 1;
		}
	}
	cout << "! " << ans;
	fflush(stdout);
	return 0;
}

This is an easy interactive question that guesses the number 1 to 1000000 by binary search. However, I am new to the concept of interactive problems, and I am getting an idleness TLE on this problem. Can someone tell me what is causing the Idleness on my code? Thanks in advance.

Problem statement : https://codeforces.net/gym/101021/problem/1

Full text and comments »

  • Vote: I like it
  • +1
  • Vote: I do not like it

By Wonsei, history, 4 years ago, In English

Problem : https://atcoder.jp/contests/abc171/tasks/abc171_f

Ill explain my idea below with the first example.

_______ o ___________ o ________ f __________

we are able to place letters in the 4 slots here.

Lets say that we place a letters on the first slot, b letters on the second, c letters on the third, and d letters on the fourth slot. therefore, a+b+c+d = n.

The first slot is free to place slot -> we have 26^a ways to put it.

The second slot, third slot, fourth slots have a restriction; you cannot place the letter that is at the left of the slot. (you can't place o in the second, third slot, you can't place f in the fourth slot) -> by this restriction, we can prevent duplicates being counted. -> ex) ooaoaaof -> this will be only counted one time. -> therefore, there's 25^(b+c+d) = 25^(n-a) ways to put in the slots.

if a is 0, b+c+d = n. the ways to distribute numbers to b, c, d is H(3,n)=C(3+n-1, n).

if a is 1, b+c+d = n-1. the ways to distribute numbers to b, c, d is H(3,n-1)=C(3+n-1-1, n-1)

...

if a is n, b+c+d = 0 the ways to distribute numbers to b, c, d is H(3,0)=C(3+0-1, 0).

-- therefore the total = sigma k=0 to n (26^k * 25^n-k * H(len(S),n-k))

there was my logic, and I coded it but it came with a result of only 70 out of 100.

Can someone help me finding the counterexample?

Code below:

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <climits>
#include <set>
#include <map>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <list>
#include <ctime>
#include <complex>
#include <bitset>
#include <tuple>

#define ff first
#define ss second
#define MOD 1000000007LL

using namespace std;
using pii = pair<int, int>;
using ll = long long;

vector<ll> f(3000000);

tuple<ll, ll, ll> exgcd(ll a, ll b) {
    if (b == 0)
        return make_tuple(a, 1, 0);
    ll g, x, y;
    tie(g, x, y) = exgcd(b, a % b);
    return make_tuple(g, y, x - (a / b) * y);
}

ll moddiv(ll a, ll b)
{
    ll bb;
    tie(ignore, bb, ignore) = exgcd(b, MOD);
    if (bb < 0) b += MOD;
    return (a * bb) % MOD;
}

ll getC(int a, int b)
{
    if (a < b) return 0;
    return moddiv(moddiv(f[a], f[a - b]), f[b]);
}

ll getH(int a, int b)
{
    return getC(a + b - 1, b);
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    f[0] = 1;
    for (int i = 1; i < f.size(); i++) f[i] = (f[i - 1] * i) % MOD;

    int k;
    cin >> k;
    string s;
    cin >> s;
    ll answer = 0;
    vector<ll> p26(k + 1), p25(k + 1);
    p26[0] = p25[0] = 1;
    for (int i = 1; i <= k; i++) {
        p26[i] = (p26[i - 1] * 26) % MOD;
        p25[i] = (p25[i - 1] * 25) % MOD;
    }
    for (int i = 0; i <= k; i++) {
        ll tmp = (p26[i] * getH(s.length(), k - i)) % MOD;
        tmp = (tmp * p25[k - i]) % MOD;
        answer = (answer + tmp) % MOD;
    }
    cout << answer;

    return 0;
}

Full text and comments »

  • Vote: I like it
  • +1
  • Vote: I do not like it

By Wonsei, history, 4 years ago, In English

https://codeforces.net/contest/1335/problem/E1

When I run the test, it keeps going well, and suddenly it fails on test 10 data 596 or something, so I cannot see what test case is causing the problem. Im asking for help after 3+hours of coding ! Id really appreciate any help.

Source code below, with detail;

It works on almost all cases, but there seems to be a counterexample that I seem to be missing. Thanks :)

#include <iostream>
#include <vector>
 
using namespace std;
 
int min_num(int a, int b)
{
    return a<b ? a : b;
}
void solve()
{
    int n;
    int a[200002];
    vector<int> cnt[202];
    int ccnt[200002]={0,};
    cin >>n;
    int i,j,k;
    for(i=1 ; i<=n ; i++)
    {
        cin >>a[i];
        cnt[a[i]].push_back(i); 
//this cnt stores the location of each number
//ex) 1 1 3 3 2 1 -> cnt[1] = 1, 2, 6  cnt[2] = 5, cnt[3] = 3, 4
        ccnt[a[i]]++;
    }
    int cntmax = 0;
    for(i=1 ; i<=200000 ; i++) if(cntmax < ccnt[i]) cntmax = ccnt[i];
// this for loop is for a palindrome that uses only 1 kind of number, so the number
// with the most count is the longest palindrome
// realmax is where the final answer will be stored
    int realmax=cntmax;
    for(i=1 ; i<=200 ; i++) // middle part of palindrome
    {
        for(j=1 ; j<=200 ; j++) // left/right part of palindrome
// I am searching for the longest palindrome which uses i as the left/right part
// and j as the middle part such like i i i j j j j i i i
        {
            int max = 0;
            if(i!=j && cnt[i].size() > 0 && cnt[j].size() > 0)
            {
                vector<int> b;
                int l=0;
                
                for(k=0; k<cnt[i].size() ; k++)
                {
                    while(1)
                    {
                        if(l==cnt[j].size()) break;
                        if(cnt[j][l] < cnt[i][k]) 
                        {
                            l++;
                        }
                        else break;
                    }
                    b.push_back(l);
                }
//b stores the number of cnt[j] members that is less than each cnt[i] members
//if cnt[i] = 1 2 7 8, cnt[j] = 3, 5
// b will be 0, 0, 2, 2 (b[i] = count of cnt[j] members that is less than cnt[i][k]
        
                for(k=0 ; k<b.size() ; k++)
                {
                    int sum=0;
                    int frontback = min_num(b[k], cnt[j].size()-b[k]);
                    sum += frontback * 2;
//frontback is the length of the surrounding two pallindromes
                    
                    int t;
                    int count = 0;
 
// now we calculate the length of the middle part of the palindrome
// if cnt[j].size &mdash; b[t] is more than the frontback, we can extend the middle part
                   
                    for(t=k ; t<b.size() ; t++)
                    {
                        if(cnt[j].size() - b[t] >= frontback) count++;
                        else break;
                    }
                    sum+=count;
                    
                    if(max < sum) max=sum;
                    
                }
            }
            if(realmax < max) realmax = max;
        }
    }
    cout << realmax << "\n"; 
    return;
}
int main(void)
{
    int n;
    cin >> n;
    while(n--)
    {
        solve();
    }
    
    return 0;
}

Full text and comments »

  • Vote: I like it
  • +5
  • Vote: I do not like it