跟风烂活之集训日记(csp-s)
rt,这是一篇跟风烂活。感觉都在写些什么,再不写点什么没天理了。
本文梦到什么记什么,不遵从任何格式,极烂说是。
7/9
有感而发,开了这个东西。
考试开创贞观之治,75 + 25 + 5 + 5 说是。
- 值域是什么
- 有人 \(O(n^3)\) 过 \(5000\) ??!!
- dfs(只)过样例之 \(1h\) 打出假表
- 一号测试点 \(T=0\) 是什么题
8/9
有第二个人和我一样习惯书面上用 日 / 月 记录日期吗?
模拟 18:
t1 100pts 一眼折半搜索,但是在双指针和二分之中选择了动态开点线段树,好在后面还用了,不算特别浪费时间(留下时间罚坐说是)
t2 30pts 开始时跳过了,最后 \(1.2h\) 的时候花费 \(0.3h\) 写了 30pts 的记搜,本来中样例跑挺快还以为 \(50\) 呢...
t3 40pts 开始以为我会做,后来发现不会,先跳了,后来做 t2 前返回来做了 \(n^2\) 暴力和链的分数,40 还挺好打的,甚至几乎没调,有点痛苦,因为罚坐。
t4 20pts 跳了两道题就是来做这个的,发现 \(\% 20\) 数据 \(\le5\),然后样例给了 $[2 , 5] $...... 唯一问题是模数不一样,但是其实只要爆搜还原回分数形式就可以爽拿 \(20\) 了,挺难绷的。
下午 MyShiroko 放了希区柯克,是没听过的歌,而且蛮好听的,有种“恨晚”的感觉在,不过真让我平时听歌应该还会是纯粹的 术 + 某一团体 + 某一乐队 吧......
下午优化了一整个下午的这东西。卡常太恶心了,导致晚上都不想写题。
9.9 & 9/9
SKK:你是哪国人?
我错了,我以后都会用 月/日 表示日期了。
猜猜今天算不算在“以后”里呢?
下午放了 \(\text{Internet Yamero}\) 说是传承什么的,我只想起了隔壁 aecaea 把这首 \(9.9\) 标的表面定数是 \(10\) 收了我 \(100\) 源点。怀疑小伙子先生就是不想让人拿船票换这首才标 \(10\) 的。
突然想起 \(\text{What's up? Pop!}\) 了,也许是都带点核的元素导致的?
感觉某人的鲜花居然有密码实在反人类,强迫别人你记住用户名是吧。
一天内写一堆题都在卡常,乐,永远选到常数大的写法说是。link1 link2 link3
9.10
选择了两种日期表达方式混着用说是。
看看这个吧:
赛拟模 19
以下是模拟赛最后 \(20min\) 写的,不一定符合实际,甚至可能会令人忍俊不禁。
本场比赛 \(4\) 道题共有 \(eps\) 个大样例,好啊,很好啊(赞扬)。
上午拉肚子,rush WC 四回,所以考成什么样子都不是我的错!
T1 数据范围诈骗,差点没做出来,幸好想着要写大分讨,分着分着就分出来正解了......\
你觉得你是正解么?
我觉得我是。(\(O(n)\) 的)。
4 \(\space \space \space\) 诶这个真好玩
3
2
1
T2 我完全就是猜的,乱猜一通,开始的时候方向偏了还,十分有趣,最后猜的三分,也不知道假不假(何况三分我从没写过)。
T3 看了就后悔写 T2 了,感觉好像是自己会的(仔细想想又好像不会),但是部分分十分丰盛,还能接受吧。
T4 没看,输出 NO 走起!
估计是在 \([100,275]\) 范围内的分数,上下差挺大还。
1
最后结果是 270,人生第一次 rk1。
下午来了是旅游美食本人放歌,选择了 \(What's up? Pop!\),讲究一个诚信(见昨天写的)。
T1 几乎是一眼的题,分个奇偶性就完了。
挺有意思,T2 结论猜假了,但是略微有点点正确性导致我有 \(95\) pts,有趣极了。
赛后还是改了的,开始是模拟退火硬操控现实(手动随机数)过得,后来又加入了分块技巧就稳过了。\(O(mn^\frac 23 \log n + m \log n(退火) )\)。
除了我应该就都是数据点分治什么的了。
点击查看
#pragma GCC optimize(3)
#pragma GCC optimize(2)
// code by 樓影沫瞬_Hz17
#include <bits/stdc++.h>
#define en_ putchar_unlocked('\n')
#define e_ putchar_unlocked(' ')
// using lint = long long;
#define int long long
using namespace std;
template<class T> inline T in() {
T n = 0; char p = getchar_unlocked();
while (p < '-') p = getchar_unlocked();
bool f = p == '-' ? p = getchar_unlocked() : 0;
do n = n * 10 + (p ^ 48), p = getchar_unlocked();
while (isdigit(p));
return f ? -n : n;
}
template<class T> inline T in(T &a) { return a = in<T>(); }
template<class T> inline void out(T n) {
if(n < 0) putchar_unlocked('-'), n = -n;
if(n > 9) out(n / 10);
putchar_unlocked(n % 10 + '0');
}
template<class T1, class T2> T1 max(T1 a, T2 b) { return a > b ? a : a = b;}
template<class T1, class T2> T1 min(T1 a, T2 b) { return a < b ? a : a = b;}
constexpr int N = 200000 + 10;
using pii = pair<int, int>;
mt19937 rd(11923545);
int sa;
int a[N];
int n, m, k, d;
inline int get(int u) {
int ans = u * k + u * m, S = sa * u;
int les = d - S;
if(les < 0 || u < 0 || u > n) return -1;
int sum = 0, c = (n - u), res = 0;
for(int i = 1; i <= m; i ++) {
if(sum + a[i] * c <= les) sum += a[i] * c, res += c;
else {
int t = les - sum, l = 0, r = c, mid;
while(l <= r) {
mid = (l + r) >> 1;
if(a[i] * mid <= t) l = mid + 1;
else r = mid - 1;
}
res += r;
break;
}
}
return res + ans;
}
inline int Ans(int llm, int lim) {
int l = llm, r = lim, mid, res = max(get(l), get(r));
while(l <= r) {
mid = (l + r) >> 1;
int L = get(mid - 1), R = get(mid + 1), M = get(mid);
if(M > L and M > R) return M;
else if(R >= M) {
l = mid + 1;
}
else if(L >= M) {
r = mid - 1;
}
res = max({L, R, M});
if(l < llm || r > lim) return res;
}
return res;
}
inline void lyms() {
in(n), in(m), in(k), in(d); sa = 0;
for(int i = 1; i <= m; i ++) sa += in(a[i]);
sort(a + 1, a + 1 + m);
int l = 0, r = n, mid;
while(l <= r) {
mid = (l + r) >> 1;
if(sa * mid <= d) l = mid + 1;
else r = mid - 1;
}
int res = Ans(0, r);
int B = pow(r, 0.33), L = 0, R = B;
R = r;
l = 0, r = r;
double T = 5430228700000000, down = 0.9991;
for(; T > 4949990000; T *= down) {
if(l > r) swap(l, r);
if(l == r)
l = 0, r = R;
int x = rd() % (r - l) + l + 1, y = rd() % (r - l) + l + 1;
int now = max({get(x), get(y), Ans(min(x, y), max(x, y))});
if(now > res) res = now;
else if(exp(now - T) / T > 1 * rd() / RAND_MAX) {
l = (l + min(x, y)) / 2;
r = (r + max(x, y)) / 2;
}
}
R = B;
for(int i = 1; R <= r; i++) {
L += B, R += B;
res = max(res, Ans(L, R));
}
out(res), en_;
}
signed main() {
// freopen("i", "r", stdin);
// freopen("o", "w", stdout);
freopen("array.in", "r", stdin);
freopen("array.out", "w", stdout);
int T = in<int>();
while(T --) lyms();
}
// 星間~ 干渉~ 融解~ 輪迴~ 邂逅~ 再生~ ララバイ~
老师说以后下一届也会考这个,更好了。
T3 暴力 75 ???怎么这么多啊啊啊。
911

赛nm 20
这个好笑,更好笑的是我。
t1简单题,直接过
t2不会,直接过(多测没清空导致暴力挂了30pts)
t3感觉会,写!写单调队列优化dp,wa1个点,想着还行,您猜怎么着?
\(\large{贪心有96!!!}\)。
笑死了,,
t4直接过。
差点 rk1 说是。
9.12
现在是 \(19:53\) 我的天那!我现在才开始写这个东西?
行吧,至少想起来写了。
一天写假两个莫队,都不想改,放了,反正我懂了,改不改无所谓了。
好颓。。。。乐
9.13
MoNi 21
走前最后一场我又是软壳衣欸。
挺好。
t1 直接过。
t2 直接......看假题了说是,这个太可爱了,光速不会,然后改改做出了 \(O(n^3)\),又写了好几个特殊性质,最后特殊性质还假了一个,总分 \(64\)
被赶去学 t2 了,剩下的回家再写。。。
t3 不会,但是,开小了数组 \(88->64\),这把是dfs过样例之 \(O(n2^n)\) 拿 88,数据范围是 \(1e6\)(乐)。
t4 不会,改都不会改。
9.14 晚
返校了。
挺好,回去打歌时间极度压缩,总共打了:
5-10把左右魔王(arcaea)
2-4把六兆年的 phira 自制
3把(这个记得清楚)冥亡症的自制(就只是为了证明有些地方的手感真的很烂,而不是我手癖)。(phira)
未知把各种怪曲子(记不得了)(malody+喵斯+arcaea+神椿市协奏中。)。
总时长可能在 1-2 h左右。
其余时间。。。。
杀戮尖塔 + bilibili(看的大部分是塔)。
我真的是打牌打魔怔了呢。
9.15
https://www.cnblogs.com/lymsHz17/p/19092490
没了
9.16
爆零!!!
太棒了,实在感受到了人生的美好。
想起了某首黑柿子的曲子(甚至想不起来名字),总之就是想得起来旋律,感受到了莫名的治愈。
挺破防的,想要叫停某同学的喜悦(因为声音真的很大)。不过想想我也没这个资格就是了。
9.17
23镍化钴
咱又是 rk1 了哈,有点意思。
T1 是简单题,关键在于看出来二分的check(我赛时差点放弃二分),三维前缀和有点点恶心,不过还是在 \(45min\) 调出来了。
点击查看代码
// code by 樓影沫瞬_Hz17
#include <bits/stdc++.h>
using namespace std;
#define getc() getchar_unlocked()
#define putc(a) putchar_unlocked(a)
#define en_ putc('\n')
#define e_ putc(' ')
// #define int long long
using pii = pair<int, int>;
template<class T> inline T in() {
T n = 0; char p = getc();
while (p < '-') p = getc();
bool f = p == '-' ? p = getc() : 0;
do n = n * 10 + (p ^ 48), p = getc();
while (isdigit(p));
return f ? -n : n;
}
template<class T> inline T in(T &a) { return a = in<T>(); }
template<class T> inline void out(T n) {
if(n < 0) putc('-'), n = -n;
if(n > 9) out(n / 10);
putc(n % 10 + '0');
}
template<class T1, class T2> T1 max(T1 a, T2 b) { return a > b ? a : a = b;}
template<class T1, class T2> T1 min(T1 a, T2 b) { return a < b ? a : a = b;}
constexpr int N = 2e5 + 10;
int n, K, s[258][258][258];
inline int get(int rl, int rr, int gl, int gr, int bl, int br) {
int res = 0;
rl --, gl --, bl --;
res += s[rr][gr][br] - s[rr][gr][bl] - (s[rr][gl][br] - s[rr][gl][bl]) - (s[rl][gr][br] - s[rl][gr][bl] - (s[rl][gl][br] - s[rl][gl][bl]));
return res;
}
inline bool check(int lim) {
// cerr << lim;
for(int i = lim + 1; i <= 256; i ++) {
for(int j = lim + 1; j <= 256; j ++) {
for(int k = lim + 1; k <= 256; k ++) {
if(get(i - lim, i, j - lim, j, k - lim, k) >= K) return 1;
}
}
}
return 0;
}
signed main() {
// #ifndef ONLINE_JUDGE
// freopen("i", "r", stdin);
// freopen("o", "w", stdout);
// #endif
freopen("rgb.in", "r", stdin);
freopen("rgb.out", "w", stdout);
in(n), in(K);
for(int i = 1, r, g ,b; i <= n; i ++) {
in(r), in(g), in(b);
r ++, g ++, b ++;
s[r][g][b] ++;
}
for(int i = 1; i <= 256; i ++)
for(int j = 1; j <= 256; j ++)
for(int k = 1; k <= 256; k ++)
s[i][j][k] += s[i][j][k - 1];
for(int i = 1; i <= 256; i ++)
for(int j = 1; j <= 256; j ++)
for(int k = 1; k <= 256; k ++)
s[i][j][k] += s[i][j - 1][k];
for(int i = 1; i <= 256; i ++)
for(int j = 1; j <= 256; j ++)
for(int k = 1; k <= 256; k ++)
s[i][j][k] += s[i - 1][j][k];
int l = 0, r = 255, m;
while(l <= r) {
m = (l + r) >> 1;
if(check(m)) r = m - 1;
else l = m + 1;
}
out(l);
}
// 星間~ 干渉~ 融解~ 輪迴~ 邂逅~ 再生~ ララバイ~
T2 严格小于 T1,开始时写了两个假贪心拼一起,然后大样例直接把做法贴脸上了。。。
在 \(2.25h\) 左右做出来的,因为先去打 T3 部分分了。
点击查看代码
// code by 樓影沫瞬_Hz17
#include <bits/stdc++.h>
using namespace std;
#define getc() getchar_unlocked()
#define putc(a) putchar_unlocked(a)
#define en_ putc('\n')
#define e_ putc(' ')
#define int long long
using pii = pair<int, int>;
template<class T> inline T in() {
T n = 0; char p = getc();
while (p < '-') p = getc();
bool f = p == '-' ? p = getc() : 0;
do n = n * 10 + (p ^ 48), p = getc();
while (isdigit(p));
return f ? -n : n;
}
template<class T> inline T in(T &a) { return a = in<T>(); }
template<class T> inline void out(T n) {
if(n < 0) putc('-'), n = -n;
if(n > 9) out(n / 10);
putc(n % 10 + '0');
}
template<class T1, class T2> T1 max(T1 a, T2 b) { return a > b ? a : a = b;}
template<class T1, class T2> T1 min(T1 a, T2 b) { return a < b ? a : a = b;}
constexpr int N = 2e3 + 10;
int a[N], n, b[N], B[N], A[N], aa[N], bb[N];
signed main() {
#ifndef ONLINE_JUDGE
freopen("i", "r", stdin);
freopen("o", "w", stdout);
#endif
freopen("sort.in", "r", stdin);
freopen("sort.out", "w", stdout);
int T = in<int>();
while(T --) {
in(n);
for(int i = 1; i <= n; i ++) aa[i] = A[i] = in(a[i]);
for(int i = 1; i <= n; i ++) bb[i] = B[i] = in(b[i]);
vector<pii> ch, CH, cch;
priority_queue<int, vector<int>, greater<int> > q, Q;
bool c = 1, C = 1, cc = 1;
for(int i = n, j; i >= 1; i --) {
if(a[i] == b[i]) continue;
for(j = i; j >= 1; j --) {
q.push(a[j]);
if(a[j] == b[i]) break;
}
for(int k = j; k <= i; k ++) {
a[k] = q.top();
q.pop();
}
if(a[i] != b[i]) {
c = 0;
break;
}
ch.push_back({j, i});
}
if(c) {
out(0); en_;
out(ch.size()); en_;
for(pii v : ch) {
out(v.first), e_;
out(v.second), en_;
}
continue;
}
for(int i = 1, j; i <= n; i ++) {
if(A[i] == B[i]) continue;
for(j = i; j <= n; j ++) {
Q.push(A[j]);
if(A[j] == B[i]) break;
}
for(int k = i; k <= j; k ++) {
A[k] = Q.top();
Q.pop();
}
if(A[i] != B[i]) {
C = 0;
break;
}
CH.push_back({i, j});
}
if(C) {
out(0); en_;
out(CH.size()); en_;
for(pii v : CH) {
out(v.first), e_;
out(v.second), en_;
}
continue;
}
for(int i = n, j; i >= 1; i --) {
if(aa[i] == bb[i]) continue;
for(j = i; j >= 1; j --) {
if(aa[j] > bb[i]) {
cc = 0;
break;
}
if(aa[j] == bb[i]) break;
}
for(int k = j; k <= i - 1; k ++) {
swap(aa[k], aa[k + 1]);
cch.push_back({k, k + 1});
}
if(aa[i] != bb[i]) {
cc = 0;
break;
}
}
if(cc) {
out(0); en_;
out(cch.size()); en_;
for(pii v : cch) {
out(v.first), e_;
out(v.second), en_;
}
continue;
}
out(-1);en_;
}
}
// 星間~ 干渉~ 融解~ 輪迴~ 邂逅~ 再生~ ララバイ~
T3 是大困难题,可恶的组合数。。。
赛时写的数位 DP,因为空间开小挂了 \(12pts\)。
点击查看代码(37pts)
// code by 樓影沫瞬_Hz17
#include <bits/stdc++.h>
using namespace std;
#define getc() getchar_unlocked()
#define putc(a) putchar_unlocked(a)
#define en_ putc('\n')
#define e_ putc(' ')
// #define int long long
using pii = pair<int, int>;
template<class T> inline T in() {
T n = 0; char p = getc();
while (p < '-') p = getc();
bool f = p == '-' ? p = getc() : 0;
do n = n * 10 + (p ^ 48), p = getc();
while (isdigit(p));
return f ? -n : n;
}
template<class T> inline T in(T &a) { return a = in<T>(); }
template<class T> inline void out(T n) {
if(n < 0) putc('-'), n = -n;
if(n > 9) out(n / 10);
putc(n % 10 + '0');
}
template<class T1, class T2> T1 max(T1 a, T2 b) { return a > b ? a : a = b;}
template<class T1, class T2> T1 min(T1 a, T2 b) { return a < b ? a : a = b;}
const int N = 2.5e4 + 10, mod = 1e9 + 7;
int m, l;
int dig[2010];
int dp[2502][4500];
int aim;
inline int dfs(int pos, bool led, bool lim, int sum) {
if(sum > aim) return 0;
if(!pos) return sum == aim;
if(dp[pos][sum] != -1 and !led and !lim) return dp[pos][sum];
int res = 0;
int up = lim ? dig[pos] : m - 1;
for(int i = 0; i <= up; i ++) {
if(i == 0 and led) (res += dfs(pos - 1, 1, lim and up == i, sum + i)) %= mod;
else (res += dfs(pos - 1, 0, lim and up == i, sum + i)) %= mod;
}
return !led and !lim ? dp[pos][sum] = res: res;
}
signed main() {
// #ifndef ONLINE_JUDGE
// freopen("i", "r", stdin);
// freopen("o", "w", stdout);
// #endif
freopen("dba.in", "r", stdin);
freopen("dba.out", "w", stdout);
in(m), in(l);
for(int i = 1; i <= l; i ++)
aim += in(dig[l - i + 1]);
memset(dp, -1, sizeof dp);
out(dfs(l, 1, 1, 0) - 1);
}
// 星間~ 干渉~ 融解~ 輪迴~ 邂逅~ 再生~ ララバイ~
点击查看代码(100pts)
// code by 樓影沫瞬_Hz17
#include <bits/stdc++.h>
using namespace std;
#define getc() getchar_unlocked()
#define putc(a) putchar_unlocked(a)
#define en_ putc('\n')
#define e_ putc(' ')
template <int MOD> struct modint {
int val;
static int norm(const int& x) { return x < 0 ? x + MOD : x; }
static constexpr int get_mod() { return MOD; }
modint inv() const {
assert(val);
int a = val, b = MOD, u = 1, v = 0, t;
while (b > 0) t = a / b, swap(a -= t * b, b), swap(u -= t * v, v);
assert(!b);
return modint(u);
}
modint() {}
modint(const int& __NUM) : val(norm(__NUM % MOD)) {}
modint(const long long& __NUM) : val(norm(__NUM % MOD)) {}
template<typename T> modint(const T __NUM) : val(norm((long long)__NUM % MOD)) {}
// template<class T> operator T() const { return val; }
modint operator-() const { return modint(norm(-val)); }
modint operator!() const { return !val; }
modint operator~() const { return norm(~val); }
modint &operator++() { return (++ this->val) >= MOD ? (this->val -= MOD), *this : *this; }
modint &operator--() { return (-- this->val) < 0 ? (this->val += MOD), *this : *this; }
modint operator++(int) { return norm((++ *this).val - 1); }
modint operator--(int) { return norm((-- *this).val + 1); }
bool operator!=(const modint& o) { return val != o.val; }
bool operator==(const modint& o) { return val == o.val; }
bool operator<(const modint& o) { return val < o.val; }
bool operator>(const modint& o) { return val > o.val; }
bool operator<=(const modint& o) { return val <= o.val; }
bool operator>=(const modint& o) { return val >= o.val; }
modint& operator+=(const modint& o) { return val = (1ll * val + o.val) % MOD, *this; }
modint& operator-=(const modint& o) { return val = norm(1ll * val - o.val), *this; }
modint& operator*=(const modint& o) { return val = static_cast<int>(1ll * val * o.val % MOD), *this; }
modint& operator/=(const modint& o) { return *this *= o.inv(); }
modint& operator%=(const modint& o) { assert(o.val); return val %= o.val, *this; }
modint& operator^=(const modint& o) { return val ^= o.val, *this; }
modint& operator>>=(const modint& o) { return val >>= o.val, *this; }
modint& operator<<=(const modint& o) { return (val <<= o.val) %= MOD, *this; }
modint operator-(const modint& o) const { return modint(*this) -= o; }
modint operator+(const modint& o) const { return modint(*this) += o; }
modint operator*(const modint& o) const { return modint(*this) *= o; }
modint operator/(const modint& o) const { return modint(*this) /= o; }
modint operator%(const modint& o) const { return modint(*this) %= o; }
modint operator^(const modint& o) const { return modint(*this) ^= o; }
modint operator>>(const modint& o) const { return modint(*this) >>= o; }
modint operator<<(const modint& o) const { return modint(*this) <<= o; }
friend std::istream& operator>>(std::istream& is, modint& a) {
long long v;
return is >> v, a.val = norm(v % MOD), is;
}
friend std::ostream& operator<<(std::ostream& os, const modint& a) { return os << a.val; }
friend std::string tostring(const modint& a) { return std::to_string(a.val); }
};
using mint = modint<1000000007>;
using pii = pair<int, int>;
template<class T> inline T in() {
T n = 0; char p = getc();
while (p < '-') p = getc();
bool f = p == '-' ? p = getc() : 0;
do n = n * 10 + (p ^ 48), p = getc();
while (isdigit(p));
return f ? -n : n;
}
template<class T> inline T in(T &a) { return a = in<T>(); }
template<class T> inline void out(T n) {
if(n < 0) putc('-'), n = -n;
if(n > 9) out(n / 10);
putc(n % 10 + '0');
}
template<class T1, class T2> T1 max(T1 a, T2 b) { return a > b ? a : a = b;}
template<class T1, class T2> T1 min(T1 a, T2 b) { return a < b ? a : a = b;}
const int N = 2000 + 10, mod = 1e9 + 7;
inline mint qp(mint i, int k) {
mint res = 1;
for(; k; k >>= 1, i = i * i)
if(k & 1) res = i * res;
return res;
}
mint f[4000010];
inline mint C(int n, int m) {
if(m > n) return 0;
return f[n] / f[m] / f[n - m];
}
int m, l, sm;
int x[N];
signed main() {
#ifndef ONLINE_JUDGE
freopen("i", "r", stdin);
freopen("o", "w", stdout);
#endif
freopen("dba.in", "r", stdin);
freopen("dba.out", "w", stdout);
in(m), in(l);
f[0] = 1;
for(int i = 1; i <= m * l ; i ++) f[i] = f[i - 1] * i;
for(int i = 1; i <= l; i ++)
sm += in(x[l - i + 1]);
mint ans = 0;
for(int i = l; i >= 1; i --) {
for(int j = 0; j < i; j ++) {
int op = (j & 1) ? -1 : 1;
ans += C(i - 1, j) * (C(sm - m * j + i - 1, i - 1) - C(sm - x[i] - m * j + i - 1, i - 1)) * op;
}
sm -= x[i];
}
out(ans.val);
}
// 星間~ 干渉~ 融解~ 輪迴~ 邂逅~ 再生~ ララバイ~
T4 不会改都,我过于飞舞了呢。。。
赛时模拟退火硬是退出来了 \(26pts\),大于暴力的 \(10pts\)。
点击查看代码
// code by 樓影沫瞬_Hz17
#include <bits/stdc++.h>
using namespace std;
#define getc() getchar_unlocked()
#define putc(a) putchar_unlocked(a)
#define en_ putc('\n')
#define e_ putc(' ')
#define int long long
using pii = pair<int, int>;
template<class T> inline T in() {
T n = 0; char p = getc();
while (p < '-') p = getc();
bool f = p == '-' ? p = getc() : 0;
do n = n * 10 + (p ^ 48), p = getc();
while (isdigit(p));
return f ? -n : n;
}
template<class T> inline T in(T &a) { return a = in<T>(); }
template<class T> inline void out(T n) {
if(n < 0) putc('-'), n = -n;
if(n > 9) out(n / 10);
putc(n % 10 + '0');
}
template<class T1, class T2> T1 max(T1 a, T2 b) { return a > b ? a : a = b;}
template<class T1, class T2> T1 min(T1 a, T2 b) { return a < b ? a : a = b;}
constexpr int N = 2e5 + 10;
constexpr double down = 0.9;
int a[N], n;
vector<pii> e[N];
int dis[N];
bool vis[N];
inline int bfs(int x, int y) {
memset(dis, 63, (n + 3) * 8);
memset(vis, 0, (n + 3));
queue<int> q;
dis[x] = dis[y] = 0;
q.push(x); q.push(y);
while(!q.empty()) {
int u = q.front(); q.pop();
vis[u] = 0;
for(pii b : e[u]) {
if(dis[b.first] > dis[u] + b.second) {
dis[b.first] = dis[u] + b.second;
if(!vis[b.first]) q.push(b.first);
vis[b.first] = 1;
}
}
}
int res = 0;
for(int i = 1; i <= n; i ++) {
res += a[i] * dis[i];
}
return res;
}
int dp[N];
inline bool chain() {
int cnt = 0, rt = 1;
for(int i = 1; i <= n; i ++) {
if(e[i].size() == 1) cnt ++, rt = i;
if(e[i].size() > 2) return 0;
}
if(cnt > 2) return 0;
int ans = bfs(rt, rt);
vector<pii> ve;
for(int i = 1; i <= n; i ++) {
ve.push_back({a[i] * dis[i], i});
}
sort(ve.begin(), ve.end());
int aaa = ve.rbegin()->first;
int l = 0, r = n - 1;
while(l <= r) {
int m = ( l + r ) >> 1;
if(ve[m].first > aaa / 4) r = m - 1;
else l = m + 1;
}
int t1 = r;
l = 0, r = n - 1;
while(l <= r) {
int m = ( l + r ) >> 1;
if(ve[m].first > aaa / 4 * 3) r = m - 1;
else l = m + 1;
}
int t2 = r;
for(int i = max(0, t1 - 3); i <= min(n, t1 + 3); i ++) {
for(int j = max(0, t2 - 3); j <= min(n, t2 + 3); j ++) {
ans = min(ans, bfs(ve[i].second , ve[j].second));
}
}
out(ans); en_;
return 1;
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("i", "r", stdin);
freopen("o", "w", stdout);
#endif
freopen("banking.in", "r", stdin);
freopen("banking.out", "w", stdout);
mt19937 rd(time(0));
int T = in<int>();
while(T --) {
for(int i = 1; i <= n; i ++) e[i].clear();
in(n);
for(int i = 1; i <= n; i ++) in(a[i]);
for(int i = 1, u, v, w; i < n; i ++) {
in(u), in(v), in(w);
e[u].push_back({v, w});
e[v].push_back({u, w});
}
if(chain()) {
continue;
}
int p1 = 1, p2 = 2;
int ans = bfs(p1, p2);
if(n <= 1000) {
for(int i = 1; i <= min(100, n); i ++) {
for(int j = i + 1; j <= min(100, n); j ++) {
ans = min(ans, bfs(i, j));
}
}
}
double T = 20000;
int tm = 0;
for(int x, tmp; T > 1e-2; T *= down) {
tm ++;
x = rd() % n + 1;
if(tm & 1) {
if(p2 != x) {
swap(p1, x);
}
}
else {
if(p1 != x) {
swap(p2, x);
}
}
tmp = bfs(p2, p1);
if(tmp < ans) ans = tmp;
else if(exp(tmp - T) * T > rd() * 1.0 / RAND_MAX) {
if(tm & 1) {
if(p2 != x) {
swap(p1, x);
}
}
else {
if(p1 != x) {
swap(p2, x);
}
}
}
}
out(ans);
en_;
}
}
// 星間~ 干渉~ 融解~ 輪迴~ 邂逅~ 再生~ ララバイ~
挺好,总分 \(100 + 100 + 37 + 26 = 263\)
下午我放的 \(\text{苦巧克力装饰}\),不知道为什么就突然改心思想放这个了,本来想的是 \(\text{世界去死}\) 的。
但是总之很好听就是了。
9.19
欸昨天我没更吗?
9.20
今天是 \(\text{CSP-S}\) 一轮了,祝我 rp++ 吧。
应该不至于过不了吧。。。。
现在是考后,
不知道什么原因,题目好简单。但是更慌了,完全不知道分数线是多少了,没个底,
不过过应该是可以过的。
而且今天是我妹妹生日,打了电话。很高兴的,我是。总之就是很治愈什么的。
马上要去补 whk 了,有点慌的。
9.21
算是中点了。
集训告一段落,去补文化课了。
一周内是不会更新什么东西了。
最后在 luogu 发了三篇待审核的题解,属于是盲盒是。
猜猜能过几篇?
9.22
不想写
9.30
好像发烧了。
好有意思。
模拟 25
第一题是会的,但是爆了 40,原因是初始化出错。
for(int j = i; j <= n; j ++) f[i][j] = get(i - 1, j);
for(int i = 1; i <= n; i ++) {
dp[i][1] = f[1][i];
ls[i][1] = i - 1;
}
\(ls\) 是表示的转移处,应该初始化成 \(0\)。
第二题就不会了,乐,感觉自己观察出了很好的性质,好像能拿60,但是因为不会怎么 map<bitset<200>, int> 导致拿不到。
不过本来好像也没什么希望拿到。
后面都没看。
乐完了。
我是傻逼。

要死了。
update on evening
想听 \(Arcana\ Eden\)
10.2
注意到我生病了所以短期断更了一段时间。
但是我恢复更新了。
今天是 2025多校冲刺CSP模拟赛1。
我在家打的,不过现在已经回机房了。
那感觉没什么可以注意的了。
身体状况:
大病没有,小病不少。
大概就是查了病毒什么的,发现没有什么很流行的病毒在我身上,还花了 \(200¥\) 有点崩溃。
但是据说我嗓子极其红润,而且扁桃体有白点,说是最近也流行这个,如果恶化很容易发高烧,再加上莫名其妙的身体知觉问题,以及那几个一直就没消失过的毛病。
我很强大了。
moni
挺好的,打了 \(100 + 100 + 55 + 0\),估计得分其实是 \(100 + [40,100] + 30\)
为什么是 [40,100],主要是因为我感觉我的复杂度应该是一个 \(O(Tn^3 \log V)\) 的,但是我造不出来这样的东西。
我太菜了,但是赛后有 dalao 造出了 \(hack\),我跑了 \(10.7s\),大抵我赛时估计的复杂度也是假的。
然后是 T3。我照着部分分打的就是 \(30\)。但是很怪。
\(L \le 300\) 里面有两个 \(n = 10\),\(无限制\) 里面还有好几个 \(n \le 11\) 的(我没把 \(11\) 加进去,导致本应是 \(60\) 却遗憾离场)。
就有了 \(55\),憋憋。
T4 写了:
- 原顺序
- 打乱顺序
- 按照 \(a.t < b.t\) 排序
- 按照 \(a.s < b.s\) 排序
- 按照 \(a.t \times a.s < b.t \times b.s\) 排序
- 按照 \(a.t \times b.s < b.t \times a.s\) 排序
的贪心。
贪到了 \(0pts\),憋憋。
再谈谈回家
听了好多 kafu 的歌,发现了许多之前没发现的优质 P主,很好。
打了好多牌,但是发生了很有趣的事
大概是这样的,我装了很多美化我的尖塔的 mod,其中一个猎人的美化 mod 有一个 se 的战败 cg,没什么意义,就弹出来一下下,但是我本着不能没有的心态还是开了这个选项。
然后我大抵是老眼昏花了,在三层 \(劣人\ vs\ 天罚\) 的时候疯狂 sl 调牌序的过程中忘记计算了 \(灼烧\) 的伤害,导致......
...... 没错,战败了,然后我妈在旁边看我打牌来着,事实是我爸也在,不过应该没看。
乐,没人说任何东西来着。
10.4
模拟
84 + 100 + 20 + 35
T1 因为没有判断取等条件直接挂分。
T2 \(2e5\ and\ 2s\) 但是 \(O(n)\)
T3 傻逼东西,早知道不做了,T4 是我会的,但是看题太晚了,都怪 T3。
T4 只打了 45 的 \(O(n^2)\) 但是好像有整整 \(75\) 拿,但是我并查集写挂了。
总结:我就应该跳过 T3 开 T4 的,下次一定记住 \(1.5h\) 前开 T4,不要一定觉得难度递增。
10.9
挺好,是模拟28了已经
100 + 100 + 28 + 66
按道理讲应该是 100 + 100 + 40 + 83,但是我糖。
没了,最近没有什么记东西的动力。

浙公网安备 33010602011771号