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

暑假集训CSP提高模拟19

时间:2024-08-13 15:51:05浏览次数:7  
标签:cnt const 19 head 集训 int maxn CSP dis

A. 数字三角形

没看到拍列,对着自己造的错样例改半天。填数,由上往下都向左下填,可以保证有解

点击查看代码
#include<bits/stdc++.h>
const int maxn=550;
using namespace std;
int a[maxn][maxn],n,flag,cnt,maxx,mi;
struct lsx
{
	int x,id;
	bool operator < (const lsx &a) const
	{
		return x>a.x;
	}
}p[maxn];

void solve(int x,int y,int p)
{
//	cout<<x<<" "<<y<<" "<<cnt<<" "<<p<<endl; 
	if(x<1||x>n||y>x||y<1)return ;
	if(flag==1) return ;	
	a[x][y]=p;
	cnt--;
	if(cnt==0)
	{
		flag=1;
		return;
	}
	if(!a[x][y-1])solve(x,y-1,p);
	if(!a[x+1][y])solve(x+1,y,p);
	if(!a[x-1][y])solve(x-1,y,p);
	if(!a[x][y+1])solve(x,y+1,p);
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) 
	{
		cin>>p[i].x,a[i][i]=p[i].x,p[i].id=i;
		if(p[i].x>maxx)maxx=p[i].x,mi=i;
	}
	for(int i=1;i<=n;i++)
	{
		flag=0;
		cnt=p[i].x;
		solve(p[i].id,p[i].id,p[i].x);
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			cout<<a[i][j]<<" ";
		}
		cout<<'\n';
	}
	
	return 0;
}
/*
4
4 2 1 3
*/

B. 那一天她离我而去

按边暴搜可以得到 \(n=m\) 的23分,加个剪枝用 \(vector\) 存图可以得到76分(所以为啥前向星只有37)

考虑如何构成一个环,枚举与1相连的出环儿子和入环儿子,因为编号之间的二进制肯定有一位不一样

所以考虑枚举位数,每次将1向这一位是0的连边,这一位是1的向 \(n+1\) 连边,跑1- \(n+1\) 的最短路

可以保证每一对都跑到

点击查看代码
#include<bits/stdc++.h>
const int maxn=1e5+10;
using namespace std;
int T,n,m,head[maxn],nxt[maxn],to[maxn],val[maxn],tot;
int vis[10010],dis[10010],a[maxn],v[maxn],cnt;
int f[maxn],t[maxn],V[maxn],sum,ans; 

inline void add(int x,int y,int z)
{
	to[++tot]=y;
	val[tot]=z;
	nxt[tot]=head[x];
	head[x]=tot;
}

priority_queue<pair<int,int> >q;
void lsx(int s)
{
	fill(vis+1,vis+n+2,0);
	fill(dis+1,dis+n+2,1e9);
	dis[s]=0;
	q.push({0,s});
	while(q.size())
	{
		int x=q.top().second;
		q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(int i=head[x];i;i=nxt[i])
		{
			int y=to[i];
			if(dis[y]>dis[x]+val[i])
			{
				dis[y]=dis[x]+val[i];
				q.push({-dis[y],y});
			}
		}
	}
}


int main()
{
//	freopen("leave.in","r",stdin);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--)
	{
		sum=cnt=0;;
		cin>>n>>m;
		for(int i=1,x,y,z;i<=m;i++)
		{
			cin>>x>>y>>z;
			if(x==1||y==1)
			{
				if(x==1)a[++cnt]=y,v[cnt]=z;
				else a[++cnt]=x,v[cnt]=z;
			}
			else
			{
				f[++sum]=x,t[sum]=y,V[sum]=z;
			}
		}
		int len=0;
		for(int i=1;i<=cnt;i++)
		{
			for(int j=20;j>=0;j--)
			{
				if((1<<j)&a[i])
				{
					len=max(len,j);
					break;
				}
			}
		}	
		ans=1e9;
		for(int i=len;i>=0;i--)
		{
			memset(head,0,sizeof head);
			tot=0;
			for(int j=1;j<=cnt;j++)
			{
				if((1<<i)&a[j])add(1,a[j],v[j]);
				else add(a[j],n+1,v[j]);
			}
			for(int j=1;j<=sum;j++)
			{
				add(f[j],t[j],V[j]);
				add(t[j],f[j],V[j]);
			}
			lsx(1);
			ans=min(ans,dis[n+1]);
		}
		cout<<(ans==1e9?-1:ans)<<'\n';
	}
	
	return 0;
}

C. 哪一天她能重回我身边

