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

暑假集训CSP提高模拟18

时间:2024-08-11 21:38:26浏览次数:4  
标签:10 cnt int 18 ll 集训 maxn res CSP

好像还有好多没写的

A. Mortis

赛时思路是正解,但有一个判断想了但出锅了。。。

\(n\) 个数的序列 \(n-1\) 次肯定能换完,一次操作最多贡献 2,找出贡献2的操作个数减去即可

有一次操作匹配两个,两次操作匹配三个,三个操作匹配四个,三种情况,记个数都跑一遍即可

点击查看代码
#include<bits/stdc++.h>
const int maxn=2e5+10;
using namespace std;
int n,a[maxn],l[10],r[10],cnt[10][10],sum[10],ans,x,z;

int main()
{
//	freopen("sample.in","r",stdin); 
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum[a[i]]++;
	}
	for(int i=1;i<=4;i++)
	{
		if(sum[i])
		{
			l[i]=r[i-1]+1;
			r[i]=l[i]+sum[i]-1;
		}
		else
		{
			r[i]=r[i-1];
			l[i]=r[i]+1; 
		} 
	}
//	cout<<r[4]<<endl; 
	for(int i=1;i<=4;i++)
	{
		for(int j=l[i];j<=r[i];j++)
		{
			if(sum[i])cnt[i][a[j]]++;
		}
	}
//	int c=0;
//	for(int i=1;i<=4;i++)
//		for(int j=i;j<=4;j++)c+=cnt[i][j];
//	cout<<c<<endl;
	int o=0;	
	ans=n-1;
	for(int i=1;i<=4;i++)x+=cnt[i][i];
	for(int i=1;i<=4;i++)
	{
		for(int j=i;j<=4;j++)
		{
			if(sum[i]>0&&sum[j]>0)
			{
				int f=min(cnt[i][j],cnt[j][i]);	
				o+=f;
				ans-=f;
				cnt[i][j]-=f;
				if(i!=j)cnt[j][i]-=f;
//				cout<<cnt[i][j]<<" "<<cnt[j][i]<<endl;
			}
		}
	}
//	for(int i=1;i<=4;i++)
//		for(int j=1;j<=4;j++)
//			cout<<cnt[i][j]<<" ";

	for(int i=1;i<=4;i++)
	{
		for(int j=1;j<=4;j++)
		{
			for(int k=1;k<=4;k++)
			{
				int f=min(min(cnt[i][j],cnt[j][k]),cnt[k][i]);
				ans-=f;
				z+=f;
				cnt[i][j]-=f;
				cnt[j][k]-=f;
				cnt[k][i]-=f;
			}    
		}
	}
	int u=0;
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			for(int k=1;k<=4;k++)
				for(int e=1;e<=4;e++)
				{
					int f=min(min(cnt[i][j],cnt[j][k]),min(cnt[k][e],cnt[e][i]));
					ans-=f;
					u+=f;
					cnt[i][j]-=f;
					cnt[j][k]-=f;
					cnt[k][e]-=f;
					cnt[e][i]-=f;
				} 
	
//	for(int i=1;i<=4;i++)
//		for(int j=1;j<=4;j++)
//			cout<<cnt[i][j]<<" ";
	
//	cout<<n<<" "<<ans<<" "<<z<<" "<<o<<endl;
//	cout<<(n+u-1-x-ans)*2+x+z<<endl;
	if((n+u-1-x-ans)*2+x+z==n)ans++;
	cout<<ans;
	
	return 0;
}
/*
13
3 3 1 1 1 3 3 3 4 2 4 2 2 
*/

C. 嘉然今天吃什么

我感觉我现在急需一个数据结构大佬来传授一下代码能力。。

赛事我打完暴力,开始考虑最大值的贡献,发现只需要找一个链上的最大值即可,然后我就开始想如何 \(log n\) 内求出

最大值,但我只会 \(n^2\) 的。。。很恼,讲 \(trie\) 树时基本没听,根本没想起来有这玩意。。。

用 \(0,1,trie\) 树,每次把除了这个点子树之外的点都插入 \(trie\) 树,倒着遍历可以使每个点只插一次,直接查即可

点击查看代码
#include<bits/stdc++.h>
#define ll long long
const int maxn=5e5+10;
using namespace std;
int n,head[maxn],to[maxn],nxt[maxn],tot,cnt;
int t[maxn*65][2],fa[maxn]; 
ll a[maxn],now,ans[maxn];
inline void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}

void insert(ll x)
{
	int p=0;
	for(int i=63;i>=0;i--)
	{
		int c=x>>i&1;
		if(!t[p][c])t[p][c]=++cnt;
		p=t[p][c];
	}
}

ll query(ll x)
{
	ll res=0,p=0;
	for(int i=63;i>=0;i--)
	{
		int c=x>>i&1;
		if(t[p][c^1])res=res*2+1,p=t[p][c^1];
		else res=res*2,p=t[p][c];
	}
	if(res>now)now=res;
	return res;
}

inline void lsx(int x)
{
	insert(a[x]);
	query(a[x]);
	for(int i=head[x];i;i=nxt[i])
	{
		int y=to[i];
		lsx(y);
	}
} 

