九省联考总贴

[九省联考2018] iiidx 给定一颗nnn个点的有根树,和nnn权值d1...dnd1...dnd_1 ... d_n。将每个权值分配个每个节点,要求使父亲的权值小于等于儿子的权值。依次最大化1,2,3...n1,2,3...n1, 2, 3...n号点的权值,输出方案。 n≤600000n≤600000n \leq 600000 从111号点开始枚举,由于我们要使一个点最大,所以我们每次都要求出当前符合要求的最大的... 阅读详情

秘密袭击

九省联考感觉有区分度,质量也挺高的。

单独写了。

详情见另一个博客。

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

typedef unsigned int ui;

const int N = 2e3 + 5;
const int M = N * 2;
const ui mod = 64123;
const int MAX = 1e5 + 5;

struct NODE {
  ui a, b, c, d;
  friend NODE operator * (NODE er, NODE la) {
    return
      (NODE) {er.a * la.a % mod, (la.a * er.b % mod + la.b) % mod
      , (la.c * er.a % mod + er.c) % mod,
	(er.b * la.c % mod + la.d + er.d) % mod};
  }
  void init() {
    a = 1; b = c = d = 0;
  }
}T[MAX];

int n, k, W, d[N], fir[N], ne[M], to[M], cnt, rt[N], sz, ch[MAX][2];

#define lc (ch[x][0])
#define rc (ch[x][1])

void add(int x, int y) {
  ne[++ cnt] = fir[x];
  fir[x] = cnt;
  to[cnt] = y;
}

void link(int x, int y) {
  add(x, y);
  add(y, x);
}

#define Foreachson(i, x) for(int i = fir[x]; i; i = ne[i])

void readin() {
  int x, y;
  scanf("%d%d%d", &n, &k, &W);
  for(int i = 1; i <= n; ++ i) scanf("%d", &d[i]);
  for(int i = 1; i < n; ++ i) {
    scanf("%d%d", &x, &y);
    link(x, y);
  }
}

ui poly[N], F[MAX], S[MAX];

int newnode() {
  ++ sz;
  F[sz] = S[sz] = 0;
  T[sz].init();
  ch[sz][0] = ch[sz][1] = 0;
  return sz;
}

void pt(int &x, NODE who) {
  if(!x) x = newnode();
  T[x] = T[x] * who;
  return;
}

void pd(int x) {
  pt(lc, T[x]);
  pt(rc, T[x]);
  T[x].init();
}

void chg(int &x, int l, int r, int L, int R, NODE who) {
  if(!x) x = newnode();
  if(l == L && r == R) {
    T[x] = T[x] * who;
    return;
  }
  pd(x);
  int mid = (l + r) >> 1;
  if(L > mid) chg(rc, mid + 1, r, L, R, who);
  else if(R <= mid) chg(lc, l, mid, L, R, who);
  else chg(lc, l, mid, L, mid, who), chg(rc, mid + 1, r, mid + 1, R, who);
}

int merge(int x, int y) {
  if(!x || !y) return x + y;
  if(!ch[x][0] && !ch[x][1]) swap(x, y);
  if(!ch[y][0] && !ch[y][1]) {
    // y's is ((a + b), d)
    T[x].a = T[x].a * T[y].b % mod;
    T[x].b = T[x].b * T[y].b % mod;
    T[x].d = (T[x].d + T[y].d) % mod;
    return x;
  }
  pd(x); pd(y);
  ch[x][0] = merge(ch[x][0], ch[y][0]);
  ch[x][1] = merge(ch[x][1], ch[y][1]);
  return x;
}

void dfs(int x, int f, ui magic) {
  rt[x] = newnode();
  pt(rt[x], (NODE){0, 1, 0, 0});
  Foreachson(i, x) {
    int V = to[i];
    if(V == f) continue;
    dfs(V, x, magic);
    rt[x] = merge(rt[x], rt[V]);
  }
  if(d[x]) chg(rt[x], 1, W, 1, d[x], (NODE){magic, 0, 0, 0});
  pt(rt[x], (NODE){1, 0, 1, 0});
  pt(rt[x], (NODE){1, 1, 0, 0});
}

