首页 > 其他分享 >暑假集训CSP提高模拟20

暑假集训CSP提高模拟20

时间:2024-08-14 14:17:53浏览次数:14  
标签:20 魔力 集训 int luogu pos 200010 CSP

暑假集训CSP提高模拟20

组题人: @KafuuChinocpp

\(T1\) 191. Kanon \(0pts\)

\(T2\) P154. Summer Pockets \(0pts\)

\(T3\) 199. 空之境界 \(60pts\)

  • 原题: QOJ 1833. Deleting
  • 部分分
    • \(60pts\)
      • 区间 \(DP\) 。设 \(f_{l,r}\) 表示破坏 \([l,r]\) 单次需要输出的最小魔力值,状态转移方程为 \(f_{l,r}=\min\{\max(f_{l+1,r-1},cost_{l,r}), \max\limits_{k=l+1}^{r-1}(f_{l,k},f_{k+1,r}) \}\) 。时间复杂度为 \(O(n^{3})\) ,因只有偶区间才有用所以带 \(\frac{1}{4}\) 的常数。

      • 状态转移方程本质上是个让最大值最小的过程,考虑二分答案,仍用区间 \(DP\) 的方式通过 \(0/1\) 进行转移,拿 bitset 压一下,时间复杂度为 \(\frac{n^{3} \log n}{w}\) ,带 \(\frac{1}{4}\) 左右的常数。

        点击查看代码
        int cost[4010][4010],f[4010][4010];
        int main()
        {
        	int n,i,j,k,l,r,len;
        	scanf("%d",&n);
        	for(i=1;i<=n-1;i++)
        	{
        		for(j=i+1;j<=n;j+=2)
        		{
        			scanf("%d",&cost[i][j]);
        		}
        	}
        	for(len=2;len<=n;len+=2)
        	{
        		for(l=1,r=l+len-1;r<=n;l++,r++)
        		{
        			f[l][r]=max(f[l+1][r-1],cost[l][r]);
        			for(k=l+1;k<=r-1;k+=2)
        			{
        				f[l][r]=min(f[l][r],max(f[l][k],f[k+1][r]));
        			}
        		}
        	}
        	printf("%d\n",f[1][n]);
        	return 0;
        }
        
  • 正解

