首页 > 编程语言 >2023广东省程序设计大赛F题

2023广东省程序设计大赛F题

时间:2023-05-31 17:34:44浏览次数:46  
标签:tmp nxt colTree int ll 大赛 端点 2023 程序设计

思路:我们把先把所有状态和值用线段树或树状数组记录下来(因为他是连续的区间,相当于一段区间的不同状态的和)再通过二分或者倍增找出这段区间及找出左右端点

1:线段树或者着树状数组维护的有两个,一个是前缀和(不管状态),一个是颜色和就是状态

2:左右端点查找:
一个点对应一个颜色,我们假设从x点查找
左端点查找:从x向左查,如果从1到x有刚好x个点则左端点是0;没有的话再找如果大于x则直接跳过(因为我们查的是左端点),其次如果当前查询的点nxt与x距离(x-nxt)= sum - (tmp+cnt)则跳过(sum是从1到x有多少个满足颜色的点,tmp是在nxt这个点上是否满足的,cnt是之前满足的点个数)这个代码的意思是在nxt~x区间都满足

右端点同理

树状数组代码

点击查看代码
#include <bits/stdc++.h>
const int MAXN = 3e5;
using namespace std;
typedef long long ll;

ll C[MAXN + 10], V[MAXN + 10];

unordered_map<int,int> colTree[MAXN + 10];
ll smTree[MAXN + 10];
ll n,m;
//记录颜色
void add(int x,int y,int z)
{
	for(int i = x;i <= n;i += (i&-i))
	{
		colTree[i][y] += z;
	}
}
//记录值
void addv(int x,int y)
{
	for(int i = x;i <= n;i += (i&-i))
	smTree[i] += y;
}
//计算值
ll query(int x)
{
	ll ans = 0;
	for(int i = x;i;i -= (i&-i))
	ans += smTree[i];
	return ans;
}
//算出从1~x有多少个满足的点
ll checksum(int x,set<int>q)
{
	ll num = 0;
	for(int i = x;i;i -= (i&-i))
	{
		for(auto c:q)
		if(colTree[i][c]!=0)
		num += colTree[i][c];
	}
	return num;
}
//算出左端点
ll checkL(int x,set<int>q)
{
	ll sum = checksum(x,q);
	if(sum == x)
	return 0;
	int u = 0;
	//倍增
	for(u = 1;u <= n;u <<= 1) ;
	ll now = 0,cnt = 0;
	//nxt = now|u表示下标,例如now = 4,u = 2则nxt表示6
	//因为now一旦改变则当前nxt~x这个区间表示都满足条件
	//思想类似倍增
	for(u >>= 1;u;u >>=1)
	{
		int nxt = now|u,tmp = 0;
		for(auto c:q)
		{
			if(colTree[nxt][c]!=0)
			tmp += colTree[nxt][c];
		}
		if(nxt > x||x - nxt == sum - tmp-cnt)
		continue;
		else
		{
			cnt += tmp;
			now = nxt;
		}
	}
	return now + 1;
}
//算出右端点
ll checkR(int x,set<int>q)
{
	ll sum = checksum(x,q);
	int u;
	for(u = 1;u <= n;u <<= 1) ;
	ll now = 0,cnt = 0;
	for(u >>= 1;u;u >>=1)
	{
		int nxt = now|u,tmp = 0;
		for(auto c:q)
		{
			if(colTree[nxt][c]!=0)
			tmp += colTree[nxt][c];
		}
		if(nxt < x||nxt - x == tmp+cnt-sum)
		{
			cnt += tmp;
			now = nxt;
		}
	}
	return now;
}
void solve()
{
	cin >> n >> m;
	for(int i = 1;i <= n;i ++)
	{
		cin >> C[i];
		add(i,C[i],1);
	}
	for(int i = 1;i <= n;i ++)
	{
		cin >> V[i];
		addv(i,V[i]);
	}
	while(m--)
	{
		ll op,x,y;
		cin >> op >> x >> y;
		if(op == 1)
		{
			add(x,C[x],-1);
			add(x,y,1);
			C[x] = y;
		}
		else if(op == 2)
		{
			addv(x,y - V[x]);
			V[x] = y;	
		}
		else
		{
			set<int>q;
			bool f = false;
			for(int  i = 1;i <= y;i ++)
			{
				int w;
				cin >> w;
				q.insert(w);
				if(C[x] == w)
				f = true;
			}
			if(!f)
			{
				cout << 0 << '\n';
				continue;
			}
			ll L = checkL(x,q);
			ll R = checkR(x,q);
			cout << query(R)-query(L) << '\n';
		}
	}
	for (int i = 1; i <= n; i++) colTree[i].clear();
    for (int i = 1; i <= n; i++) smTree[i] = 0;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	ll t;
	cin >> t;
	while(t--)
	solve();
}