void query(int &x, int l, int r, ui &ans) {
  if(l == r) {
    ans = ans + (T[x].d);
    ans %= mod;
    return;
  }
  int mid = (l + r) >> 1;
  pd(x);
  query(lc, l, mid, ans), query(rc, mid + 1, r, ans);
}

ui f[N], g[N];

int Pow(ui x, int y) {
  ui res = 1;
  for(; y; y >>= 1, x = 1LL * x * x % mod) {
    if(y & 1) {
      res = 1LL * res * x % mod;
    }
  }
  return res;
}

void dec(ui *f, ui *g, int x) {
  for(int i = 0; i <= n + 1; ++ i) g[i] = f[i];
  ui Inv = Pow(x, mod - 2);
  for(int i = 0; i <= n; ++ i) {
    g[i] = 1LL * g[i] * (mod - Inv) % mod;
    g[i + 1] = (g[i + 1] - g[i] + mod) % mod;
  }
  assert(!g[n + 1]);
}

void Lagrange(void) {
  memset(f, 0, sizeof(f));
  memset(g, 0, sizeof(g));
  f[0] = 1;
  for(int i = 1; i <= n + 1; ++ i) 
    for(int j = n + 1; j >= 0; -- j)
      f[j + 1] = (f[j + 1] + f[j]) % mod,
	f[j] = 1LL * f[j] * (mod - i) % mod;
  ui ans = 0;
  for(int i = 1; i <= n + 1; ++ i) {
    dec(f, g, i);
    ui now = 0;
    for(int j = k; j <= n; ++ j) now = (now + g[j]) % mod;
    for(int j = 1; j <= n + 1; ++ j) {
      if(i != j)
	now = now * Pow((i - j + mod) % mod, mod - 2) % mod;
    }
    now = now * poly[i] % mod;
    ans = (ans + now) % mod;
  }
  cout << ans << endl;
}

int main() {
  readin();
  for(int i = 1; i <= n + 1; ++ i) {
    sz = 0;
    dfs(1, 0, i);
    query(rt[1], 1, W, poly[i]);
    //poly[i] = (poly[i] + query(rt[1], 1, W, j)) % mo;
    cerr << i <<" " << poly[i] << endl;
  }
  Lagrange();
}

劈配

劈配不难,这只需要在每一次增广以后看一下哪一些点能够增广到终点就可以了。
我的小错误: 清空的时候不要上次用多少清空多少,尽量清空出这次需要用的量,否则容易在边界上出问题。 比如我这里就少处理了一位导致WA一个点。

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

const int N = 1e3 + 5;
const int M = N * 100;

vector <int> T[N][N];

int n, m, b[N], x, li[N], fir[N], ne[M], to[M], cnt = 1, cur[N], ttt, c, C[M];

void add(int x, int y, int z) {
  ne[++ cnt] = fir[x];
  fir[x] = cnt;
  to[cnt] = y;
  C[cnt] = z;
}

void link(int x, int y, int z) {
  add(x, y, z);
  add(y, x, 0);
}

#define Foreachson(i, x) for(int i = fir[x]; i; i = ne[i])
#define Forcurbegin(i, x) for(int &i = cur[x]; i; i = ne[i])
#define REP(i, a, b) for(int i = (a); i <= (b); ++ i)
#define PER(i, a, b) for(int i = (a); i >= (b); -- i)
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(), x.end()
#define CLR(x) memset(x, 0, sizeof(x))

int dis[N], s, t;
bitset <N> can[N];