\(T4\) 128. 穗 \(80pts\)

  • 原题: luogu P4690 [Ynoi2016] 镜中的昆虫

  • 部分分

    点击查看代码
    struct node
    {
    	int pd,l,r,x;
    }d[200010];
    struct ask
    {
    	int l,r,tim,id;
    }q[200010];
    struct change
    {
    	int pos,col;
    }c[200010];
    int a[200010],b[200010],cnt[200010],pos[200010],L[200010],R[200010],ans[200010],q_cnt=0,c_cnt=0,klen,ksum;
    bool q_cmp(ask a,ask b)
    {
    	return (pos[a.l]==pos[b.l])?((pos[a.r]==pos[b.r])?(a.tim<b.tim):(a.r<b.r)):(a.l<b.l);
    }
    void add(int x,int &sum)
    {
    	cnt[x]++;
    	sum+=(cnt[x]==1);
    }
    void del(int x,int &sum)
    {
    	cnt[x]--;
    	sum-=(cnt[x]==0);
    }
    void init(int n)
    {
    	klen=pow(n,2.0/3);
    	ksum=n/klen;
    	for(int i=1;i<=ksum;i++)
    	{
    		L[i]=R[i-1]+1;
    		R[i]=R[i-1]+klen;
    	}
    	if(R[ksum]<n)
    	{
    		ksum++;
    		L[ksum]=R[ksum-1]+1;
    		R[ksum]=n;
    	}
    	for(int i=1;i<=ksum;i++)
    	{
    		for(int j=L[i];j<=R[i];j++)
    		{
    			pos[j]=i;
    		}
    	}
    }
    int main()
    {
    	int n,m,flag=1,l=1,r=0,tim=0,sum=0,i,j;
    	cin>>n>>m;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		b[0]++;
    		b[i]=a[i];
    	}
    	for(i=1;i<=m;i++)
    	{
    		cin>>d[i].pd>>d[i].l>>d[i].r;
    		if(d[i].pd==1)
    		{
    			cin>>d[i].x;
    			b[0]++;
    			b[b[0]]=d[i].x;
    			flag&=(d[i].l==d[i].r);
    		}
    	}
    	sort(b+1,b+1+b[0]);
    	b[0]=unique(b+1,b+1+b[0])-b;
    	for(i=1;i<=n;i++)
    	{
    		a[i]=lower_bound(b+1,b+1+b[0],a[i])-b;
    	}
    	for(i=1;i<=m;i++)
    	{
    		if(d[i].pd==1)
    		{
    			d[i].x=lower_bound(b+1,b+1+b[0],d[i].x)-b;
    			c_cnt++;
    			c[c_cnt].pos=d[i].l;
    			c[c_cnt].col=d[i].x;
    		}
    		else
    		{
    			q_cnt++;
    			q[q_cnt].l=d[i].l;
    			q[q_cnt].r=d[i].r;
    			q[q_cnt].id=q_cnt;
    			q[q_cnt].tim=c_cnt;
    		}
    	}
    	if(flag==0)
    	{
    		for(i=1;i<=m;i++)
    		{
    			if(d[i].pd==1)
    			{
    				for(j=d[i].l;j<=d[i].r;j++)
    				{
    					a[j]=d[i].x;
    				}
    			}
    			else
    			{
    				sum=0;
    				for(j=d[i].l;j<=d[i].r;j++)
    				{
    					cnt[a[j]]++;
    					sum+=(cnt[a[j]]==1);
    				}
    				for(j=d[i].l;j<=d[i].r;j++)
    				{
    					cnt[a[j]]--;
    				}
    				cout<<sum<<endl;
    			}
    		}
    	}
    	else
    	{
    		init(n);
    		sort(q+1,q+1+q_cnt,q_cmp);
    		for(i=1;i<=m;i++)
    		{
    			while(l>q[i].l)
    			{
    				l--;
    				add(a[l],sum);
    			}
    			while(r<q[i].r)
    			{
    				r++;
    				add(a[r],sum);
    			}
    			while(l<q[i].l)
    			{
    				del(a[l],sum);
    				l++;
    			}
    			while(r>q[i].r)
    			{
    				del(a[r],sum);
    				r--;
    			}
    			while(tim<q[i].tim)
    			{
    				tim++;
    				if(l<=c[tim].pos&&c[tim].pos<=r)
    				{
    					del(a[c[tim].pos],sum);
    					add(c[tim].col,sum);
    				}
    				swap(a[c[tim].pos],c[tim].col);
    			}
    			while(tim>q[i].tim)
    			{
    				if(l<=c[tim].pos&&c[tim].pos<=r)
    				{
    					del(a[c[tim].pos],sum);
    					add(c[tim].col,sum);
    				}
    				swap(a[c[tim].pos],c[tim].col);
    				tim--;
    			}
    			ans[q[i].id]=sum;
    		}
    		for(i=1;i<=q_cnt;i++)
    		{
    			cout<<ans[i]<<endl;
    		}
    	}
    	return 0;
    }
    

总结

  • \(T1,T2\) 赛时没读懂什么意思,手摸样例也失败了,赛后发现题读假了。
  • \(T3\) 貌似是自己第一次独立做稍微困难点的区间 \(DP\) ,感觉对区间 \(DP\) 的转移有了更深刻的认识;想出二分后感觉为一个 \(0.34\) 的常数去写二分加 bitset 优化还照样过不去就没写,然后就不会去掉 \(\log\) 了;尝试想 \(Kruskal\) 重构树发现不会建图。

后记

  • 组题人以后组题的时候能不能别整些题意不清晰的题啊。
    • \(T2\) 没解释 放完整行或整列 是指栅栏必须一整行或整列得放,而不是必须全放栅栏。
    • \(T3\) 没说单次输出的魔力值是固定的,在手摸最小化总魔力值、最小化最大魔力值、最大化最小魔力值后发现最小化最大魔力值是对的。
    • \(T4\) 一开始没有 \(m\) 的数据范围。

标签:20,魔力,集训,int,luogu,pos,200010,CSP
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18358880

