CSP模拟58联测20 回忆旅途的过往

这篇具有很好参考价值的文章主要介绍了CSP模拟58联测20 回忆旅途的过往。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目大意

n n n个砝码,每个砝码的初始重量为 a i a_i ai。有 q q q次操作,每次操作分为以下两种类型:

  • 1 l r x:表示将 l l l r r r之间的所有 a i a_i ai都变成 x x x
  • 2 l r x:查询 l l l r r r之间的所有砝码,每个砝码可以用无限次,求是否能称出质量 x x x

a i a_i ai和所有 x x x都小于等于 m m m

保证 a i a_i ai和所有操作一的 x x x总共最多不超过 10 10 10种数。

注意砝码只能放在同一侧。

1 ≤ n , q ≤ 1 0 6 , 1 ≤ m ≤ 1 0 5 1\leq n,q\leq 10^6,1\leq m\leq 10^5 1n,q106,1m105

时间限制 2500 m s 2500ms 2500ms,空间限制 256 M B 256MB 256MB


题解

设砝码质量的种数为 v v v,依照题意, v ≤ 10 v\leq 10 v10。我们对于每种数取或者不取,总共有 2 v 2^v 2v种情况。对每种情况做一次背包,每种情况可以在之前的基础上再加一个砝码的贡献而得出,所以这部分的时间复杂度为 O ( m 2 v ) O(m2^v) O(m2v)

然后,用线段树维护每一段有哪几种数。因为数的种数只有不超过 10 10 10种,所以可以将每一段有的数进行状态压缩。那么操作一就是区间修改,操作二就是在查询对应区间中有的数的状态,并将状态在背包中查询是否可以达到即可。这部分的时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

这样做的话,空间复杂度是 O ( m 2 v + n ) O(m2^v+n) O(m2v+n)的,数组开不下,所以背包要用 b i t s e t bitset bitset来存。

总时间复杂度为 O ( m 2 v + n log ⁡ n ) O(m2^v+n\log n) O(m2v+nlogn),空间复杂度为 O ( m 2 v 64 + n ) O(\dfrac{m2^v}{64}+n) O(64m2v+n)文章来源地址https://www.toymoban.com/news/detail-723594.html

code

#include<bits/stdc++.h>
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int N=1000000,M=100000;
int n,m,q,v1=0,a[N+5],z[M+5],v[15],ct[1<<10],tr[4*N+5],ly[4*N+5];
bitset<M+5>f[1505];
struct node{
	int tp,l,r,x;
}w[N+5];
int lb(int i){
	return i&(-i);
}
void build(int k,int l,int r){
	if(l==r){
		tr[k]=1<<z[a[l]]-1;
		return;
	}
	int mid=l+r>>1;
	build(lc,l,mid);build(rc,mid+1,r);
	tr[k]=tr[lc]|tr[rc];
}
void down(int k){
	tr[lc]=tr[rc]=ly[lc]=ly[rc]=ly[k];
	ly[k]=0;
}
void ch(int k,int l,int r,int x,int y,int v){
	if(l>=x&&r<=y){
		tr[k]=ly[k]=1<<v-1;
		return;
	}
	if(ly[k]) down(k);
	int mid=l+r>>1;
	if(x<=mid) ch(lc,l,mid,x,y,v);
	if(y>mid) ch(rc,mid+1,r,x,y,v);
	tr[k]=tr[lc]|tr[rc];
}
int find(int k,int l,int r,int x,int y){
	if(l>=x&&r<=y) return tr[k];
	if(ly[k]) down(k);
	int mid=(l+r)>>1,re=0;
	if(x<=mid) re|=find(lc,l,mid,x,y);
	if(y>mid) re|=find(rc,mid+1,r,x,y);
	return re;
}
int main()
{
	scanf("%d%d%d",&n,&m,&q);
	for(int i=0;i<=10;i++) ct[1<<i]=i;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(!z[a[i]]){
			z[a[i]]=++v1;v[v1]=a[i];
		}
	}
	for(int i=1;i<=q;i++){
		scanf("%d%d%d%d",&w[i].tp,&w[i].l,&w[i].r,&w[i].x);
		if(w[i].tp==1&&!z[w[i].x]){
			z[w[i].x]=++v1;v[v1]=w[i].x;
		}
	}
	f[0][0]=1;
	for(int s=1;s<1<<v1;s++){
		int t=lb(s),w=ct[t]+1;
		f[s]=f[s^t];
		for(int i=v[w];i<=m;i++){
			f[s][i]=f[s][i]|f[s][i-v[w]];
		}
	}
	build(1,1,n);
	for(int i=1;i<=q;i++){
		if(w[i].tp==1) ch(1,1,n,w[i].l,w[i].r,z[w[i].x]);
		else{
			int tmp=find(1,1,n,w[i].l,w[i].r);
			if(f[tmp][w[i].x]) printf("Yes\n");
			else printf("No\n");
		}
	}
	return 0;
}

