首页 > 其他分享 >2024.8.21 模拟赛 26

2024.8.21 模拟赛 26

时间:2024-09-23 20:14:40浏览次数:1  
标签:26 return 21 2024.8 long int 异或 ULL define

模拟赛

怎么都找不到原题了?

T1 博弈

trick,容易发现如果有一个数在路径上的出现次数为奇数,那么先手就能赢。

问题是如何判断路径上是否有一个数出现奇数次。

是一个存在性问题,考虑异或哈希,发现如果两个相同的数异或和为零,并且 \(d_{u,v} = d_{root,u} \oplus d_{root,v}\)。

如果一条路径上每个数出现次数都是偶数,那么异或和为零。所以只需要判断是否有两个点到根的路径的异或和想通就好了。

异或hash

The Number of Subpermutations

发现依旧是判断存在性问题,我们可以预处理出来每个长度合法序列的 hash 值,然后就可以用异或的方法 \(O(1)\) 判断一个区间是否合法了。

很好想 \(O(n^2)\) 的暴力,考虑分治枚举区间。假如我们找到了一个位置 \(x\),那么在处理完所有过这个点且长度为 \(a_x\) 的区间后,剩下的合法区间一定都不含 \(x\)。

显然,\(x\) 应该是这段区间最大值所在的位置。从这里分治,由于每次遍历最大会是 \(\frac{n}{2}\),所以复杂度就是 \(O(nlog(n))\)。(有点像启发式合并?)

注意单次 hash 容易被卡(脸黑),建议 hash 两次。

code
#include<bits/stdc++.h>
using namespace std;
#define ULL unsigned long long
#define LL long long
#define mx(x,y) (a[x]>a[y]?x:y)
#define jd(x,y) (((sum1[y]^sum1[x-1])==aim1[y-x+1])&&(sum2[y]^sum2[x-1])==aim2[y-x+1])
const int N = 3e5+5;
int n,a[N],st[N][25];
LL ans;
ULL aim1[N],mp1[N],sum1[N],sum2[N],aim2[N],mp2[N];
inline ULL rd(ULL sd) {return (sd<<13)+(sd<<17)+(sd<<5)+(sd+998244353);}
inline int get(int l,int r)
{
	int k=__lg(r-l+1);
	return mx(st[l][k],st[r-(1<<k)+1][k]);
}
void sol(int l,int r)
{
	if(l>r) return;
	if(l==r) return ans+=(a[l]==1),void(0);
	int mid=get(l,r);
	for(int i=max(l,mid-a[mid]+1);i+a[mid]-1<=r;i++)
		if(jd(i,i+a[mid]-1)) ans++;
	sol(l,mid-1); sol(mid+1,r);
}
int main()
{
	// freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
	srand(time(0));
	scanf("%d",&n);
	for(int i=1;i<=n;i++) 
	{
		mp1[i]=rd((ULL)rand()); mp2[i]=rd((ULL)rand());
		aim1[i]=aim1[i-1]^mp1[i]; aim2[i]=aim2[i-1]^mp2[i];
	}
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum1[i]=sum1[i-1]^mp1[a[i]],sum2[i]=sum2[i-1]^mp2[a[i]],st[i][0]=i;
	for(int i=1;i<=20;i++)
		for(int j=1;j+(1<<i)-1<=n;j++) 
			st[j][i]=mx(st[j][i-1],st[j+(1<<i-1)][i-1]);
	sol(1,n);
	printf("%lld\n",ans);
	return 0;
}
code
#include<bits/stdc++.h>
using namespace std;
#define ULL unsigned long long
const int N = 5e5+5;
int T,n;
unordered_map<int,ULL> mp;
ULL rd(ULL seed)
{
	return (seed<<13)+(seed<<17)+(seed+998244353>>3);
}
int head[N],tot;
struct E {int u,v; ULL w;} e[N<<1];
inline void add(int u,int v,ULL w) {e[++tot]={head[u],v,w}; head[u]=tot;}
ULL d[N];
void dfs(int u,int f)
{
	for(int i=head[u];i;i=e[i].u)
	{
		int v=e[i].v; if(v==f) continue;
		d[v]=d[u]^e[i].w; dfs(v,u);
	}
}
int main()
{
	// freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
	srand(time(0));
	scanf("%d",&T);
	while(T--)
	{
		memset(head,0,sizeof(head)); tot=0;
		scanf("%d",&n);
		for(int i=1;i<n;i++) 
		{
			int x,y,z; scanf("%d%d%d",&x,&y,&z);
			if(!mp[z]) mp[z]=rd((ULL)rand()); 
			add(x,y,mp[z]); add(y,x,mp[z]);
		}
		dfs(1,0);
		sort(d+1,d+1+n);
		long long ans=(1ll*n)*(n-1)/2;
		for(int i=1,c=0;i<=n;i++)
		{
			c++;
			if(d[i]!=d[i+1]) ans-=(1ll*c)*(c-1)/2,c=0;
		}
		printf("%lld\n",ans);
	}
	return 0;
}

