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

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

We will hold AtCoder Beginner Contest 387.

We are looking forward to your participation!

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

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

kool

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

Wow! Looking forward to solve 5 problems.

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

Wow! Looking forward to solve 4+ problems.

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

I am Chinese.

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

Hope to solved 5 problems!

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

    But...

    The problems this time are so strange, that solving C,D is harder than usual.

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

Wow! Looking forward to solve 4+ problems.

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

I Hope I Can Go To Brown Name

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

Hope to solve 4 or more problems!

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

Hope to accept the problem D!

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

I love the cuteness of the first 3 problems in ABC contests how submissive and obedient they are, I love the feelings of domination.

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

I sloved 2 problems.a&b

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

a and b were very easy. but c ? i could not find any technique.

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

    There is a general approach to deal with this kind of problems called digit dp.

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

why so hard on c

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

E is so hard, even harder than F

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

In my opinion, the order of the problems isn't quite right. $$$D$$$ and $$$F$$$ are classic problems, while $$$C$$$ and $$$E$$$ require more thinking. The results show that fewer contestants solved $$$C$$$ than $$$D$$$, and fewer solved $$$E$$$ than $$$F$$$. The difference is almost double.

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

    People needs to think but they don't like thinking so you must push them to think, now a lot of contestants got a change to actually exercise problem-solving by struggling with problem C.

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

Atcoder needs to use more testers!

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

That's how I thought during this contest:

why there are so many 2025?

why 2025 is in every problem?

why 2025 is so special?

wait

ac-predictor tells that I could get a new rating of 2025?

2025 is so magical!

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

very educational contest for me. learned that pow doesnt give good precision + dijkstra is god damn slow.

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

I solved every problem except C today LOL

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

What is the intended solution of C? And any hint for E please?

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

    ans = count of snake numbers in [10, R] — count of snake numbers in [10, L — 1]

    Submission

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

      I meant how to find answer in [10, R]. I solved it using digit DP, is there an easier way of solving it?

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

    For E, try to think about the divisibility properties of two consecutive numbers. I tried first 10 and 11, 9 and 10 and so on... The good thing I figure out is that if you find some number with sum of digits 8 and divisible by 8, then the next number will have sum of digits 9 and be divisible by 9.

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

now i need to learn about functional graph, it has been haunting me in every contest

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

Didn't like C and E :(

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

only able to solve first 2 question.. I'm doomed!!

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

Forgot to MOD the ans in F ,realised after contest ended :(

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

For problem G, the composition of formal power series is not needed.

The editorial calculated $$$F\circ G$$$ where $$$F=\sum_{i\leq 0}\frac{x^in^{i-2}}{i!}$$$. Distribute the $$$n^{i-2}$$$ factor into $$$G$$$, i.e., replace $$$G$$$ with $$$\frac{G}{n}$$$, and the problem becomes calculating the exponent of the formal power series.

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

why is this failing for problem D: code ?

i cant seem to figure out whats wrong here

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

    The minimum distance travelled to reach a node need not be the same from both directions (as explained in the diagram).

    It is also possible that a node is reachable only from 1 direction.

    So it is possible, for a node $$$(i, j)$$$, that the distance to $$$(i, j)$$$ is less when reached after a horizontal step, but the destination can only be reachable when $$$(i, j)$$$ is reached after a vertical step.

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

Problem C was really cool! Took a lot of time but felt very satisfied after solving it.

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

After I got stuck in C for 50 minutes:

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

Me while doing A-B : I can solve every problem in the world!!

Me at C : I think this is not the right world..

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

E is just testcases , D is garbage implementation ,score distribution is random,this contest sucks.

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

    If you don't feel good solving a problem and the problem is not valuable, then refrain from solving it.
    So, you should have refrained from solving at least problem D, no matter how that affects the rating. Do you agree?

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

Problem C surprised me.It was my first time to use Digital DP to solve problem C in ABC.

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

Personally surprised everyone found E hard; I personally found E to be surprisingly easy when considering that you can extend values by inserting 0 in the middle of the number and then working with "easy" divisibility rules that don't care about that (1,2,3,4,5,6,8,9, but especially 2,3 and 8,9 since they're consecutive and 1 and 5 can immediately be shown to be impossible to manipulate this way under the constraints, though pairing 3 and 4 can work as an alternate construction, specifically by extending (111,112) to (1011,1012), (10011, 10012), etc.).

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