bool BFS(int s, int t) {
  for(int i = 1; i <= n + m + 2; ++ i) dis[i] = -1, cur[i] = fir[i];
  queue <int> q; while(!q.empty()) q.pop();
  q.push(s); dis[s] = 0;
  while(!q.empty()) {
    int ind = q.front();
    q.pop();
    Foreachson(i, ind) if(C[i]) {
      int V = to[i];
      if(dis[V] != -1) continue;
      dis[V] = dis[ind] + 1;
      q.push(V);
      if(V == t) return 1;
    }
  }
  return 0;
}

int dfs(int x, int fl, int t) {
  if(!fl || x == t) return fl;
  int res = 0;
  Forcurbegin(i, x) if(dis[to[i]] == dis[x] + 1 && C[i]) {
    int V = to[i];
    int ret = dfs(V, min(fl, C[i]), t);
    if(!ret) continue;
    res += ret;
    fl -= ret;
    C[i] -= ret;
    C[i ^ 1] += ret;
    if(!fl) break;
  }
  return res;
}

int Left(int x) {
  return x + 1;
}

int Right(int x) {
  return x + n + 1;
}

int ans1[N], ans2[N];

void init() {
  cin >> n >> m;
  CLR(b); CLR(li); CLR(fir); CLR(ne); CLR(to); CLR(C); CLR(cur);
  cnt = 1;
  REP(i, 1, n) {
    can[i] = 0;
    ans1[i] = ans2[i] = 0;
    REP(j, 0, m) T[i][j].clear();
  }
  s = 1, t = n + m + 2;
  REP(i, 1, m) scanf("%d", &b[i]), link(Right(i), t, b[i]);
  REP(i, 1, n) {
    REP(j, 1, m) scanf("%d", &x), T[i][x].push_back(j);
  }
  REP(i, 1, n) scanf("%d", &li[i]);
}

void solve() {
  can[1] = 0;
  REP(i, 1, m) if(b[i]) can[1][i] = 1;
  REP(i, 1, n) {
    int who = m + 1;
    REP(j, 1, m) {
      bool ok = 0;
      REP(k, 0, SZ(T[i][j]) - 1) {
	if(can[i][T[i][j][k]]) {
	  ok = 1; break;
	}
      }
      if(ok) {
	who = j;
	link(s, Left(i), 1);
	REP(k, 0, SZ(T[i][j]) - 1)
	  link(Left(i), Right(T[i][j][k]), 1);
	BFS(s, t);
	dfs(s, 1e9, t);
	break;
      }
    }
    bitset < N > need; need = 0;
    ans1[i] = who;
    REP(j, 1, li[i]) REP(k, 0, SZ(T[i][j]) - 1) need[T[i][j][k]] = 1;
    ans2[i] = i;
    PER(j, i, 1) if((need & can[j]).count()) {
      ans2[i] = i - j; break;
    }
    REP(j, 1, m) if(BFS(Right(j), t)) can[i + 1][j] = 1;
  }
  for(int i = 1; i <= n; ++ i) printf("%d ", ans1[i]); puts("");
  for(int i = 1; i <= n; ++ i) printf("%d ", ans2[i]); puts("");
}

int main() {
  cin >> ttt >> c;
  for(; ttt --;) {
    init();
    solve();
  }
}

IIIDX

这个题我觉得出题人是对着idea造的题。
首先我们先解决一个子问题: 每次给定一个操作(a,b)(a,b)(a,b),表示这次操作[1,a][1,a][1,a]这个区间里选择了b个东西删去,询问最前面可能出现的jjj 使得 ∑i=1jAi\sum _{i=1}^{j} A_i∑i=1j​Ai​最大 AiA_iAi​表示第i个东西是否没被选择。 这个问题首先我的一个思路是区间等差数列加求最小值,这样就是一个李超树的问题。然而这个题有一个比较优美的性质,我们只需要给[a,n][a,n][a,n]的所有数减去b,然后查询的时候查询一个后缀是否可行就行了。
这个题我首先想到了一个只能过60pts对于互不相同能够出解的贪心,后来看到这一档部分分感觉不太对,然后手膜了一下发现这个只能过60pts。然后就不会捉了。
后来发现我不会做的原因是没有利用到这棵树儿子编号是连续的的性质,下次对于这种一个树的儿子都是连在一起做的问题,大胆的push一个子树的贡献,然后在考虑儿子时撤销。
其实正解就是直接从左到右考虑按位确定,每一次需要预定一个子树里的所有值,这对应了我上面说的先把父亲的一个子树的贡献计算了,然后到儿子的时候撤销。



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