T2

标签:26,return,21,2024.8,long,int,异或,ULL,define
From: https://www.cnblogs.com/ppllxx-9G/p/18408468

相关文章

  • 2024.8.19 模拟赛 24
    模拟赛总是忘记保存怎么办难得挂分。T1ANDandSUM签到题,如果两数按位与结果为\(a\),那么它们的二进制重复为\(1\)的位一定就是\(a\)的二进制为\(1\)的位置,所以它们相加的值至少是\(2a\)。并且不够的差值只能在\(a\)二进制为零的位置补(否则会有进位),所以判\((s-2a)......
  • 2024.8.18 模拟赛 22
    模拟赛T1先崩,然后电脑又崩。题面都在这里了T12-Coloring原题3100,张口放T1(这是原话)看起来像dp,推了两个小时大力分讨,最后式子比我命还长。刚推出来就发现假了正解差不多人类智慧吧,也可能只是小trick。对于整张图,考虑最终染色的“形状”。(下面这个样子)图片来自题解C......
  • 20240910_021725 c语言 强制转换
    关于强转大转小就需要强转演练......
  • 【PAT_Python解】1026 程序运行时间
    原题链接:PTA|程序设计类实验辅助教学平台参考资料:1、【Python】1026程序运行时间(15分)_python运行15分钟-CSDN博客2、Python实现PAT乙级1026程序运行时间_pat1026python-CSDN博客3、python3小数位的四舍五入(用两种方法解决round遇5不进)_python_脚本之家Tips......
  • 第七届民族品牌全球推介大会定于2024年12月21-22日在京召开
    ......
  • 网易126邮箱自动化测试
    网易126邮箱自动化测试项目介绍项目简介测试地址项目设计设计测试用例环境准备与使用工具工具:环境:目录结构代码实现common包下的创建Chrome浏览器web驱动对象并进行封装tests包下的页面功能测试注册功能手动测试登录功能账号正确,密码正确可以正常退出登录未注册直接登......
  • 中国土地利用覆盖和变化数据集(1980-2021)
       该数据集通过融合森林资源清查数据和20种遥感土地利用产品,重建生成了1980-2015年中国森林覆盖数据集,空间分辨率为1×1公里。并且在此基础上进一步获得高精度森林覆被信息和土地利用覆盖数据集相融合,生成了中国1980-2021年土地利用覆盖和变化数据集,空间分辨率为10×10公......
  • MGMT42110: Marketing Analytics
    MGMT42110:MarketingAnalyticsHomework2(7points)Instructions1. Download“42110_hw2_template.R”andfillinthecommandwherevernecessarytocompletethehomework.2. Copyandpasteyourcodedirectlyintothisdocumentwheneverasked.Youdonotne......
  • 串口环保212设备数据 转profinet IO项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 测试数采仪的串口数据 24 配置网关采集212设备数据 45 用PROFINETIO协议转发数据 56 案例总结 81 案例说明数采仪通过串口输出环保212的数据,网关通过串口采集数采仪的数据。网关把采集的数据转换成profinetIO从站数据。2 VF......
  • 为何有时出现:Allowed memory size of 134217728 bytes exhausted (tried to allocate
    出现“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”这样的错误,意味着PHP脚本运行时消耗的内存超过了PHP配置允许的最大内存限制。这个错误通常是因为PHP脚本处理的数据量过大、内存消耗较高的任务或配置不当引起的。以下是几种解决......