首页 > 其他分享 >CF1129D Isolation

CF1129D Isolation

时间:2023-09-13 09:12:33浏览次数:40  
标签:ch const int CF1129D void pos Isolation id

考虑 dp,令 \(f_i\) 为 \([1,i]\) 这个前缀的分段方案数。\(i\) 从小到大扫描线,动态维护 \(c_j\) 表示 \([j+1,i]\) 中只出现恰好一次的数的个数:

\[f_i=\sum\limits_{c_j\le k}f_j \]

考虑如何维护 \(c_j\),扫描线过程中维护 \(l_i\) 表示 \(a_i\) 上次出现的位置。那么 \(i-1\to i\) 相当于给 \([l_{l_i},l_i)\) 区间 \(-1\),\([l_i,i)\) 区间 \(+1\)。

所以问题转化为:

  • 单点修改 \(f_i\)。
  • 区间修改 \(c_i\)。
  • 区间(前缀)查询 \(c_i\le k\) 的 \(f_i\) 总和。

分块即可。复杂度 \(O(n\sqrt n)\),可以做到线性空间但没必要。

不知道有没有 \(O(n\ \text{poly}(\log n))\) 做法。

// Problem: Isolation
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF1129D
// Memory Limit: 250 MB
// Time Limit: 3000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

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

namespace vbzIO {
    char ibuf[(1 << 20) + 1], *iS, *iT;
    #if ONLINE_JUDGE
    #define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20) + 1, stdin), (iS == iT ? EOF : *iS++) : *iS++)
    #else
    #define gh() getchar()
    #endif
    #define mt make_tuple
    #define mp make_pair
    #define fi first
    #define se second
    #define pc putchar
    #define pb emplace_back
    #define ins insert
    #define era erase
    typedef tuple<int, int, int> tu3;
    typedef pair<int, int> pi;
    inline int rd() {
        char ch = gh();
        int x = 0;
        bool t = 0;
        while (ch < '0' || ch > '9') t |= ch == '-', ch = gh();
        while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gh();
        return t ? ~(x - 1) : x;
    }
    inline void wr(int x) {
        if (x < 0) x = ~(x - 1), putchar('-');
        if (x > 9) wr(x / 10);
        putchar(x % 10 + '0');
    }
}
using namespace vbzIO;

const int P = 998244353;
const int N = 1e5 + 100;
const int B = 330;

int n, k, a[N], f[N], lst[N], pre[N];
int b, lp[B], rp[B], pos[N], s[B], c[B][N], vl[N], t[B];

void clr(int id) {
	s[id] = 0;
	for (int i = lp[id]; i <= rp[id]; i++) c[id][vl[i]] = 0;
}

void reb(int id) {
	for (int i = lp[id]; i <= rp[id]; i++) 
		vl[i] += t[id], (c[id][vl[i]] += f[i]) %= P, (s[id] += (vl[i] <= k) ? f[i] : 0) %= P;
	t[id] = 0;
}

void add(int id) {
	if (k >= t[id]) (s[id] += P - c[id][k - t[id]]) %= P;
	t[id]++;
}

void del(int id) {
	t[id]--;
	if (k >= t[id]) (s[id] += c[id][k - t[id]]) %= P;
}

void upd(int l, int r, int op) {
	if (l > r) return;
	if (pos[l] == pos[r]) {
		clr(pos[l]); for (int i = l; i <= r; i++) vl[i] += op;
		return reb(pos[l]);
	}
	clr(pos[l]); for (int i = l; i <= rp[pos[l]]; i++) vl[i] += op; reb(pos[l]);
	clr(pos[r]); for (int i = lp[pos[r]]; i <= r; i++) vl[i] += op; reb(pos[r]);
	for (int i = pos[l] + 1; i <= pos[r] - 1; i++) 
		if (~op) add(i); else del(i);
}