const int N = 5e5 + 5;
const int Segment_Size = N * 4;

int L[Segment_Size], R[Segment_Size];
long long Min[Segment_Size], tag[Segment_Size];
int n, d[N], fa[N], pos[N], Size[N];
double k;

#define lc (no << 1)
#define rc (no << 1 | 1)
#define getmid int mid = (L[no] + R[no]) >> 1

void up(int no) {
  Min[no] = min(Min[lc], Min[rc]);
}

void build(int no, int l, int r) {
  L[no] = l, R[no] = r;
  if(l == r) {
    tag[no] = 0;
    Min[no] = L[no];
    return;
  }
  getmid;
  build(lc, l, mid);
  build(rc, mid + 1, r);
  up(no);
}

void pt(int no, int x) {
  tag[no] += x;
  Min[no] += x;
}

void pd(int no) {
  if(L[no] == R[no] || !tag[no]) return;
  pt(lc, tag[no]);
  pt(rc, tag[no]);
  tag[no] = 0;
  up(no);
}

int query(int no, int x) {
  if(L[no] == R[no]) {
    if(Min[no] >= x) return L[no];
    else return L[no] + 1;
  }
  pd(no);
  if(Min[rc] >= x) return query(lc, x);
  else return query(rc, x);
}

void chg(int no, int l, int r, int x) {
  if(L[no] == l && R[no] == r) {
    pt(no, x);
    return;
  }
  pd(no);
  getmid;
  if(l > mid) chg(rc, l, r, x);
  else if(r <= mid) chg(lc, l, r, x);
  else chg(lc, l, mid, x), chg(rc, mid + 1, r, x);
  up(no);
}

map <int, int> Map;

int main() {
  cin >> n >> k;
  for(int i = 1; i <= n; ++ i) scanf("%d", &d[i]);
  sort(d + 1, d + n + 1);
  reverse(d + 1, d + n + 1);
  for(int i = 1; i <= n; ++ i) {
    Map[d[i]] = i;
  }
  for(int i = 1; i <= n; ++ i) {
    fa[i] = ((int)(i / k));
  }
  for(int i = n; i >= 1; -- i) Size[i] += 1, Size[fa[i]] += Size[i];
  build(1, 1, n);
  for(int i = 1; i <= n; ++ i) {
    if(fa[i] && fa[i] != fa[i - 1]) chg(1, pos[fa[i]], n, Size[fa[i]] - 1);
    int now = query(1, Size[i]);
    pos[i] = Map[d[now]];
    //cerr << i <<" " << now << endl;
    chg(1, pos[i], n, -Size[i]);
  }
  for(int i = 1; i <= n; ++ i) printf("%d ", d[pos[i]]);
  puts("");
}

林克卡特树

首先一个比较trivialtrivialtrivial的结论就是我们选择k条不相交的链的最大长度和就是答案。然后发现显然可以费用流,而这个费用流又是凸的,所以就可以WQS二分了。
较为套路。
值得注意的是这类题目二分的边界需要特别考虑!

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

const int N = 3e5 + 5;
const int M = N * 2;

int n, k, x, y, z, fir[N], ne[M], to[M], cnt, C[M];

void add(int x, int y, int z) {
  ne[++ cnt] = fir[x];
  fir[x] = cnt;
  to[cnt] = y;
  C[cnt] = z;
}

void link(int x, int y, int z) {
  add(x, y, z);
  add(y, x, z);
}

#define Foreachson(i, x) for(int i = fir[x]; i; i = ne[i])

