Codeforces Round #705 C K-th beautiful String
問題概要:
長さ の文字列 が与えられます。 中に各文字の現れる数がそれぞれ 回で割り切れる時、その文字列は美しいと呼びます。
文字列 の文字を自由に変換し、辞書順で 以上の文字列の中で辞書順最小の美しい文字列を求めなさい。美しい文字列に変換することができなければ -1 を出力しなさい。
考えたこと:
とりあえず、 のとき、 を出力し、それ以外では美しい文字列を作ることができる(zz...z は辞書順で 以上かつあ、美しいため)。
美しい文字列の辞書順の lower_bound みたいな気持ちになった。元の文字列が美しければそのまま出力、元の文字列が美しくない場合を考える。 と共通な prefix ができるだけ長くなるように構築すると良さそう。実装がちょっと面倒くさいかも(?)。
AGC016 B - Colorful Hats
問題概要
日本語なので割愛
考えたこと
こんなん無理やん。全ての猫同士が 匹分の情報を共有していると考えると、 の種類数はあんまり多くないかもしれない。よく考えると、minmax の差は 以下になるね。"自分と同じ色の帽子を被っている他の猫がいるかどうか" に着目して場合分けをすると解けますね。
Educational Codeforces Round 109 E - Assimilation IV
問題概要
個の都市と、 個の街があり、全ての都市 と街 の間の距離 が与えられます。 の順列 に対して、 となる が存在する街 の数を順列 のスコアと呼びます。全ての順列 に対して、得られるスコアの平均値を求めなさい。(わかりづらかったら問題に飛んでください><)
考えたこと
はもう bitDP って言ってるようなものじゃんwww。なんやかんやあって くらいに落ち着くでしょ。対戦ありがとうございました!!!→落ち着きませんでした \ ^q^ /。
よく考えるとそれぞれの街から得られるスコアへの寄与は独立しているので、 回の独立した計算が必要になりそう。
考える街を固定した時、各都市と条件を満たすか?の和集合が真になるときスコアが 増えると考えると、包除か?結局この形の包除は くらいの計算が必要だから違いそう、、、よく考えると全体から否定の積集合を引いても良いな。
解法
平均値ではなく総和を考えて で割ることにします。各街について考えて、"その街がスコアを 増やさない" 順列の個数を数えて から引くことによって総和が得られます。
具体的には各街について、( となっている の数 - ) を求め、 から引いた値の総和が求めたいものになります。
最後に得られた総和を で割ることにより、正答が得られます。
提出コード(atcoder/all を展開しているので長いです。)
atcoder/all の展開を省いたコード
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for(long long i=0;i<n;++i) #define rep1(i,n) for(long long i=1;i<=n;++i) #define rrep(i,n) for(long long i=n-1;i>=0;--i) #define debug(output) if(debugFlag)cout<<#output<<"= "<<output<<endl using lint = long long; typedef pair<int,int> P; const bool debugFlag=true; const lint linf=1.1e18;const lint inf=1.01e9; constexpr int MOD=1000000007; template<class T>bool chmax(T &a, const T &b) { if(a < b){ a = b; return 1; } return 0; } template<class T>bool chmin(T &a, const T &b) { if(a > b){ a = b; return 1; } return 0; } #include<atcoder/all> using namespace atcoder; using mint = modint998244353; mint calc(vector<int> a){ int n=a.size(); mint res=1; sort(a.rbegin(),a.rend()); int p=0; int buf=0; rep(i,n){ while(p<n&&a[p]>n-i){ ++buf;++p; } res*=buf--; } return res; } signed main(){ int n,m;cin>>n>>m; vector<vector<int>> a(m,vector<int>(n,0)); rep(i,n)rep(j,m)cin>>a[j][i]; mint res=0; mint np=1; rep1(i,n)np*=i; rep(i,m)res+=np-calc(a[i]); res/=np; cout<<res.val()<<"\n"; return 0; }
もすーんバチャ #322
久々にもすーんバチャを走りました。5 問目で実装をミスり、29 分頃にバグを取れて提出したらオーバーフローして、そこを直したけど、間違えて Python で提出してしまい、提出制限で最後の提出ができずに負けました......。
6 問目までは upsolve するので、7 問目はまあ、そのうち......。