#564(DIV2)ラウンドCodeforces
それが脱走して送信された当初考えていた、結果は殺されたフィールドになります。
料理は原罪であります
A
SBの質問、WAのうち、賃金をよく読んでいない質問は、コードは固執しません
B
シンプルな構造
明らかに、\(N-N- * \)マトリックスがこの順に配置してもよいです
その後、\(N- \)サイズのように実際に従事
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
using namespace std;
const int N = 1e5 + 3;
inline int read(){
int v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
int n,m;
int aa[N];
int main(){
n = read();
aa[1] = 1;
for(int i = 1;i <= 10000;++i) aa[i] = 2 * i - 1;
int now = 1;
while(aa[now] < n) now++;
printf("%d\n",now);
for(int i = 1;i <= now;++i)
printf("1 %d\n",i);
int cc = 2;
for(int i = now + 1;i <= n;++i)
printf("%d %d\n",cc,now),cc++;
return 0;
}
C
提案を送信し、時間以上のカード、非常に話題と考えます
まず第一に、答えは確かではありません以上(nは-2 * \)\一つずつそして、最悪の場合は、我々は非ブランクがあなたの手にカードを保存しなければならないとショット
我々は2つの戦略を持っています
1:直接は彼のカードを果たし、その後の終わり満たすためにチームを必要とする\(1 \)を、我々はタッチので、もし渡すことができ、私たちの手の中に次のカードを始め、連続フィールドの終わりに。尾は、我々が文を直接見ることができ、連続したサブセグメントを持っていた、Ruoguoは、明らかにこれが最適解であることができます
2:尻尾が上記の条件を満たしていない場合は、我々は何に接続方法や連続フィールドを持っていない、我々は一度に再生するために、カードを保存されています
私たちは、セット(\ P_I)\を表し\(私は\)キュー内の位置のナンバープレートを(キュー内とはみなさない\(0 \)すべての私たちであれば、その後、)\(P_I \)は、時間のチームの頭(セットになって\(T \))遊び
まず必要なの\(\ MAX_ {I = T } ^ NPI - (I - 1)== p_i-(I - 1)\)
\(p_i-は、(i - 1) \) 最も困難を理解するところです。
私たちは挿入理解\(私は- 1 \)回は、対象の唯一のいくつかのステップがある場合、\(私は\)から抜け出すためには、(デフォルトの時間は、私たちがしている私たちがしている\(1-I - 1 \ ) )
言い換えれば、私は手があることを確認します( - 1 \ 1-I \ ) 、その後、少なくとも完成プラグイン\ - (I 1 \)の前にタッチ\は(私は\)を挿入しなければならない1) - (I p_i-(\ \)の時間は、私の手ので\(1-I-1 \)、これは)一度だけカウント貢献(または部分的に重複していません
この時間は、我々が持っていなかった場合でも、\を(私は- 1 \)どのようにしますか?
この問題が発生したかどうかは関係ありません- \を({1 I} P_は \) である必要があります\(P_I \)後に、我々は最大値を取得し、\(P_ {I + 1} \)の寄与が明らかに大きいです
したがって、答えは\(N + MAX_が{i = 1} ^ np_i-I + 1 \)
#include<cstdio>
#include<cctype>
#include<iostream>
using namespace std;
const int N = 2e5 + 3;
int p[N];
int a[N];
int b[N];
int book[N];
int n;
inline bool check(){
for(int i = 1;i <= n;++i) if(book[i] == 0) return false;
return true;
}
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;++i) scanf("%d",&a[i]),book[a[i]] = 1;
for(int i = 1;i <= n;++i) scanf("%d",&b[i]),p[b[i]] = i;
// bool flag = 0;
int now = n;
while(now >= 2 && b[now - 1] != 0 && b[now - 1] == b[now] - 1) now--;
// cout << now << endl;
int t = 1;
if(b[now] == 1){
for(int i = 1;i <= b[n];++i) book[i] = 1;
for(int i = b[n] + 1;i <= n;++i){
if(!book[i]){break;}
book[b[t]] = 1;
t++;
// cout << t << endl;
}
if(check()){
printf("%d\n",now - 1);
return 0;
}
}
// cout << flag << endl;
// cout << t << endl;
// cout << "GG";
int ans = 0;
for(int i = 1;i <= n;++i)
ans = max(ans,p[i] - i + 1);
printf("%d\n",ans + n);
return 0;
}
D
まず、私たちは一人一人のサブツリーが円の連続弧でなければならないことがわかったので、木、互いに独立して、すべての子供が、その後、私たちは考える(DP \)\拠出を求めて
私たちはで固定し、聞かせて\は(のf_i \)で表さ\(私は\)答えは、今の時間です
\(のf_i =(son_i + [I] =ルート])!\ prod_ {son_iにj個の\} F_J \)
\(Nf_ ANS = {ルート} \)
何故
ツリーは、互いの製品のように、独立して、総答えは、関連するサブツリーに答えなければならない、とするので一つ一つの子について考えてみて、それらの相対的な順序に制限はありませんので、
そして、その階乗息子の関係の数ではなく、現在の親ノードが配置に参加するために、今あります。
そして今、そこに\(N \)の位置は置くことができます
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include<cmath>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
using namespace std;
const int N = 3e5 + 3;
const LL mod = 998244353;
vector <int> G[N];
LL ans = 0;
int son[N];
LL dp[N];
LL inv[N];
inline int read(){
int v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
int n;
inline void dfs(int x,int f){
dp[x] = 1;
for(int i = 0;i < (int)G[x].size();++i){
int y = G[x][i];
if(y == f) continue;
dfs(y,x);
son[x]++;
}
int w = (x != 1) ? son[x] + 1: son[x];
for(int i = 0;i < (int)G[x].size();++i){
int y = G[x][i];
if(y == f) continue;
dp[x] = dp[x] * dp[y] % mod;
}
dp[x] = dp[x] * inv[w] % mod;
}
int main(){
inv[0] = 1;
n = read();for(int i = 1;i <= n;++i) inv[i] = inv[i - 1] * i % mod;
for(int i = 1;i < n;++i){
int x = read(),y = read();
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1,0);
printf("%I64d\n",dp[1] * n % mod);
return 0;
}