struct NODE {
  long long Val, num;
  friend bool operator < (NODE a, NODE b) {
    return (a.Val == b.Val) ? a.num < b.num : a.Val < b.Val;
  }
  friend NODE operator + (NODE a, NODE b) {
    return (NODE){a.Val + b.Val, a.num + b.num};
  }
};

long long ret, magic;
NODE Dp[N][3];

NODE upd(NODE x) {
  return (NODE){x.Val - magic, x.num + 1};
}

int tot = 0;

void dfs(int x, int f) {
  NODE tmp[4];
  tmp[1] = tmp[2] = tmp[0] = (NODE){0, 0};
  Foreachson(i, x) {
    int V = to[i];
    if(V == f) continue;
    dfs(V, x);
    Dp[V][1].Val += C[i];
    for(int a = 2; a >= 0; -- a)
      tmp[a + 1] = max(tmp[a] + Dp[V][1], tmp[a + 1]),
	tmp[a] = max(tmp[a], tmp[a] + Dp[V][0]);
  }
  Dp[x][0] = max(upd(tmp[1]), max(max(tmp[0], upd(tmp[0])), upd(tmp[2])));
  //cerr << x <<" " << f << " " << tmp[0].Val <<" " << tmp[0].num <<" " << Dp[x][0].Val <<" " << Dp[x][0].num << endl;
  Dp[x][1] = max(tmp[1], tmp[0]);
}

int solve(int T) {
  magic = T;
  dfs(1, 0);
  return Dp[1][0].num;
}

int main() {
  cin >> n >> k;
  ++ k;
  for(int i = 1; i < n; ++ i) {
    scanf("%d%d%d", &x, &y, &z);
    link(x, y, z);
  }
  long long L = -1e12, R = 1e12, res = 0;
  while(L <= R) {
    int mid = (L + R) >> 1;
    if(solve(mid) < k) R = mid - 1;
    else L = mid + 1, res = mid;
  }
  //if(solve(res + 1) == k) ++ res;
  solve(res);
  //cerr << Dp[1][0].Val << endl;
  printf("%lld\n", Dp[1][0].Val + 1LL * k * res);
}

一双木棋

一眼题不说了。



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

const int N = 15;

map < long long, int> Dp;

int n, m, x, y, A[N][N], B[N][N];
long long Pm[N];
long long MAX = 0;

int solve(long long x) {
  if(Dp.count(x)) return Dp[x];
  Dp[x] = -2e9;
  int tmp[N] = {0};
  long long now = x;
  for(int i = 1; i <= n; ++ i) {
    tmp[i] = now % (m + 1);
    now /= (m + 1);
  }
  tmp[0] = 1e9;
  int res = 0;
  for(int i = 1; i <= n; ++ i) res += (tmp[i]);
  for(int i = 1; i <= n; ++ i) {
    if(tmp[i - 1] > tmp[i] && tmp[i] < m) {
      long long y = x;
      y -= 1LL * Pm[i] * tmp[i];
      y += 1LL * Pm[i] * (tmp[i] + 1);
      //cerr << x <<" " << y <<" " << -solve(y) << " " << ((res & 1) ? B[i][tmp[i] + 1] : A[i][tmp[i] + 1]) << " " << Dp[x] << " " << "in" << endl;
      Dp[x] =
    max(Dp[x], -solve(y) + ((res & 1) ? B[i][tmp[i] + 1] : A[i][tmp[i] + 1]));
      //cerr << x <<" " << y <<" " << -solve(y) << " " << ((res & 1) ? B[i][tmp[i] + 1] : A[i][tmp[i] + 1]) << " " << Dp[x] << endl;
    }
  }
  //for(int i = 1; i <= n; ++ i) printf("%d ", tmp[i]);
  // puts("");
  //cerr << Dp[x] << " -- " << res << endl;
  //cerr << endl;
  return Dp[x];
}

