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

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

We will hold AtCoder Beginner Contest 473.

We are looking forward to your participation!

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

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

Hoping to A,B,C,D at least.... :)

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

I hope I could solve Task A-D.

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

Hope it's not rubbish round like abc472.

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

Another day for ABC

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

pls let me solve F?

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

Maybe I can't solve B.

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

Hoping I can solve E

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

Hope I can solve A,B,C,D.

Ans good luck to everyone!

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

D is a little bit difficult,I wonder what is the examiner thinking when he created this problem

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

Hope I can solve E and F

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

wth with D problem..

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

The hell is the C problem i dont understand the language

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

Was able to solve from A to E.

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

D was harder than E, i solved E in 0:25 minutes but couldnt solve D

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

bruhhh i should have focused on problem E instead of D... couldn't finish it :|

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

Wuwuu.... (crying loudly)

My D TLEd....

Why is my program so slow QwQ...

If the evaluation machine is a supercomputer, it should be able to pass

My Code:

#include<bits/stdc++.h>
using namespace std;

int n,k;

inline void write(int x){
	if(x>9) write(x/10);
	putchar(x%10+'0');
}

void build(int pos, int val, deque<int> q){
	if(val==0){
		while(!q.empty()){
			write(q.front());
			putchar(' ');
			q.pop_front();
		}
		for(int i=pos; i<=n; i++) putchar('0'),putchar(' ');
		putchar('\n');
		return;
	}
	else if(pos>n||pos>val) return;
	for(int i=0; i*pos<=val; i++){
		q.push_back(i);
		build(pos+1,val-i*pos,q);
		q.pop_back();
	}
}
deque<int> q;
int main(){
	cin>>n>>k;
	build(1,k,q);
	return 0;
}
  • »
    »
    5 дней назад, скрыть # ^ |
     
    Проголосовать: нравится +3 Проголосовать: не нравится

    i thought D is just one of the basic backtracking problems?

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

      Basic backtracking problem? Can you tell me some resources where you practiced these problems? I seriously many-a-times get stuck at these problems thinking for an optimised solution when we only need to do brute force. This time also same thing happened.

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

        n = 10 and you'll probably know this is a backtracking problem. if your naive solution got a tle, you can think of how to do a low-level optimisation like somehow pruning early, like this problem, you dont backtracking the last element, and if the sum == k for print the rest of the array with 0. Most of the time you'll be find. That the constaint is small means one of those 2 things: - The problem is somehow easy and just need us to backtracking and pruning. - The problem is a np hard and need some heuristic or complex solution

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

      A mysterious backtracking problem with unclear meaning.

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

    try to deal pos == n in build(...)?

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

    you can try this ~~~~~ void backtrack(int pos, int sum, vector &cur) { if (sum == k) { for(int i = 1; i <= n; i++) { cout << (i < pos ? cur[i] : 0) << ' '; } return; } if (pos == n) { int rem = k — sum; if (rem % n == 0) { cur[n] = rem / n; for(int i = 1; i <= n; i++) { cout << cur[i] << ' '; } } return; }

    int mx = (k - sum) / pos;
    for(int val = 0; val <= mx; val++) {
        cur[pos] = val;
        backtrack(pos + 1, sum + pos * val, cur);
    }

    } ~~~~~ pruning early like this and you'll be fine

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

      hey, can you post your code in better format or give your submission link? i struggle a lot on backtracking.

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

          I did the same but why am I getting the TLE

          ~~~~~~~~~~~~~~~~ public class Main { public static List ans; public static int cnt = 0; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); long k = sc.nextLong(); ans = new ArrayList<>(); rec(1,n,k); }

          public static void rec(int i , int n , long k){
              // basecase
              if(i > n){
                  if(k == 0){
                      for(long a : ans){
                          System.out.print(a+" ");
                      }
                      System.out.println();
                  }
                  return;
              }
              // compute 
              for(long choice=0;choice<=k;choice++){
                  if((choice * i) > k) break;
                  ans.add(choice);
                  rec(i+1,n,k-(choice*i));
                  ans.remove(ans.size()-1);
              }
          }
          

          } ~~~~~~~~~~~~~~~~~~~

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

            it's not the same you know, in your code, you have a unnecessary state of computing the last element which +1 height to your dfs tree, and also you can pruning right after k == 0 (using the rest of the element as 0); (also limiting your choice when calculate for element i improve the time a lot); you can see those pruning in my code

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

