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

暑假集训CSP提高模拟2

时间:2024-07-19 20:31:33浏览次数:12  
标签:暑假 DIJ int 合并 集训 建图 空缺 CSP DP

A.活动投票

主元素问题,用摩尔投票

#include<bits/stdc++.h>
using namespace std;
int n,a=-1,acnt,x;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&x);
		if(acnt==0){
			a=x;
			acnt++;
		}
		else if(a==x){
			acnt++;
		}
		else{
			acnt--;
			if(acnt==0) a=-1;
		}
	}
	printf("%d",a);
}

B.序列

mei ting dong

C.Legacy

赛时打的时候想可能是 DIJ 会假,结果 DIJ 没假,但是建图意料之中的 T 了.

这道题的建图非常有特色,区间建图的话,虽然不知道怎么建,但是确实是应该想到线段树.

考虑建分层图,然后把目标区间用线段树拆成节点,因为目标区间可以是出边也可以是入边,所以分两层,然后在每层叶节点连边权为零的边,这样建图复杂度只有 \(log\). 然后在树上跑 DIJ 就行了

关于 SPFA

  • 它死了

D.DP搬运工1

题解里说了,考虑设一个 \(f_{i,j,k}\) 做 DP

但是我觉得题解里的说法不是很清楚,我对这个 DP 的理解是,假设我们现在有一堆格子需要填,用 \(i\) 来表示已经填入的数字数量,\(j\) 来表示目前的空缺总数(注意这里的 “空缺”,一个空格组成的联通块称作一个 “空缺”,这么定义是因为比较好转移),\(k\) 用来表示当前填入数字后的 \(\max\) 总和

我们考虑以下情况(用 \(S\) 表示一个空缺,\(x,y\) 分别表示数字)

xSy

在我们将 \(S\) 填上的时候,假设我们每次都填一个更大的值,显然,填上之前的和是 \(a+b\),之后的和是 \(2k\),显然这么做会很麻烦,因为我们在填的时候还要考虑先把 \(a+b\) 减掉. 因此我们可以想到,与其先加上 \(a+b\) 再减掉,还不如直接不统计这个 \(a+b\) 了,因此我们直接在最后填上的时候再加上边界的贡献,这样就会比较简单.

因此,枚举五种情况:填在外面并合并,填在外面并新建连通块,填在里面并左右合并,填在里面并左或右合并,填在里面并新建联通块. 可以分别得到连通块贡献 \(0,1,-1,0,1\),\(\max\) 求和贡献 \(i,0,2i,i,0\),并且注意情况 \(1,2,4\) 是左右均可的合并方式,方案数贡献需要乘二

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=998244353;
int f[51][51][2501];
int n,kk;
signed main(){
	cin>>n>>kk;
	f[1][0][0]=1;
	for(int i=2;i<=n;++i){
		for(int j=0;j<=n-i+1;++j){
			for(int k=0;k<=kk;++k){
				if(!f[i-1][j][k]) continue;
				if(j){
					f[i][j][k+i]+=2*f[i-1][j][k]*j%p;
					f[i][j+1][k]+=f[i-1][j][k]*j%p;
					f[i][j-1][k+2*i]+=f[i-1][j][k]*j%p;
				}
				f[i][j][k+i]+=2*f[i-1][j][k]%p;
				f[i][j+1][k]+=2*f[i-1][j][k]%p;
			}
		}
	}
	int ans=0;
	for(int i=0;i<=kk;++i){
		ans+=f[n][0][i];
		ans%=p;
	}
	cout<<ans;
}

标签:暑假,DIJ,int,合并,集训,建图,空缺,CSP,DP
From: https://www.cnblogs.com/HaneDaCafe/p/18312245

相关文章

  • YOLOV8自定义数据集训练过程中遇到的问题
    书接上回,在弄好了Labelimg了以后,便开始了图像的标注。按照官网推荐的格式,建好文件夹。文件夹格式:dataset下为train和val两个文件夹,两个文件夹中的内容均为images和labels。images里放的就是图像了,labels为标注的数据。接下里就是创建自己的yaml文件,文件的内容指定数据集的根......
  • 暑假集训CSP提高模拟1考试题解
    A.Start洛谷原题链接一道大模拟,赛时20pts。教授の高光时刻-输出没加句号、空格。-C++向0取整。-DOUBLE没传递。--9操作成-1(复制粘贴导致的)。-负数位运算卡常。其实这题还是比较简单的,细节在题目中讲的很详细,跟着它说的去做就好了。我的方法是把每个玩家用一个结构......
  • 暑假集训 · 第二间
    放假7.14因为是坐火车回去所以早走了2小时发现提前一小时让huge给手机充电然后只充到50%似乐,原要更新,打崩铁,坐到一半就没电了......
  • 手机玩电脑游戏攻略教程 出门在外如何用手机畅玩3A大作?暑假游戏推荐
    小编这几天盘点了一下在暑假上线的电脑游戏,发现真是不少。什么《魔兽世界》《艾登法环黄树幽影》《绝区零》PC端、《第一后裔》《七日世界》等等,还有即将到来的《黑神话》和《魔兽世界》的正式服。各位玩家是不是已经按捺不住,想要把它们都体验一遍了?可是暑假又想出去玩,又不想......
  • 暑假两个月学习AI产品经理详细路线,看这一篇就够了
    以下是一个暑假期间学习AI产品经理的详细路线,分为八个周来进行:第1周:了解AI产品管理基础阅读材料:《人工智能:一种现代的方法》了解AI基础。《人人都是产品经理》了解产品管理基础。在线课程:Coursera上的“人工智能基础”课程。edX上的“产品管理基础”课程。实践:调研......
  • 暑假集训CSP模拟一
    赛时rank14T10,T20,T3100,T40T1大模拟出题人_______T1Start大模拟,注意细节。点此查看代码#include<bits/stdc++.h>usingnamespacestd;#ifdefLOCALFILE*InFile=freopen("in.in","r",stdin),*OutFile=freopen("out.out","w&quo......
  • 2022CSP答案+解析(附题目)
    一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)1.以下哪种功能没有涉及C++语言的面向对象特性支持:()。A.C++中调用printf函数B.C++中调用用户定义的类成员函数C.C++中构造一个class或structD.C++中构造来源于同一基类的多个派生类答......
  • 『模拟赛』暑假集训CSP提高模拟1
    Rank感冒了,同时心情极差,状态不好wwA.Start打磨你。T1放大模拟还是过于抽象了,开局劝退,遂倒序开题。赛时想复杂了一点,开了两个二维数组存牌,同时存double状态时也出了问题,还没有考虑负数的向下取整。我太蒻了改后虽然还是300多行,但是思路起码清晰了很多,改了几个小错就......
  • 暑假集训CSP提高模拟1
    暑假集训CSP提高模拟1唐完乐!T1Start大模拟,之前还做过。结果照样挂90pts细节较多,比较坑的是除法要向下取整,而/是向\(0\)取整。T2mine这\(DP\)已经简单到不能在简单了。设\(dp_{i,0/1/2}\)表示到第\(i\)位,\(0\)后面不放雷,\(1\)后面放雷,\(2\)自己是雷。......
  • 暑假集训CSP提高模拟1
    暑假集训CSP提高模拟1\(T1\)T2687.Start原题:luoguP7506「Wdsr-2.5」琪露诺的算数游戏大模拟。\(T2\)T807.mine原题:CF404DMinesweeper1D设\(f_{i,0/1/2/3/4}\)分别表示处理到第\(i\)位时,第\(i\)位为雷/第\(i\)位不为雷,第\(i-1,i+1\)位不为雷/第\(......