Was only able to solve A,B,D, Wasted a lot of time on C

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

For problem E, I solved it case by case, by using one of the following patterns:

starting with 11, 80, 62, 53, 35, 26, 17, while ending with all zeros. A really impressive constructive problem!

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

An explanation for problem C will be appreciated... I don't even understand how I can approach this problem.

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

please tell me why I got wrong on D, I had wasted a lot of time and I am upset

#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
using namespace std;

int dd[1010][1010];
char a[1010][1010];
int visited[1010][1010];

int ans = 1e9;

void solve()
{
	int n, m;	cin >> n >> m;

	pii start, goal;

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> a[i][j];
			if (a[i][j] == 'S')	
				start = {i, j};
			else if (a[i][j] == 'G')
				goal = {i, j};
		}
	}

	visited[start.first][start.second] = 1;

	vector<int> dx = {1, -1, 0, 0, 1, -1, 0, 0};
	vector<int> dy = {0, 0, 1, -1, 0, 0, 1, -1};

	for (int j = 0; j < 4; j++)
	{
		queue<pair<pii, pii>> q; q.push({start, {1145140000, 1919810000}});
		memset(dd, 0, sizeof(dd));
		memset(visited, 0, sizeof(visited));

		while (!q.empty())
		{
			auto moxi = q.front(); 
			q.pop();
			int x = moxi.first.first, y = moxi.first.second;
			pii d = moxi.second;

			for (int i = 0 + j; i < j + 4; i++)
			{
				int xx = x + dx[i], yy = y + dy[i];
				if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && visited[xx][yy] == 0 && a[xx][yy] != '#' && (d.first != dx[i] && d.second != dy[i]))
				{
					visited[xx][yy] = 1;
					q.push({{xx, yy}, {dx[i], dy[i]}});
					dd[xx][yy] = dd[x][y] + 1;
				}
			}
		}

		if (!visited[goal.first][goal.second])	continue ;

		ans = min(ans, dd[goal.first][goal.second]);

	}

	if (ans == 1e9)	cout << -1 << endl;

	else cout << ans << endl;
}

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

	solve();

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

    I am confused about why I got wrong…… help me plz

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

      You should consider if it is the same when arriving at a point from left/right and up/down.

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

        I had considered it, but I cant construct a sample to prove that my code is wrong.....

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

          You just considered it cannot move as the same direction.But you should split every point into two points,which represent the last step is left/right or up/down.Because they are different but your code regards it as the same.

»
2 дня назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
void solve() {
   
    ll h, w;

    cin >> h >> w;
    vector<string> mat(h);
    pair<ll, ll> start, goal;

    f(i, 0, h) { cin >> mat[i]; }
    f(i, 0, h) {
        f(j, 0, w) {
            if (mat[i][j] == 'S') { start = {i, j}; }
            if (mat[i][j] == 'G') { goal = {i, j}; }
        }
    }
    function<bool(ll, ll)> ok = [&](ll x, ll y) {
        return x >= 0 && x < h && y >= 0 && y < w && mat[x][y] != '#';
    };
    const ll dx[4] = {1, 0, -1, 0};
    const ll dy[4] = {0, 1, 0, -1};
    queue<pair<pair<ll, ll>, ll>> q;
    vector<vi> dis(h, vi(w, Inf));
    q.push({start, -1});
    dis[start.first][start.second] = 0;
    ll result=Inf;
    while (!q.empty()) {
        ll type = q.front().second;
        ll x = q.front().first.first;
        ll y = q.front().first.second;
        q.pop();
        for (ll i = 0; i < 4; i++) {
          ll in=i%2;
           if (in == type) continue; 
            ll a = x + dx[i], b = y + dy[i];
            if (ok(a, b) && dis[a][b] == Inf) {
                dis[a][b] = dis[x][y] + 1;
                q.push({{a, b}, in});
            }
        }
        result =min(result,dis[goal.first][goal.second]);
        
    }
    result =min(result,dis[goal.first][goal.second]);
    if(result==Inf){result=-1;}
    co(result);
    
    
  
}