int main() {
  scanf("%d%d", &n, &m);
  for(int i = 1; i <= n; ++ i)
    for(int j = 1; j <= m; ++ j) scanf("%d", &A[i][j]);
  for(int i = 1; i <= n; ++ i)
    for(int j = 1; j <= m; ++ j) scanf("%d", &B[i][j]);
  long long now = 0;
  Pm[1] = 1;
  for(int i = 2; i <= n; ++ i) Pm[i] = 1LL * Pm[i - 1] * (m + 1);
  for(int i = 1; i <= n; ++ i) now += 1LL * Pm[i] * m;
  MAX = now;
  Dp[MAX] = 0;
  printf("%d\n", solve(0));
}

制胡窜

咕咕咕。

OpenStack 2018 年终盘点 目录 文章目录目录前言OpenStack 一年来的成长NovaCinderNeutronIronicCyborgOctaviaKollaMagnumZunKuryr从 OpenStack 到 OpenInfra 前言 这是最好的时代,也是最坏的时代 — — 查尔斯·约翰·赫芬姆·狄更斯《双城记》 年关将至,闲暇之余,回顾我与 OpenStack 的 2018。 NOTE:仅作为个人见解,与公... 阅读详情

相关推荐

【网络安全】Centos7安装杀毒软件----ClamAV

Clam AntiVirus是一个Linux系统上使用的反病毒软件包。主要应用于邮件服务器,采用多线程后台操作,可以自动升级病毒库。

你在看屏幕的同时,屏幕也在注视着你 8827

P4383 [八省联考 2018] 林克卡特树(wqs二分、树形dp)

小清新wqs二分+树形dp

BUG_Creater_jie的博客 705

3D Slicer中安装MedSAM插件

大家应该都读过这篇论文:《Segment Anything in Medical Images》这个插件便是该论文团队推出的在3D Slicer上使用的插件,可以分割医学图像的任何感兴趣区域。

m0_73719342的博客 2329

4383 [八省联考 2018] 林克卡特树(WQS 二分+DP)

P4383 [八省联考 2018] 林克卡特树 给定一颗 \(n\) 个点的树,每条边有边权 \(v(|v|\le 10^6)\),要求删去其中任意 \(k\) 条边,使得剩余联通块的直径之和最大。求出这个最大值。 \(0\le k<n\le 3\times 10^5,10s,1GB\)。 问题是怎么求直径?!直径不就是最大的链吗?! 发现原问题等价于选择 \(k+1\) 条互不相交的...

EricQian的博客 524

第一届“龙信杯”电子数据取证竞赛Writeup

第一届“龙信杯”电子数据取证竞赛Writeup

toto的博客 1万+

pytorch中的wheel文件

whl 文件是 Python 的一个软件包分发格式,用于在 Python 中安装软件包。它是 Python Wheel 的缩写,也被称为 wheel 文件。这种文件格式旨在简化 Python 软件包的安装和分发。对于 PyTorch 而言,它提供了预编译的 .whl 文件,您可以通过 pip 安装这些文件来快速方便地安装 PyTorch。这些 .whl 文件是已经编译好的二进制分发文件,可以直接安装在您的 Python 环境中,而无需再进行编译。

bj_zhb的博客 3125

【WQS二分】【DP】 [八省联考2018]林克卡特树lct

分析: 显然有个O(N∗K)O(N*K)O(N∗K)的方法。 裸的树上背包。根节点分类讨论那种。 然后这要T 于是: 即得易见平凡,仿照上例显然。留作习题答案略,读者自证不难。 反之亦然同理,推论自然成立。略去过程Q.E.D.,由上可知证毕。 这个背包随着背包容量L是单峰的。 然后就可以用WQS二分,每次给一条链强行+某个值,使得最优解恰有K条链。 #include&lt;cstdio&gt;...

氧化钠的博客 476

一文说清STM32CubeMX中文汉化全流程(图解说明)

详细讲解STM32CubeMX中文汉化的完整流程,通过图文并茂的方式手把手教学,解决界面英文带来的使用障碍,让开发更高效。掌握stm32cubemx中文汉化技巧,提升嵌入式开发体验。