相关文章

  • 代码随想录训练营day20|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450
    二叉搜索树的最近公共祖先题目根据二叉搜索树的特性,它的公共祖先肯定是值夹在p和q之间的(满足此条件的第一个点)TreeNode*getroot(TreeNode*root,TreeNode*p,TreeNode*q){ if(rooot==NULL)returnNULL; if(root->val<p->val&&root->val<q->val){ returngetroot(r......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(8)1006 cats 的最小生成树
    题目大意:给出有\(n\)个点\(m\)条边的图,接下来进行若干次操作,每次操作取出当前图的最小生成树,然后删去这些构成最小生成树的边,知道该图不连通,输出每条边在第几次操作时被删除思路:由于构成最小生成树的边数是\(n-1\)条边,所以最多操作次数为\(\lfloor\frac{m}{n-1}\rfloor\),每次......
  • IntelliJ IDEA【最新】2024终极版 下载安装教程,图文步骤详解
    文章目录软件介绍软件下载安装步骤ActivationMethod专栏推荐:超多精品软件(持续更新中…)软件介绍IntelliJIDEA是一款由JetBrains公司开发的集成开发环境(IDE),专为软件开发人员设计,尤其在Java编程领域享有极高的声誉,被认为是市场上最好的JavaIDE之一。以下是对In......
  • Cisco Secure Firewall 4200 Series FTD Software 7.4.2 & ASA Software 9.20.3 发布
    CiscoSecureFirewall4200SeriesFTDSoftware7.4.2&ASASoftware9.20.3发布下载-思科防火墙系统软件FirepowerThreatDefense(FTD)Software请访问原文链接:https://sysin.org/blog/cisco-firepower-4200/,查看最新版。原创作品,转载请保留出处。为什么选择CiscoSe......
  • Cisco Secure Firewall 3100 Series FTD Software 7.4.2 & ASA Software 9.20.3 发布
    CiscoSecureFirewall3100SeriesFTDSoftware7.4.2&ASASoftware9.20.3发布下载-思科防火墙系统软件FirepowerThreatDefense(FTD)Software请访问原文链接:CiscoSecureFirewall3100SeriesFTDSoftware7.4.2&ASASoftware9.20.3,查看最新版。原创作品,转载请......
  • Cisco Firepower 9300 Series FTD Software 7.4.2 & ASA Software 9.20.3 发布下载 -
    CiscoFirepower9300SeriesFTDSoftware7.4.2&ASASoftware9.20.3发布下载-思科防火墙系统软件FirepowerThreatDefense(FTD)Software请访问原文链接:https://sysin.org/blog/cisco-firepower-9300/,查看最新版。原创作品,转载请保留出处。为什么选择CiscoSecure......
  • 2024年8月中国数据库排行榜:OceanBase攀升再夺冠,达梦跃入三甲关
    在这个炽热的季节,随着巴黎奥运会的盛大开幕,全球将目光聚集在了体育的无限魅力和竞技的巅峰对决上。如同奥运赛场上的激烈角逐,中国数据库界也上演着一场技术与创新的较量,各个数据库产品正在中国乃至全球舞台上展示着它们的实力和潜力。现在让我们共同盘点本月墨天轮社区中国数据库......
  • 8.14信息学集训_树、搜索与剪枝
    目录P1305新二叉树B3642二叉树的遍历P4913【深基16.例3】二叉树深度P3884[JLOI2009]二叉树问题P8681[蓝桥杯2019省AB]完全二叉树的权值P1434[SHOI2002]滑雪P1040[NOIP2003提高组]加分二叉树P1074[NOIP2009提高组]靶形数独P2827[NOIP2016提高组]蚯蚓T266208......
  • 20 道 React 最新面试题及详细答案
    20道React最新面试题及详细答案**1:谈谈React中的受控组件和非受控组件的区别,并举例说明。****2:解释React中的ContextAPI以及它的优缺点。****3:React中如何实现代码分割(CodeSplitting)?****4:描述React中的错误边界(ErrorBoundaries)以及如何使用?****5:解释......
  • 2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始
    2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始。初始时,nums中所有下标均未标记。从第1秒到第m秒,每秒可以选择以下四种操作之一:1.选择范围[1,n]中一个下标i,将nums[i]减少1。2.将nums[changeIndices[s]]设为任意非负整数。3.选择范围......