首页 > 其他分享 >2022/10/24 考试

2022/10/24 考试

时间:2022-10-24 20:25:55浏览次数:61  
标签:24 10 node Sta int void 2022 fi tmp

又爆了/kk 虽然 T2 考试时没有做出来,但是因为这纯粹是我脑瘫,就不写了。

比赛链接

T3

Desciption

给出 \(n\) 个集合,有 \(m\) 次操作,如下:

  • 给出 \(l,r,c\),往 \([l,r]\) 这个区间的集合加入 \(c\) 这个元素。

  • 给出 \(l,r\),查询 \([l,r]\) 集合的并的不同颜色个数。

\(n,m\le 10^5\)

Solution

其实似乎也不是太难,也不知道为什么也想不出来。/kk

我们考虑维护一种颜色的每个极长未出现段,那么一次查询的答案就是不同颜色个数减去完全包含它的未出现极长段的个数。

那么我们可以考虑用 set 去维护这个极长未出现段,然后用 cdq 或者 KD-tree 之类的实现二维查值就好了。

复杂度 \(\Theta(n\log^2 n)\)。

Code



#include <bits/stdc++.h>
using namespace std;
     
#define Int register int
#define MAXN 100005
     
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
template <typename T> inline void chkmax (T &a,T b){a = max (a,b);}
template <typename T> inline void chkmin (T &a,T b){a = min (a,b);}

int n,m;
struct node{
	int l,r,c;
	bool operator < (const node &p)const{return l < p.l;}
};
vector <node> seq;

#define pii pair<int,int>
#define se second
#define fi first

struct BIT{
	int sum[MAXN];
	int lowbit (int x){return x & (-x);}
	void modify (int x,int v){for (Int i = x;i <= n;i += lowbit (i)) sum[i] += v;}
	int query (int x){int res = 0;for (Int i = x;i;i -= lowbit (i)) res += sum[i];return res;}
	void backit (int x){for (Int i = x;i <= n;i += lowbit (i)) sum[i] = 0;}
}tree;

int ans[MAXN];
struct ODT{
	set <pii> Sta;
	void split (int x){
		auto it = Sta.lower_bound ({x,x});
		if ((it == Sta.end() && it -> fi == x) || it == Sta.begin() || (-- it) -> se < x) return ;
		pii tmp = *it;
		seq.push_back (node{tmp.fi,tmp.se,1}),seq.push_back (node{tmp.fi,x - 1,-1}),seq.push_back (node{x,tmp.se,-1});
		Sta.erase (it),Sta.insert ({tmp.fi,x - 1}),Sta.insert ({x,tmp.se});
	}
	void coverit (int l,int r){
		split (l),split (r + 1);
		auto beg = Sta.lower_bound ({l,l}),lst = Sta.lower_bound ({r + 1,r + 1}),now = beg;
		while (now != lst) seq.push_back (node{now -> fi,now -> se,1}),++ now;
		Sta.erase (beg,lst);
	}
}T[MAXN];

void solve (int l,int r){
	if (l == r) return ;
	int mid = l + r >> 1;
	solve (l,mid),solve (mid + 1,r);
	for (Int i = l,j = mid + 1;j <= r;++ j){
		while (j <= r && seq[j].c <= 1) ++ j;
		if (j > r) break;
		while (i <= mid && seq[i].l <= seq[j].l){
			if (seq[i].c <= 1) tree.modify (n - seq[i].r + 1,seq[i].c);
			++ i;
		}
		ans[seq[j].c - 1] += tree.query (n - seq[j].r + 1);
	}
	for (Int i = l;i <= mid;++ i) if (seq[i].c <= 1) tree.backit (n - seq[i].r + 1);
	inplace_merge (seq.begin() + l,seq.begin() + mid + 1,seq.begin() + r + 1);
}

int cnt,opt[MAXN],ql[MAXN],qr[MAXN],val[MAXN],b[MAXN];

signed main(){
	freopen ("cover.in","r",stdin);
	freopen ("cover.out","w",stdout);
	read (n,m);
	for (Int i = 1;i <= m;++ i){
		read (opt[i],ql[i],qr[i]);
		if (opt[i] == 1) read (val[i]),b[++ cnt] = val[i];
	}
	sort (b + 1,b + cnt + 1),cnt = unique (b + 1,b + cnt + 1) - b - 1;
	for (Int i = 1;i <= m;++ i) if (opt[i] == 1) val[i] = lower_bound (b + 1,b + cnt + 1,val[i]) - b;
	seq.push_back (node{1,n,-cnt});
	for (Int i = 1;i <= cnt;++ i) T[i].Sta.insert ({1,n});
	for (Int i = 1;i <= m;++ i){
		if (opt[i] == 2) seq.push_back (node{ql[i],qr[i],i + 1});
		else T[val[i]].coverit (ql[i],qr[i]);
	}
	solve (0,seq.size() - 1);
	for (Int i = 1;i <= m;++ i) if (opt[i] == 2) write (ans[i] + cnt),putchar ('\n');
   	return 0;
}

标签:24,10,node,Sta,int,void,2022,fi,tmp
From: https://www.cnblogs.com/Dark-Romance/p/16822647.html

相关文章

  • 10.24解题报告
    T1用时:约\(100\)min这个题用的时间最多,主要原因还是想多了,应该注意多观察一下题目性质:题目要求求出这个式子的正整数解个数:\(\frac{a}{x}+\frac{b}{c}=\frac{d}{y}\)......
  • 2022-2023-1 20221318 《计算机基础和程序设计》第九周学习总结
    作业信息这个作业属于那个班级https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP作业要求https://www.cnblogs.com/rocedu/p/9577842.html#WEEK09作业目标学习......
  • 【2022-10-24】前端Vue框架(一)
    前端发展介绍1.HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面->给后端(PHP、Python、Go、Java)->后端嵌入模板语法->后端渲染完数据->返回数据给前端-......
  • [20221020]奇怪的增量备份.txt
    [20221020]奇怪的增量备份.txt--//生产系统做增量备份遇到的怪异问题,给奇葩的运维人员狠狠地涮了一把,做一个记录:1.环境:[email protected]:1521/orcl>@pr==========......
  • 2022/10/24 总结
    写在最前面今天考试首先是时间安排不很合理。花了相对较多的时间来推T2,以至于没有时间检查其他题的暴力。以后考试如果有时间就把想到的思路尽量都写一下(比如今日T1,思......
  • 2022-2023-1 20221318 《计算机基础和程序设计》第八周学习总结
    作业信息这个作业属于那个班级https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP作业要求https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08作业目标学习......
  • DevOps|1024程序员节怎么做?介绍下我的思路
    1024,祝每个程序员小哥哥小姐姐节日快乐。因为在研发效能部门,我支持过几次1024程序员节的活动,所以经常有朋友问我1024程序员节怎么做,本篇就是简单介绍下我的思路,希望对......
  • 2022.10.24每日一题
    路径计数题目描述有一个\(n×n\)的网格,有些格子是可以通行的,有些格子是障碍。一开始你在左上角的位置,你可以每一步往下或者往右走,问有多少种走到右下角的方案。由于......
  • BZOJ 4810([Ynoi2017]由乃的玉米田-莫队)
    Description由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美。这排玉米一共有N株,它们的高度参差不齐。由乃认为玉米田不美,所以她决定出个数据结构题这个题是这......
  • 学会这10种定时任务
    一.linux自带的定时任务crontab不知道你有没有遇到过这种场景:有时需要临时统计线上的数据,然后导出到excel表格中。这种需求有时较为复杂,光靠写sql语句是无法满足需求的,......