A-F is quite easy, I think F is only *1800,only segment tree is used. But G probably needs NTT, it's a big difficulty gap.

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

upset,D is so difficult!!!

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

I can tell that F is about a Fenwick tree,but I forgot the template.what a pity!

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

I AK ABC473.

A<B<C<E<F<G<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<D

D is not a problem!!!

E,F,G are BORING!!!

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

I cannot figured out the combinatorics formula for the final problem. Guess my math skill isnt good enough. Can anyone show me the idea and walkthrough about how you figured out and solved it?

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

    Let f(n, k) be the answer. If you choose a card, it can be either the next you need or a wrong card.

    If it's the next you need (probability 1/n) you have 1/n * f(n-1, k-1) probability, because you need to play k-1 times and you have n-1 remaining cards that you don't know.

    If it's not the next card you need (probability (n-1)/n) You just discovered a card you will need in a future step, but this will also cost 1 more move to get that card, and there is still n-1 cards you don't know. So you spent 2 steps to reduce your problem to a n-1 problem. then probability will be (n-1)/n * f(n-1, k-2).

    After this I figure it out it was about Stirling numbers of the first kind because of the recurrence (ignoring the division by n) f(n,k) = f(n-1, k-1) + (n-1) * f(n-1, k-2) (The original recurrence is a little different, but you can find it changing some terms) and in the end I needed to divide the answer by n! (because in each step you divide by n and go to n-1).

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

    i dont know how to optimize my idea but i have some small solution about this problem. So firstly, i wen through the way to minimize the expected value for each permutation. The strategy is actually very simple, we go from left to right, flip the unrevealed cards, if the card is not what we looking for, we remember it, continue flipping. When x equal to a number that we have seen, turn back and eat it immediately. So the answer for a permutation is just simple, it's N + (number of time that we have to flips a card we dont eat); so we have dp[i][j] is the probability to have j steps to flip a card that we dont eat after considering the first i cards. it has 2 case for us to switch the state of the dp. the first is i is equal to x, which is the card we looking for, then the probability is 1 / i; if not the probability is i — 1 / i; so our dp formular should look like this: dp[i][j] = (1 / i) * (dp[i — 1][j]) + (i — 1 / j — 1) * dp[i — 1][j — 1]; I dont know how to optimize this further, maybe by using dnc and fft

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

Here is my solution for E. No idea what went wrong Link

No idea what case I am actually missing on

»
5 дней назад, скрыть # |
Rev. 2  
Проголосовать: нравится -8 Проголосовать: не нравится