int main() {
	n = rd(), k = rd(), b = sqrt(n);
    for (int i = 1; i <= n; i++) a[i] = rd();
    for (int i = 1; i <= b; i++)
    	lp[i] = (i - 1) * b + 1, rp[i] = i * b;
    if (rp[b] < n) b++, lp[b] = rp[b - 1] + 1, rp[b] = n;
    for (int i = 1; i <= b; i++)
    	for (int j = lp[i]; j <= rp[i]; j++)
    		pos[j] = i;
	for (int i = 1, ct = 0; i <= n; i++) {
		lst[i] = pre[a[i]], pre[a[i]] = i;
		if (!lst[lst[i]]) ct -= (lst[i] != 0); upd(max(1, lst[lst[i]]), lst[i] - 1, -1);
		if (!lst[i]) ct++; upd(max(1, lst[i]), i - 1, 1);
		for (int j = 1; j <= b; j++) (f[i] += s[j]) %= P;
		if (ct <= k) f[i] = (f[i] + 1) % P;
		clr(pos[i]), reb(pos[i]);
	}
	wr(f[n]);
    return 0;
}

标签:ch,const,int,CF1129D,void,pos,Isolation,id
From: https://www.cnblogs.com/Ender32k/p/17698558.html

相关文章

  • SQL 标准历史(比如 isolation in SQL-92)
      https://learnsql.com/blog/history-of-sql-standards/ HastheSQLstandardchangedinthe30+yearsit'sbeenaround?Absolutely!LearnaboutthejourneyfromSQL-86tomodernSQL,today’sstandarddatalanguage.SQLwas createdintheearly1970s......
  • MIT 6.S081 Isolation & System call entry/exit
    Trap机制程序运行往往需要完成用户空间和内核空间的切换,每当:程序执行系统调用(systemcall);程序出现了pagefault等错误;一个设备触发了中断;都会发生这样的切换。这里用户空间切换到内核空间通常被称为trap,因此有时候我们会说程序“陷入”到内核态。trap机制需要尽可能......
  • Deep Isolation Forest for Anomaly Detection
    DeepIsolationForestforAnomalyDetection1INTRODUCTIONIForest的缺点它的与坐标轴平行的隔离方法会导致它在高维/非线性空间中难以检测到异常。如图1所示。红色为异常节点,蓝色为正常节点。红色被蓝色所包围,这种情况无法被直接用平行于x或者平行于y的分割方法隔离......
  • 【atcoder begin 302】【e题 Isolation 】JAVA的快速输入输出
    importjava.io.*;importjava.util.HashSet;importjava.util.Set;/***@authorfishcanfly*/publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{//BufferedReaderbr=newBufferedReader(newInputStreamReader(......
  • Dynamic 导入插件解决方案包,提示: Assembly must be registered in isolation 错误
    错误信息如下:<s:Envelopexmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Fault><faultcode>s:Client</faultcode><faultstringxml:lang="zh-CN">Actionfailedforassembly'AccountManage,V......
  • 「解题报告」CF1129D Isolation
    水题,但是调了好久qwq显然是DP,出现次数显然分块,那就数据结构优化DP呗。我们可以维护出当前点到每个点这段区间内有多少个出现次数为\(1\)的数,这个右端点每拓展一位修改的左端点一定是连续的区间。分块维护这个东西,如果是散块暴力重构暴力加,如果是整块那给整块打个加标记。......
  • Sql Isolation Level
    隔离性(Isolation):与数据库中的事务隔离级别以及锁相关,多个用户可以对同一数据并发访问而又不破坏数据的正确性和完整性。但是并行事务的修改必须与其他并行事务的修改相互独立,隔离。但是在不同的隔离级别下,事务的读取操作可能得到的结果是不同的。隔离级别用于决定如何控制并......
  • SQL Server – Transaction & Isolation 事务与隔离
    前言上回在谈到 Concurrency并发控制 时,有提到过事务的概念.这篇就补上它具体的实现.以前写过相关的文章:sqlserver学习笔记(nestedtransaction嵌套事务)As......
  • Isolation forest阅读笔记
    IForest所基于的假设异常是由较少实例组成的少数派它们拥有与正常实例差别较大的属性换句话说,异常是少而不同的(fewanddifferent),这使得它们比正常的点更容易被孤立......
  • Angular样式隔离(style isolation)及选择器(:host, :host-context, ::ng-deep)的使用
    1.Angular样式隔离Angular样式隔离的好处最最要的一条就是CSS的可维护性。当没有样式隔离时,我们创建一个组件并添加样式后,可能会影响到其他的组件样式,而且很有可能查找不......