void dfs(int u,int p)
{
	if(!u)return ;
	dfs(fa[u],u);
//	cout<<u<<" "<<now<<"!"<<endl; 
	ans[u]=now;
	insert(a[u]);
	query(a[u]);
	for(int i=head[u];i;i=nxt[i])
	{
		int y=to[i];
		if(y!=p)lsx(y);
	}
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	fill(ans+1,ans+1+n,-1);
	for(int i=1;i<n;i++)
	{
		int x;
		cin>>x;
		fa[i+1]=x; 
		add(x,i+1);
	}
	for(int i=1;i<=n;i++)cin>>a[i],insert(a[i]);
	ll x=0,y=0,res=0;
	for(int i=1;i<=n;i++)
	{
		ll temp=query(a[i]);
		if (temp>res)
		{
			res=temp;
			x=a[i],y=temp^a[i];
		}
	}
	ll xx=0,yy=0;
	for(int i=1;i<=n;i++)
		if(a[i]==x) xx=i;
		else if(a[i]==y) yy=i;
	memset(t,0,sizeof t),cnt=0,now=0;
	dfs(xx,0);
	memset(t,0,sizeof t),cnt=0,now=0;
	dfs(yy,0);
	for(int i=1;i<=n;i++)
		cout<<(ans[i]>=0?ans[i]:res)<<'\n';	
	
	
	return 0;
}

标签:10,cnt,int,18,ll,集训,maxn,res,CSP
From: https://www.cnblogs.com/oceansofstars/p/18353949

相关文章

  • [赛记] 暑假集训CSP提高模拟18
    T2T4不太可做,所以没改Mortis20pts原题:Luogu[ABC302G]Sortfrom1to4赛时用$set$乱搞拿了20pts,事实证明确实是乱搞;考虑交换只有三种情况:a在b上,b在a上,需要一次;a在b上,b在c上,c在a上,需要两次;a在b上,b在c上,c在d上,d在a上,需要三次;这里的在什么什么上是指原数组......
  • 2024暑假集训测试22
    前言比赛链接。今天题好难啊,大多数人T2、T4改不动都不改了,下午miaomiao进来和我们说模拟赛改不动的题可以不改。部分分给的也很少。T1Mortis原题:[ABC302G]Sortfrom1to4。\(O(n)\)桶排序,知道每个数最后应该去哪,那么对于需要交换的只有三种情况:二者错排,交换......
  • 2024.8.11 总结(集训 考试)
    之前听说今天的考试难度是NOIP-。T1赛时只会暴力。甚至还想出了比时间复杂度\(O(n^2)\)的暴力更慢的时间\(O(n^3)\)(可能不是,可能要\(/\omega\))的bitset做法。正解之一是xorhashing。前年(T3)、去年(T2?)的CSP-S我都没想出hash做法。感觉自己缺乏想hash的意识。......
  • P9751 [CSP-J 2023] 旅游巴士
    原题链接分析很逆天的一道题设\(dp[i][j]\)为到达第\(i\)个点的时刻\(t\)且满足\(t\modk=j\)的最小\(t\)则有答案为\(dp[n][0]\)更新也很简单,设当前点为\(u\),当前时间为\(t\)需要遍历的下一个点\(v\),则有\(dis[v][(t+1)\%k]=dis[u][t\%k]+1\)如果道路还没开......
  • 【ESP01开发实例】- ISD1820录音控制
    ISD1820录音控制文章目录ISD1820录音控制1、ISD1820模块介绍2、硬件准备及接线3、代码以实现录音技术已经取得了长足的进步,它已成为从语音助手到安全系统的各种应用不可或缺的一部分。如果您有兴趣构建自己的录音系统,将ISD1820模块与ESP01微控制器相结......
  • 2024暑假集训测试21
    前言比赛链接。T1写得和正解差不多但少了个细节炸longlong了;T2只会\(n^3\)的本来只有\(50pts\),但考虑出题人大概率会搞一个\(n\)越大\(T\)越小,所以对于\(n\)很大的直接\(rand\)正确率还是有的,所以获得了\(80pts\);T3不会;T4没有和\(n\)取\(\min\)直接......
  • 【杂记】英华集训纪要
    8.11下午入校,然后各种收拾行李之类的来了机房发现除了我还有4位大佬,膜拜因为中考前我不是好几个月没学吗,也是忘干净了然后开始复习,这些题也是异常简单,过两天就能回去写Ynoi了upd:后面老哥一个在打杂交版pvz,一个在打火影忍者,绷不住了P1434[SHOI2002]滑雪我咋开始写这么简......
  • 『模拟赛』暑假集训CSP提高模拟18
    Rank致敬传奇不挂分Rank5模拟赛A.Mortis原[ABC302G]Sortfrom1to4签,致敬传奇abc_g作签到题。虽然但是还是想了1h,好在最后成功切了。具体解释看看题解,求个赞。点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintRatio=0;constintN=2......
  • 暑假集训CSP提高模拟18
    \[暑假集训CSP提高模拟\1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1\]Verygoodproblem,thismakemynewsrotate.A.Mortis考虑到应该先写个假的暴力.对于暴力思路,可以想到,假如我们每次都将一个不在它位置上的数字移到它应该在的地方的时候,另一个数字也刚好移到正确的位置,这......
  • csp-j2023第四题 旅游巴士
    旅游巴士这道题在一年之前的csp-j中并没有做(我是一个蒟蒻)回看本题,又有了新的想法对于每一层i我们将其看成走到这是的时间jmodk的余数很显然,为了让我们更快的通过,等待时间+当前时间>=限制时间是最优的/*使用分层图,跑dijkstra堆优化的最短路在限制时间那部分,若小于限制时间,......