标签:tmp,nxt,colTree,int,ll,大赛,端点,2023,程序设计
From: https://www.cnblogs.com/ljm-xiada/p/17446827.html

相关文章

  • pkusc2023 d1t3
    整自闭了,快一个月后才想出来怎么做。设点\(i\)是1的概率为\(p_i\),定义\(P_i(x)=1-p_i+p_ix\)。那么\(p_i\)是\(i\)的儿子节点和自己的\(P(x)\)卷起来后取后一半的系数和。树上修改很魔怔,考虑ddp。维护每个点轻儿子和自己的\(\prodP(x)\),记为\(S_i(x)\),设一共有......
  • 【2023 · CANN训练营第一季】——搭建环境:创建ECS,下载sample仓
    前言:        本文是环境搭建的第一篇笔记。主要包括下面两方面内容:    1、在华为云上创建ECS服务器,并修改Ubuntu源和pip源为国内镜像地址。        2、为了更好的使用ECS,需要在本地安装远程连接和查看代码的工具软件,以Windows为例介绍几个常用的工具软件。......
  • CVE-2023-33246学习
    1.参考学习CVE-2023-33246https://github.com/I5N0rth/CVE-2023-332462.本地搭建环境2.1下载镜像#dockerpullapache/rocketmq:4.9.1#dockerpullapacherocketmq/rocketmq-console:2.0.02.2启动broker、namesrv、console启动namesrvdockerrun-dit-p9876:987......
  • 西门康IGBT模块存在sql注入 QTVA-2023-3632489
    网址:http://www.gl-igbt.com/product.php?id=6 漏洞描述: 西门康igbt模块,采购平台,便捷购买,专业代理,售后无忧,大量现货供应,模块齐全,可直接供货,一键下单,整流桥功率,西门康一站式采购平台,可长期稳定供货 西门康IGBT模块存在sql注入漏洞,攻击者可利用该漏洞获取数据库......
  • 2023ccpc大学生程序设计竞赛-zzh
    比赛开始没有开到签到题,看了一会别的题才开始跟榜。A题我写的,不过没有考虑到S长度为1的情况,wa了一次。然后lhy和zx把F题做了出来。接着他俩去看H,我去看B。他俩把H过了,B我想出了一个n*根n的做法,T了。lhy感觉E是DP,去看E,我和zx去看K。lhy把E过了,我俩K还没思路。接着他俩看B,想了快......
  • C/C++数据结构课程设计[2023-05-31]
    C/C++数据结构课程设计[2023-05-31]数据结构课程设计实验(训)指导书所在学院:计算机科学与工程学院编写说明一.实验总体目标《数据结构》是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。本实验的目标是,学生能正确理解和熟练掌握常用数据结构和算......
  • April 2023-Memory-efficient Reinforcement Learning with Value-based Knowledge Co
    摘要:人工神经网络在一般函数逼近方面很有希望,但由于灾难性遗忘,在非独立或非同分布的数据上训练具有挑战性。经验回放缓冲区(experiencereplaybuffer)是深度强化学习中的一个标准组件,通过将经验存储在一个大的缓冲区中并用于以后的训练,通常用于减少遗忘和提高样本效率。然而,较大......
  • The 2023 Guangdong Provincial Collegiate Programming Contest
    A-算法竞赛#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){intst,n,ed;cin>>st>>n;map<int,int>cnt;for(inti=1,x;i<=n;i++){cin>>x;......
  • P9370 APIO2023 赛博乐园 / cyberland
    P9370APIO2023赛博乐园/cyberland。题目就是让我们求一个有各种优惠政策的单源点\(0\),单汇点\(H\)的最短路。优惠政策是:到达能力为\(2\)的点,可以让之前走过的距离除以\(2\)。到达能力为\(0\)的点,可以让之前走过的距离直接变成\(0\)。有限制:不能经过\(H\)多次......
  • 【2023 · CANN训练营第一季】——Ascend C算子沙箱实验
    前言:CANN训练营的Ascend C算子课程,以在线课程的方式提供了一个沙箱实验环境。这将有助于帮助开发者了解Ascend C算子开发的软、硬件环境;熟悉自定义AscendC算子的开发流程和关键代码;同时也可以了解到自定义算子包的部署路径及部署后的各类文件。在线试验地址:在线实验>基于昇腾CA......