抽象思路题,正面牌向背面牌连边权为1的边,再反向连一个边权为0的边,翻一张牌相当于把边反向,那就是求最小次数

把每张正面的牌的出度变为1,每个联通块独立求答案,方案数是各联通块答案之积,对于每个联通块来说,边数大于点数

肯定有一个点出度大于1,跑换根dp,第一次求向下指的边权为1的边个数,让这些边都变成向上的即可保证每个点出度都

不大于1,再跑第二遍dp更新其他点,只会更新两点之间的边,换根之后原来不用反的现在要反,原来用的现在不用。如果

联通块不是树的话,就找环,然后拆环取两个方向最小值即可,记得加上拆掉的那边

点击查看代码
#include<bits/stdc++.h>
#define ll long long
const int maxn=2e5+10;
const int mod=998244353;
using namespace std;
int T,n,m,head[maxn],nxt[maxn<<1],to[maxn<<1],val[maxn<<1],tot;
int a[maxn],s,t,pos,sum;
bool vis[maxn],flag;
ll f[maxn],g[maxn],fi,en,ans1,ans2,num;

void add(int x,int y,int z)
{
	to[++tot]=y;
	val[tot]=z;
	nxt[tot]=head[x];
	head[x]=tot;
}

void pre()
{
	tot=1,flag=0,ans1=0,ans2=1;
	memset(head,0,sizeof head);
	memset(vis,0,sizeof vis);
}
int tt;
void calc(int x)
{
	
	vis[x]=1;
	fi++;
	for(int i=head[x];i;i=nxt[i])
	{
		int y=to[i];
		en++;
		if(vis[y])continue;
		calc(y);
	}
}

void dfs(int x,int fa)
{
	vis[x]=1,f[x]=0;
	for(int i=head[x];i;i=nxt[i])
	{
		int y=to[i];
		if(y==fa)continue;
		if(!vis[y])
		{
			dfs(y,x);
			f[x]+=f[y]+val[i];
		}
		else s=x,t=y,pos=i;
	}
}

void solve(int x,int fa)
{
	a[++sum]=g[x];
	for(int i=head[x];i;i=nxt[i])
	{
		int y=to[i];
		if(y==fa) continue;
		if(i==pos||i==(pos^1))continue;
		g[y]=g[x]+(val[i]?-1:1);
		solve(y,x);
	}
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--)
	{
		tt+=10;
		cin>>n;
		pre();
		for(int i=1,x,y;i<=n;i++)
		{
			cin>>x>>y;
			add(x,y,1);
			add(y,x,0);
		} 
		for(int i=1;i<=2*n;i++)
		{
			if(!vis[i])
			{
				fi=en=0;
				calc(i);
				if(en/2>fi)
				{
					flag=1;
					break; 
				}
			}
		}
//		exit(tt);
		if(flag)
		{
			cout<<"-1 -1"<<'\n';
			continue;
		}
		memset(vis,0,sizeof vis);
		for(int i=1;i<=2*n;i++)
		{
			if(!vis[i])
			{
				s=t=pos=-1;num=sum=0;
//				memset(a,0,sizeof a); 
				dfs(i,0);g[i]=f[i];
				solve(i,0);
				if(s==-1)
				{
					sort(a+1,a+1+sum);
					for(int j=1;j<=sum;j++)
					{
						if(a[j]!=a[1])break;
						num++;
					}
					ans1+=a[1];
				}
				else
				{
					pos%=2;
					if(g[s]+pos==g[t]+(pos^1))num=2;
					else num=1;
					ans1+=min(g[s]+pos,g[t]+(pos^1));
				}
				ans2=ans2*num%mod;
			}
		}
		cout<<ans1<<" "<<ans2<<'\n';
	}
	
	return 0;
}

D. 单调区间

这里直接搬学长题解了,%%%

题解图片

image

点击查看代码
#include<bits/stdc++.h>
const int inf=0x3f3f3f;
const int maxn=2e5+10;
using namespace std;
int a[maxn],n,f[maxn][2],last;
long long ans=0;
void solve(int l)
{
    f[l][0]=inf;f[l][1]=-inf;
    for(int i=l+1;i<=n;i++)
	{
        int x=-inf,y=inf;
        if(f[i-1][0]!=-inf)
		{
            if(a[i]>a[i-1])x=max(x,f[i-1][0]);
            if(a[i]<f[i-1][0])y=min(y,a[i-1]);
        }
        if(f[i-1][1]!=inf)
		{
            if(a[i]<a[i-1])y=min(y,f[i-1][1]);
            if(a[i]>f[i-1][1])x=max(x,a[i-1]);
        }
        if(f[i][1]==y&&f[i][0]==x)break;
        else
		{	f[i][1]=y;
			f[i][0]=x;
		}
        if(f[i][0]==-inf&&f[i][1]==inf)
		{
			last=i-1;
			break;
		}
    }
    ans+=last-l+1;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
   	cin>>n;
	last=n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=n;i>=1;i--)solve(i);
    cout<<ans;
    
    return 0;
}