can anyone explain whats mistake in this code for que D

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

(This is from Atcoder Editorial for Problem C) Can anyone explain this with an example: If d1 ≤ di for some i (2≤i≤k), then there are none. Otherwise, the (k+1)-th digit should be less than d1 and d_k+1, and the (k+2)-th and succeeding digits should be less than d1, so there are min{d1,d_k+1} × d1^(n−(k+1)) of them.

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

    For suppose take example 8695 there is a digit 9 which is greater than 8 so it is not a snake number largest snake number less than 8695 is 8677 (if u find any digit>=first digit) from that position make all digits after that position first digit-1

    calucuate snake numbers less than that number.8677. <8000 it is easy to calculate using combinatorics 7^3+6^3+...1^3+dp[2] dp[2] is no of snake numbers less than 10**2 .

    For 8000-8677 867_ for last digit 7 possibilities

    86__ 0-6 digits possible for 3rd digit and for 4th digit 7 possibilities 7*6=42 ...so on

  • »
    »
    45 часов назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    void solve() {
        string l, r;
        cin >> l >> r;
        vector<ll> dp(19, 0);
        ll n = l.size(), m = r.size();
        f(i, 2,19) {
            dp[i] = dp[i - 1];
            ll val=0;
            f(j, 1, 10) {
              val += expo(j, i-1);
            }
            dp[i]+=val;
        }
        auto ans = [&](string s) {
            ll res = 0, sz = s.size(), val = s[0] - '0';
            bool ok = 0;
            char c=s[0];
            c--; 
            for (ll i = 1; i < sz; i++) {
                ll g = s[i] - '0';
                if (g >= val) ok = 1;
                if (ok) s[i] = c;
            }
            res += dp[sz - 1];
            f(i, 1, val) res += expo(i, sz - 1);
            ll mult = 1;
            for (ll i = sz - 1; i >= 1; i--) {
               if(i==sz-1){res+=(s[i]-'0');}
               else res += (s[i] - '0') * expo(val,sz-i-1);
            }
            return res;
        };
        bool ok = 1;
        ll result=ans(r)-ans(l);
        f(i, 1, l.size()) if (l[i] >= l[0]) ok = 0;
        if (ok) result++;
         co(result);
    }
    
»
43 часа назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I'm sorry I didn't quite get editorial of E. So they just throw some constructions, then there are some dots implying that there are some more constructions? And why there won't be other twin numbers?

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

Can anyone help where i made mistake in the following code in which i try to solve problem d ....

For this code,, 33 case accept and 24 give wrong answer, a case where it give wrong answer is:

5 10 S........# .........# .........# .........# .........G

the correct answer is 17,but the output of my code is 21,,but i cannot find out where and why it give a mistake....

here is my code................

// this is code
void inc(int pos, int d) {
    for (; pos < n; pos |= pos + 1)
        f[pos] += d;
}

/*********************************************| | Hello Programmer : Let's code the universe. | | Kartik Das........... | |*********************************************/

include <bits/stdc++.h>

using namespace std; typedef long long ll;

define Make ios::sync_with_stdio(false) ;

define fast cin.tie(0);