weixin_42499004的博客 6263

[八省联考2018]林克卡特树lct

题面在这里 description 一个\(N\)个点的\(Tree\),每条边有一个整数边权\(v_i\),表示走这条边会获得\(v_i\)的收益; 小\(L\)需要控制主角\(Link\),\(Cut\)掉树上的恰好\(K\)条边,然后再连接\(K\)条边权为$ 0\(的边,得到一棵新的树。 接着,他会选择树上的两个点\)p,q,\(并沿着树上连接这两点的简单路径从\)p\(走到\)q\(,并...

weixin_30843605的博客 147

[Dify实战] 合同审阅助手:识别风险条款、生成修改建议-带绑定资源

摘要: Dify合同审阅助手通过AI技术提升合同审阅效率,快速识别风险条款并输出结构化修改建议。方案包括合同输入、关键条款识别、风险评级和报告生成流程,重点关注付款、责任限制等核心条款。采用分层风险分级(高/中/低)和"红线清单"机制,确保审阅标准化。实施建议先建立条款库和模板,通过样本测试优化模型,定期更新规则库。该方案可缩短审阅时间50%以上,提高风险识别准确率,最终实现法务经验的可复用沉淀。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 594

高级图像增强——模拟雨天,雾,雪,阳光,阴影,运动模糊,畸变等14种效果,同步扩充标签文件

本文提供了一些高级的,特殊的图像增强方法,具体包括、光。

Limiiiing的博客 1308

[八省联考2018]林克卡特树

林克卡特树 题解 挺简单的一道题。 原题断kkk条边连kkk条边权为000的边相当于寻去k+1k+1k+1条不相交链出来,将它们连上得到的结果。 所以我们要从原树中选取k+1k+1k+1条链出来,使得它们的权值和最大。 我们发现恰好k+1k+1k+1条链这个限制是比较难限制的,考虑通过凸优化二分去进行维护。 由于链选取的条数关于贡献的函数一定是一个凸包,我们可以去二分通过选取kkk条链的点的切线的斜率,来进行判断。 我们将每条路径的贡献减去当前的二分值,再直接用二分去选取不限量的路径,使得权值最大。 若dp

StaroForgin的博客 367

Autosar Dcm配置-App到Boot的跳转及1002回复配置及实现-基于ETAS软件

在软件刷写流程中,上位机(诊断仪)发送1002后,APP检查允许跳转boot后,在特定的ram(软复位不清除)写入指定置后通过触发软件复位来跳转到boot的。在APP跳转到Bootloader时,1002的回复有两种方式,一种是APP直接回复,然后跳转,另一种是APP回复NRC78,然后跳转,在Boot中回复。本文介绍这两种方式的实现。如果是在APP中回复,可以少发一个0x78,整体跳转时间可能会少一些。但是如果诊断在收到5002之后立马请求其他的服务,可能出现boot正在初始化而未正常接收到报文。

赞的博客 1554

九省联考2018总结

前言 我作为一名ZJOI2018day1凉凉选手,为获得更多的省选体验,去上海参加了九省联考2018,当然,是属于外省选手参加的(所以实际并测的时候出现了一些问题也得不到解决),做完两天的题,深有感触,在此写一篇博客进行总结(姗姗来迟~) (另:为啥ZJOI不写博客呢,因为day2还没考,逃~) day0 从杭州出发,乘坐高铁来到上海,高铁的速度还挺快,实际上就花了一个小时就到了上海虹...

zhouyuheng2003的博客 1771

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[九省联考2018]秘密袭击coat

[九省联考2018]秘密袭击coat 研究半天题解啊。。。 全网几乎唯一的官方做法的题解:链接 别的都是暴力。。。。 要是n=3333暴力就完了。 一、问题转化 每个联通块第k大的数,直观统计的话,会枚举每个点作为第k大,看看有多少个连通块。但是这样要点分治。而且在d[x]相同的时候可能算重 所以必须以连通块来统计 考虑在连通块的最浅的点统计 但是第k大不一定是这个点 ...

weixin_30521649的博客 86

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess

「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess 学校省选模拟居然拿九省联考来考 然而我还是\(too\space young\),搞不懂什么叫最优 让二者的答案最接近可以拿到\(25\)分的好成绩 problem Solution 首先可以知道菲菲想要最大化\(ans=Ansa-Ansb\),牛牛想要最小化 那么我们可以用对抗搜索大力爆搜 可以拿到50分 #inc...

weixin_34281477的博客 200

九省联考后的高仿真高考数学模拟试题去哪里找?

解题不仅仅是为了做对一道题,更多的是为了巩固对知识的理解,积累解题经验,强化解题方法,发现解题规律,掌握解题策略,形成解题意识,培养坚忍不拔、锲而不舍的意志品质.波利亚说过

qq_41074246的博客 112

2019.02.26【九省联考2018】【BZOJ5252】【洛谷P4383】林克卡特树(DP凸优化)

BZOJ传送门 洛谷传送门 解析: 首先让我们好好分析一下题目。 连上kkk条边权为000的边。我们发现这个操作并不会产生任何贡献??? 于是问题就是最大化树上不超过k+1k+1k+1条不相交的链的边权和。 如果定义单点是退化的链,那就是恰好k+1k+1k+1条。 接下来的讨论都是建立在这个定义上的。 这个问题相信敢来写九省联考题的人都会用树形DP解决。 于是你可以拿到60pts60pts60p...

zxyoi_dreamer的博客(不定期诈尸) 282

「九省联考 2018」秘密袭击

「九省联考 2018」秘密袭击 解题思路 设 \(a_i\) 为树上联通块第 \(k\) 大大于等于 \(i\) 的个数,那么答案就是 \[ \sum _{i=1}^Wi(a_i-a_{i+1})=\sum_{i=1}^W a_i \] 设 \(dp[u][i][j]\) 表示以 \(u\) 为根的联通子树,大于等于 \(i\) 的点有 \(j\) 个的方案数,把最后一维写成生成函数的形式 \[ ...

weixin_30654419的博客 179

九省联考2018

搞学科十分舒适 一双木棋 chess 搜索,在搜索的过程中使用哈希记录重复的状态,每一次枚举合法的放置位置往下递归,取当前所有可行状态中的最优解即可。 #include<bits/stdc++.h> //This code is written by Itst using namespace std; inline int read(){ int a = 0; ...

weixin_30657541的博客 260

九省联考 2018 游记

Day0:乘火车到了上海。明天就是激动人心的比赛啦 深夜和室友看《我在七年后等你》。这真是一款不错的手游,让人印象深刻啊 Day1:迷迷糊糊到了学校。编程环境是Win7?不太习惯啊。     T1:一眼状压dp题。     T2:肯定可以建成一棵树,然后直接贪心?不对啊,T2不应该这么水啊(开始怀疑)     T3:乍一看怎么一点思路没有啊。   8:40~11:10:持续思...

aicui6749的博客 223

[九省联考2018]IIIDX

难啊啊!难难啊!

七代目鸽影 373

【九省联考】秘密袭击

刚开始看起来像树形DP,却感觉无从下手(其实正解是FFT)每个值的排名往上回溯时都会改变,后效性满满的。根本不是一次树形DP能解决的。那么,每个值对其他值的排名有什么影响呢?我们发现只有比val[i]大的值才会影响它的排名。不妨每次取一个点出来,令值大于改点的值变为1,小于改点的值变为0,问题就转化为了求一颗树上含根的总值小于K的连通块的个数了。而此时求出的个数,就是该店作为第K大点的次数了。令F...

Dusk_Of_Alchemist 601
上一篇: 2018.11.30 多项式
下一篇: Topcoder TCO R2A Div1
Timsei
博客等级 码龄10年 344粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值