标签:cnt,const,19,head,集训,int,maxn,CSP,dis
From: https://www.cnblogs.com/oceansofstars/p/18357080

相关文章

  • 【做题记录】Codeforces Round 915 (Div. 2)/CF1905A-F
    @目录A.ConstructiveProblems(800)B.Begginer'sZelda(1100)C.LargestSubsequence(1400)D.CyclicMEX(2000)E.One-X(2400)F.FieldShouldNotBeEmpty(2600)提交记录A.ConstructiveProblems(800)注意到,对于\(n\timesn\)的矩阵,只需要把对角线全染黑即可。推广到\(......
  • Flink1.19 JobSubmitHandler源码解析
    文章目录概要整体架构流程概要JobGraph在客户端生成后,需要发送到服务端,首先会被JobSubmitHandler(WebMonitor内处理http请求的处理类)接收处理,然后会发送到Dispatcher进一步处理整体架构流程首先会进入JobSubmitHandler对象的handleRequest方法有两个参数:request:封......
  • P5836 [USACO19DEC] Milk Visits S(树上并查集)
    核心思路对于相同颜色且相邻的点合并。若不在同一集合,则0若在同一集合,同色1异色0AC代码#include<bits/stdc++.h>usingnamespacestd;intfa[1145141];charcol[1145141];intn,m;intfind(intx){ if(x==fa[x]) returnx; returnfa[x]=find(fa[x]);}v......
  • Oracle 19c通过recover standby database from service修复GAP案例
    案例介绍环境介绍操作系统:RedHatEnterpriseLinuxrelease8.10(Ootpa)数据库版本:Oracle19.23.0.0.0上周五,系统管理员需要给Linux升级补丁,UAT环境下的一套DG,数据库没有正常关闭的情况下,操作系统升级补丁后强制reboot了,周一早上处理的过程中遇到下面错误:备库的告警日......
  • Windows Server 2019 搭建FTP站点制作服务器证书
    制作服务器证书1.在“服务器管理器”中,选择“仪表板>工具>InternetInformationServices(IIS)管理器”。2.在左侧列表单击服务器,然后在服务器主页“IIS”区域,双击“服务器证书”,进入“服务器证书”页面。3.单击“创建自签名证书”  4.输入证书的名称......
  • 2024.8.12 总结(集训)
    破防的一天。TQX来给我们讲课。stOTQXOrz讲的是二分图和网络流。感觉内容很多,而且比较难,讲得对我来说比较快。很多东西我还没懂就过了,有时我还走神了,没听到。胡老师说今天是见图论的“天”,网络流是图论的天花板,本来就没打算让我们今天全部听懂。下午看了一下午别人的博客、......
  • [WC2019] 数树纯组合线性做法
    NaCly_Fish的博客激发了继续思考的欲望。我是多项式白痴,所以让我们来思考组合意义做法!本题本质上是需要让我们求\(\sum_{E_1\text{是树}}\sum_{E_2\text{是树}}y^{-|E1\cupE2|}\)的值。我们容斥一下交集,发现考虑上容斥系数就是将\(y\leftarrow\frac{1}{y}-1\)。剩下......
  • 暑假集训csp提高模拟19
    赛时rank5,T1100,T2100,T320,T45T4暴力可过?数据这么水?咋还有失恋舔狗三部曲啊T1数字三角形Fillomino2相对简单的构造题。能向上走就向上走,不能的话往左走,再不能的话就往下走,可以证明一定不会往右走。递归写就行点此查看代码#include<bits/stdc++.h>#include<bi......
  • 2024暑假集训测试23
    前言比赛链接。T2部分分给得特别足,\(60pts\),而且他不可能剩下的数据全放菊花,所以得到了\(76pts\),但赛时想了很长时间正解,没有想出来,给后面题剩的时间不多,就都胡暴力了,\(T4\)甚至忘了剪枝,剪完之后\(20pts\to60pts\)没绷住。说到这儿要吐槽一下T4数据水的离谱,什么高级......
  • CSP19
    没啥可说的,暴力大赛水题,贪心的尽量向右构造即可点击查看代码#include<bits/stdc++.h>#definespeed()ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);#definelllonglong#definepbpush_back#defineullunsignedlonglong#definepiipair<int,int>#defin......