vector<vector>a; ll minsum(vector<vector>&dp1,vector<vector>&dp2,vector<vector>&vis1,vector<vector>&vis2,int row,int col,int n,int m,int sr,int se,int er,int ee,int var){ // cout<<row<<" "<<col<<endl; if(row<0||row>=n)return -2; if(col<0||col>=m)return -2; if(a[row][col]==-1)return -2; if(row==sr&&col==se)return 1; if(var==1&&vis1[row][col]==true)return -2; if(var==0&&vis2[row][col]==true)return -2; if(var==1&&dp1[row][col]!=-1)return dp1[row][col]; if(var==0&&dp2[row][col]!=-1)return dp2[row][col]; if(row!=er||col!=ee){ if(var==1){ vis1[row][col]=true; ll pack,peak; peak=minsum(dp1,dp2,vis1,vis2,row,col-1,n,m,sr,se,er,ee,0); pack=minsum(dp1,dp2,vis1,vis2,row,col+1,n,m,sr,se,er,ee,0); vis1[row][col]=false; if(peak<0&&pack<0)return dp1[row][col]=-2; peak=peak<0?1e12:peak; pack=pack<0?1e12:pack; return dp1[row][col]=1+min(peak,pack); }else{ vis2[row][col]=true; ll pack,peak; peak=minsum(dp1,dp2,vis1,vis2,row+1,col,n,m,sr,se,er,ee,1); pack=minsum(dp1,dp2,vis1,vis2,row-1,col,n,m,sr,se,er,ee,1); vis2[row][col]=false; if(peak<0&&pack<0)return dp2[row][col]=-2; peak=peak<0?1e12:peak; pack=pack<0?1e12:pack; return dp2[row][col]=1+min(peak,pack); } }else{ ll peak1,peak2,peak3,peak4; vis1[row][col]=true; vis2[row][col]=true; peak1=minsum(dp1,dp2,vis1,vis2,row-1,col,n,m,sr,se,er,ee,1); peak2=minsum(dp1,dp2,vis1,vis2,row+1,col,n,m,sr,se,er,ee,1); peak3=minsum(dp1,dp2,vis1,vis2,row,col-1,n,m,sr,se,er,ee,0); peak4=minsum(dp1,dp2,vis1,vis2,row,col+1,n,m,sr,se,er,ee,0); if(peak1<0&&peak2<0&&peak3<0&&peak4<0)return dp1[row][col]=-2; peak1= (peak1==-2)?1e12:peak1; peak2= (peak2==-2)?1e12:peak2; peak3=(peak3==-2)?1e12:peak3; peak4=(peak4==-2)?1e12:peak4; dp1[row][col]=min(peak1,min(peak2,min(peak3,peak4))); return dp1[row][col]; } } void solve() { ll n,m; cin>>n>>m; vector<vector>ch1(n,vector(m,false)),ch2(n,vector(m,false)); vector<vector>dp1(n,vector(m,-1)),dp2(n,vector(m,-1)); a.resize(n,vector(m)); pair<ll,ll>S,R; for(ll i=0;i<n;i++){ string s; cin>>s; for(ll j=0;j<m;j++){ if(s[j]=='.')a[i][j]=0; else if(s[j]=='#')a[i][j]=-1; else{ if(s[j]=='S')S={i,j},a[i][j]=1; else R={i,j},a[i][j]=1; } }

} // cout<<S.first<<" "<<S.second<<endl; ll ans=minsum(dp1,dp2,ch1,ch2,R.first,R.second,n,m,S.first,S.second,R.first,R.second,-1); // for(ll i=0;i<n;i++){ // for(ll j=0;j<m;j++){ // cout<<a[i][j]; // } // cout<<endl; // } if(dp1[R.first][R.second]==-2){cout<<-1<<endl;return;} cout<<dp1[R.first][R.second]<<endl;

}

int main() { Make fast;

long long t=1;
//cin >> t;
while (t--)
{
    solve();
}
return 0;

}

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

Could someone please take a look at my solution for F? I believe it is O(NM) but it suspiciously TLE on 3 test cases. Link

My approach is quite straightforward (functional graph, cycle detection, dp with prefix sums) and is essentially the same as that of the official solution.

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

code

can anyone tell whats wrong with this for que 4