到了这里,关于CSP模拟58联测20 回忆旅途的过往的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023CSP-J题解

    烦死了,这次CSP考的真的垃圾,犯了好多低级错误。 小 Y 的桌子上放着 n n n 个苹果从左到右排成一列,编号为从 1 1 1 到 n n n 。 小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果。 每天在拿的时候,小苞都是从左侧第 1 1 1 个苹果开始、每隔 2 2 2 个苹果拿走 1 1 1 个苹果。

    2024年02月08日
    浏览(53)
  • 2020 CSP - J初赛 题解

    快要CSP了,最近疯狂刷题中… 终于 抽出时间 乘爸妈不在 写了一篇题解 如需做题,请到以下网站自行练习。 本博客只提供讲解。 洛谷有题 初赛真题 - 信奥赛题库 题号 1~5: A A D C C 6~10: B A A A A 11~15: A D C A A 16~20: 对 错 对 错 A 21~25: D 错 错 对 D 26~30: B D 错 对 错 31~35:

    2024年02月11日
    浏览(41)
  • 2022 CSP-J 复赛题解

    【题目描述】 小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a 和 b ,求 a b 的值是多少。 a b 即 b 个 a 相乘的值,例如 23 即为 3 个 2 相乘,结果为 2 × 2 × 2 = 8。 “简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误。 小文

    2024年02月07日
    浏览(62)
  • 2022CSP-J2题解

    今天(2022,10,29), C S P − J S CSP-JS C S P − J S 第二轮成功举办, 虽然大部分省市疫情取消 本蒟蒻今天有幸参加CSP,特发入门组题解 小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a a a 和 b b b ,求 a b a^b a b 的值是多少。 a b a^b a b 即 b b b 个 a a a 相乘

    2023年04月08日
    浏览(79)
  • 2022CSP-J 题解[完整版]

    “西西弗”的脑子是被宇宙射线影响了吗,造的题目我都写到睡着了…… 题目描述 小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a a a 和 b b b ,求 a b a^b a b 的值是多少。 a b a^b a b 即 b b b 个 a a a 相乘的值,例如 2 3 2^3 2 3 即为 3 3 3 个 2 2 2 相乘,

    2024年02月10日
    浏览(67)
  • 【ccf-csp题解】第四次csp认证-第四题-网络延时-树的直径

    本题所求的实际上是树的直径,即树中的任意两个结点之间的最大距离 采用的方法是dfs 从根节点开始遍历,对于每一个被dfs的结点m,返回此结点m到所有叶子结点的距离最大的那个即d1,同时在dfs过程当中记录结点m到所有叶子结点的距离第二大的那个,即d2 那么最终答案就是

    2024年02月09日
    浏览(39)
  • CSP认证202303-3:LDAP (超详细题解)

    题目传送门 最后要求输出符合条件的用户 DN 的集合, ( 作为一名STL战士 ) ,可以考虑维护以属性名和属性值为索引, 对应值为符合条件的用户的set 的一个map 属性名 - 属性值 - {用户1,用户2…} 操作分为原子操作和逻辑操作, 只需要判断字符串的首字符即可区分两种操作 原子操作

    2024年02月05日
    浏览(43)
  • 【C++题解】[CSP-J2020]优秀的拆分

    P a r t Part P a r t 1 1 1 读题 题目描述 一般来说,一个正整数可以拆分成若干个正整数的和。 例如: 1 = 1 1=1 1 = 1 , 10 = 1 + 2 + 3 + 4 10=1+2+3+4 10 = 1 + 2 + 3 + 4 等。对于正整数 n n n 的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆分下, n n n 被分解为了若干个不同的 2

    2024年02月06日
    浏览(43)
  • CCF-CSP认证 202303 500分题解

    202303-1 田地丈量(矩形面积交) 矩形面积交=x轴线段交长度*y轴线段交长度 线段交长度,相交的时候是min右端点-max左端点,不相交的时候是0 202303-2 垦田计划(二分) 二分最终答案x(x=k),判断降到x天资源是否够 够的话就往小里二分,否则往大里二分, 当然贪心也可以做

    2023年04月18日
    浏览(47)
  • CCF CSP认证最新2022-12题解c++(全网首发)

    第一次写题解,代码没带注释,请谅解,尽力在题目分析中说明白. http://118.190.20.162/view.page?gpid=T160 问题描述 输入格式 输出格式 输出到标准输出中。 输出一个实数,表示该项目在当前价值标准下的总盈利或亏损。 题目分析 按照题意将除第一年外的每年x元都转换为当前的实际价

    2024年02月13日
    浏览(195)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包