預計得分:100 + 10 - 20 + 10 = 120
實際得分:100 + 0 + 10 = 110
感覺這場打的挺穩的。開場秒掉a題,寫+調差不多1h
然後剛t3暴力,剛完還有2h左右。。然後,,這時候我zz的選擇去打t2的暴力,然而t2暴力真的不是一般的難寫。。
終於又花了1h打完t2暴力,又打了打\(n <= 10\)的表,感覺穩的一批。
然後開始跑\(n = 11\)的,結果到比賽結束也沒跑出來qwq。。
離比賽結束還有5min的時候發現t3跟k無關又少拿了20
下午看成績的時候發現t2 \(n = 1\)的點玩錯了完美爆零。。。。。。。
如果。。。再給我20min讓我打完t2的表、、、、
如果。。。再給我15min讓我打完t3的優化版暴力。。。。
好像就win了啊可惜沒如果。。。。。
單調佇列隨便做。。。
維護最大最小值,貪心的pop一下就好了。。
因為資料是隨機的,所以單調佇列裡的元素不會很多,deque維護一下。。
#include#define ll long long
using namespace std;
const int maxn = 2e7 + 10;
inline int read()
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}struct node ;
int n, k, seed, l, r;
dequeqmx, qmn;
int main() );
qmn.push_back((node) );
while(!qmx.empty() && !qmn.empty() && (1ll * qmx.front().val > 1ll * qmn.front().val * k) )
if(!qmx.empty() && !qmn.empty()) ans += i - pre;
} cout << ans;
return 0;}/*
20000000 6
1234 4321 8765
*/
這題是真神仙題啊。。。
直接說標算吧。
設\(f[i][j]\)表示\(i\)個節點的無根樹,最大深度至多為\(j\)的方案數,
設\(g[i][j]\)表示\(i\)個節點的無根樹,最大最大深度恰好為\(j\)的方案數,顯然\(g[i][j] = f[i][j] - f[i][j - 1]\)
那麼\(f[i][j] = i * \sum_^i \frac * f[k][j - 1] * c_^\)
乙個公式。。包含了無數個trick。。orz xudyh。
首先把無根樹計數變成有根樹計數,然後列舉與根節點相連的編號最小的點\(k\)
前面要除掉\(i - k\)的原因是因為此時我們不清楚根節點
最後\(c_^\)的意思是我們欽定了根節點和它相連的編號最小的點之後的答案
那麼統計答案的時候
\[\sum g[k][j] * g[n - k][j] * c_^
\]這個應該比較好理解,就是左右分別算一算。
\(g[n][j] - \sum g[k][j - 1] * f[n - k][j - 1] * c_n^k\)
這個就比較有意思了,解釋一下
現在我們欽定了乙個根節點,只需要統計以它為中心的答案
\(g[n][j]\)表示的是深度最大為\(j\)的方案數,但是這裡面會有一些不滿足答案(只有一條長為\(j\)的鏈)
考慮減去不滿足條件的
列舉兩棵子樹,\(g[k][j - 1]\)保證了其中的乙個滿足條件,另乙個不滿足條件的方案就是從根節點開始深度至多為\(j - 1\)的方案
標算**看不懂。。。自己寫的調不出來。。咕咕咕。。
#include#define chmax(a, b) (a = (a < b ? b : a))
#define chmin(a, b) (a = (a < b ? a : b))
//#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? eof : *p1++)
using namespace std;
const int maxn = 501;
// char buf[1 << 21], *p1 = buf, *p2 = buf;
inline int read()
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}int n, m, f[maxn][maxn], g[maxn][maxn], c[maxn][maxn], mod;
int fastpow(int a, int p)
return base;
}int inv(int x)
main()
for(int i = 0; i <= n; i++) f[0][i] = g[0][i] = f[1][i] = g[1][i] = 1;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= n; j++) g[i][j] = (f[i][j] - f[i][j - 1] + mod) % mod, printf("%d %d %d\n", i, j, f[i][j]);
} for(int i = 0; i < n; i++) else }}
/**/
首先與\(k\)無關,因為可以取到\(=\)號
也就是說每個點只有選或不選兩種狀態
直接01分數規劃,把每個\(a[i] - x\),問題轉化為能不能刪去一些點,使得剩下的權值\(>0\)
那麼乙個點能成為答案,當且僅當它不是孤立點且與其他不選的點形成了獨立集(因為兩條邊之間最小有乙個要選)
也就是說我們要找出\(a[i] - val\)最小的獨立集,
但是似乎並不好搞,取一下負,找出\(val - a[i]\)最大的獨立集
然後就可以dp了。
\(dp[i]\)表示考慮右側的\(i\)個點,列舉上乙個點\(j\),再列舉一下左邊的點。觀察能否加入獨立集
第三維字首和優化一下,時間複雜度:\(o(n^2)\)
換一種dp方式,加乙個\(f[j]\)表示從\(j\)轉移到當前點的最優代價
for i = 1...n
dp[i] = max(f[j], 1 <= j < i)
f[i] = dp[i]
for all 區間 r = i
[l, r] = w
f[0....l - 1] += w
線段樹優化一下,interesting。
複雜度:\(o(nlog^2n)\)
#include#define chmax(a, b) (a = (a < b ? b : a))
#define chmin(a, b) (a = (a < b ? a : b))
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? eof : *p1++)
#define ls k << 1
#define rs k << 1 | 1
using namespace std;
const int maxn = 30001;
const double inf = 1e18, eps = 1e-9;
char buf[1 << 21], *p1 = buf, *p2 = buf;
inline int read()
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}int n, m, k, l[maxn], r[maxn];
vectorv[maxn];
double dp[maxn], a[maxn], b[maxn], ta[maxn], tb[maxn];
struct node t[maxn << 2];
void add(int k, double val)
void pushdown(int k)
void update(int k)
void build(int k, int ll, int rr)
void intadd(int k, int ll, int rr, double val)
pushdown(k);
int mid = t[k].l + t[k].r >> 1;
if(ll <= mid) intadd(ls, ll, rr, val);
if(rr > mid) intadd(rs, ll, rr, val);
update(k);
}double query(int k, int ll, int rr)
bool check(double val)
double ans = 0;
for(int i = 1; i <= m + 1; i++) ans = max(ans, dp[i]);
return sum + ans > -eps;
}main()
double ans = -1;
while(r - l > eps)
printf("%.10lf", ans);
}
暑期十測 round2
vo lume 2 da y11 度熊的全1串 斐波那契數 高精度。區間交 離線排序 線段樹 尺取。拍照 運動學 字首和 線掃。da y12沙漠喝水 癟三題。區間的價值 預處理區間最小最大的在 用快排的方式分割區間,暴力更新答案。l國貨物運輸 二分判定,對不等式進行分析。da y13車站檢票 癟三二...
dp 雜練 專練 round2
上次題似乎有點水 大概到noi之前會進行一些針對自己薄弱點的專項訓練吧 bz oj1419re disg ood 額.dp i j 表示re d剩i張 bla ck剩j 張的期望 每次期望 概率 轉移就行 注意如果期望在 0以下就 不取了 空間不夠 所以滾 一下 code by liuchenrui...
SDOI2016Round1 解題報告
題意 求 n?1i 0 m?1j 0max ixorj k,0 因為是抑或操作,每一位都是獨立的,所以可以一位一位的算貢獻。f i a b c 表示第i位時,每個數跟n,m,k的大小關係,0表示小於,1表示i位之前都相等,2表示大於。轉移的時候美劇當前這一位的數是什麼,從高位向低位轉移就行了。複雜度...