I passed G... but at 21:40:22. :(

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

Easy round

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

I don't know why he likes eating cards:(

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

I think that D is more difficult than other quetions!!! Since I've had so many TLEs... My Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
const int N=3e5+5;
int n,a[20],k,len; 
int ans[N][20];
void solve();
void dfs(int x,int cnt){
	if(cnt>k) return ;
	if(x>n){
		if(cnt==k){
			len++;
			for(int i=1;i<=n;i++){
				ans[len][i]=a[i];
			}
		}
		return ;
	}
	if(cnt==k){
		dfs(n+1,cnt);
		return;
	}
	if(cnt<k&&cnt+x>k) return ;
	for(int i=0;i*x+cnt<=k;i++){
		a[x]=i;
		dfs(x+1,x*i+cnt);
		a[x]=0;
	}
} 
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int _=1;
//	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}
void solve(){
	cin>>n>>k;
	dfs(1,0);
	for(int i=1;i<=len;i++){
		for(int j=1;j<=n;j++){
			cout<<ans[i][j]<<' ';
		}
		cout<<'\n';
	}
	return ;
}

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

    It's hard to come up with the idea of using DP to optimize pruning.

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

      I don't think dp is needed here...my solution passed without any dp whatsoever...or did I use dp without knowing?

      • »
        »
        »
        »
        5 дней назад, скрыть # ^ |
         
        Проголосовать: нравится -10 Проголосовать: не нравится

        I was forced to use DP pruning because the server was extremely slow during the contest.

        #include<bits/stdc++.h>
        using namespace std;
        #define int long long
        const int MAXK=200005;
        int n,k;
        bool dp[12][MAXK];
        int ans[12];
        void dfs(int p,int j){
            if(p>n){
                for(int i=1;i<=n;i++)cout<<ans[i]<<(i==n?'\n':' ');
                return;
            }
            for(int x=0;x<=j/p;x++){
                int nj=j-p*x;
                if(dp[p+1][nj]){
                    ans[p]=x;
                    dfs(p+1,nj);
                }
            }
        }
        signed main(){
            ios::sync_with_stdio(0);
            cin.tie(0);cout.tie(0);
            cin>>n>>k;
            dp[n+1][0]=1;
            for(int i=n;i>=1;i--){
                for(int j=0;j<=k;j++){
                    dp[i][j]=dp[i+1][j]||(j>=i&&dp[i][j-i]);
                }
            }
            dfs(1,k);
            return 0;
        }
        
        
  • »
    »
    5 дней назад, скрыть # ^ |
    Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится

    I would also like to add my solution that I submitted after contest was over T_T ... During the contest I was so sure it wouldn't pass.

    code
»
5 дней назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится

D is VERY terrible.The others are not tooooooooooo bad.

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

In the editorial for problem G — Wipeout, en_translator cleverly utilizes #include<atcoder/all> to implement the NTT function. I find this quite impressive. Would someone kindly explain how to correctly use the atcoder namespace?

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

I solved D with DFS:)

But I spent too much time on D, so my pref is low, MY RANTING IS ABOUT MY SCORE GOING STRAIGHT INTO THE TOILET!!!

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

My code of D get AC*37 and TLE*1,why???Doesn't AtCoder Judge run fast?

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll cnt;
vector<vector<ll>> ans(300005,vector<ll>(15));
ll vec[15];
ll n,k;
void dfs(ll dep,ll rem){
	if(dep==0){
		if(rem==0){
			++cnt;
			for(ll i=1;i<=n;++i) ans[cnt][i]=vec[i];
		} 
		return;
	}
	if(rem<0) return;
	if(dep>rem){
		vec[dep]=0;
		dfs(dep-1,rem);
		return;
	}
	for(ll i=0;i<=rem/dep;++i){
		vec[dep]=i;
		dfs(dep-1,rem-i*dep);
		vec[dep]=0;
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>k;
	dfs(n,k);
	sort(ans.begin()+1,ans.begin()+cnt+1);
	for(int i=1;i<=cnt;++i){
		for(int j=1;j<=n;++j){
			cout<<ans[i][j]<<" ";
		}
		cout<<"\n";
	}
	return 0;
}
»
5 дней назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Why SO many NTT?

I ask this problem in LAST LAST week too.

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

In my opinion, A = B = C < E < F << D << G. What's so terrible about problem D is that you'd never figure out from pure thinking during the contest that a slightly optimized brute force could pass, and it takes way too much courage to actually write that kind of brute force in an ABC.

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

Why does the editorial for problem G use the atcoder namespace? I fucking wrote NTT by hand!I hate NTT.

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

BORING CONTEST! Why do u let me put so much time(nearly half an hour) on making my code run faster and faster on problem D? Why do u put NTT for problem G? Why is problem F almost a template for segment tree?

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

who can teach me how to solve G, please!!!

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

This is my first time solving problem F.

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

I got a TLE on D at least. :(

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

First F!!!

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

Regret not having watched E

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

AtCoder is shamelessly promoting their ACL.The just put an NTT in problem G.

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

This is my first pb , try to solve atleast 3 pb

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

this will be my first contest , try to solve atleast 3