首页 > 其他分享 >CCPC2023深圳 K-四国军棋(线段树维护单调栈哈希值)

CCPC2023深圳 K-四国军棋(线段树维护单调栈哈希值)

时间:2024-02-27 21:00:11浏览次数:29  
标签:CCPC2023 Hash int len 哈希 军棋 include id op

传送门

解题思路

对于每个人的棋子,总是最高的那个棋子发挥决定性作用,被消耗后,再看剩下的最高的棋子。这就相当于单调不递增栈的维护过程。

最后就要比较两个人的单调不递增栈是否完全相同。

和经典的楼房重建相似,但是这个题不止需要维护单调栈的长度,还要维护哈希值。

我是分开写的,但是实际上可以直接用pair表示哈希值和长度,写起来条理一些。

顺便我把序列倒过来了(为了和楼房重建重合度大一些)

AC代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
#include<ctime>
#include<stack>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(!(c>='0'&&c<='9')) {if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
	return x*f;
}
const int maxn=2e5+5;
const int mod=1e9+7;
int d[2][maxn*4],len[2][maxn*4],n,m,a[2][maxn];
long long Hash[2][maxn*4],mi[maxn];
int getans(int op,int id,int l,int r,int v){
	if(l==r) return d[op][id]>=v;
	if(d[op][id]<v) return 0;
	int mid=(l+r)/2;
	if(d[op][id*2]>=v) return getans(op,id*2,l,mid,v)+len[op][id]-len[op][id*2];
	return getans(op,id*2+1,mid+1,r,v);
}
long long gethash(int op,int id,int l,int r,int v){
	if(l==r) return d[op][id]>=v?Hash[op][id]:0;
	if(d[op][id]<v) return 0;
	int mid=(l+r)/2;
	if(d[op][id*2]>=v) return (gethash(op,id*2,l,mid,v)*mi[len[op][id]-len[op][id*2]]+(Hash[op][id]-Hash[op][id*2]*mi[len[op][id]-len[op][id*2]])%mod+mod)%mod;
	return gethash(op,id*2+1,mid+1,r,v);
}
void pushup(int op,int id,int l,int r){
	int mid=(l+r)/2;
	d[op][id]=max(d[op][id*2],d[op][id*2+1]);
	int x=getans(op,id*2+1,mid+1,r,d[op][id*2]);
	long long y=gethash(op,id*2+1,mid+1,r,d[op][id*2]);
	len[op][id]=len[op][id*2]+x;
	Hash[op][id]=(Hash[op][id*2]*mi[x]+y)%mod;
	return;
}
void add(int op,int id,int l,int r,int x,int v){
	if(l==r){
		d[op][id]=v;
		len[op][id]=1;
		Hash[op][id]=v%mod;
		return;
	}
	int mid=(l+r)/2;
	if(x<=mid) add(op,id*2,l,mid,x,v);
	else add(op,id*2+1,mid+1,r,x,v);
	pushup(op,id,l,r);
}
int main()
{
	mi[0]=1;
	for(int i=1;i<=200000;i++) mi[i]=mi[i-1]*998244353%mod;
	n=read();
	for(int i=n;i>=1;i--){
		a[0][i]=read();
		add(0,1,1,n,i,a[0][i]);
	}
	m=read();
	for(int i=m;i>=1;i--){
		a[1][i]=read();
		add(1,1,1,m,i,a[1][i]);
	}
	int T=read();
	while(T--){
		int op=read(),x=read(),y=read();
		if(op==1) add(0,1,1,n,n-x+1,y),a[0][n-x+1]=y;
		else add(1,1,1,m,m-x+1,y),a[1][m-x+1]=y;
		if(Hash[0][1]==Hash[1][1]) puts("YES");
		else puts("NO");
	}
    return 0;
}

标签:CCPC2023,Hash,int,len,哈希,军棋,include,id,op
From: https://www.cnblogs.com/yinyuqin/p/18038326

相关文章

  • 关于磁盘和镜像的哈希值校验
    在取证做题联系的时候经常遇到这样的题目:请计算源盘的hash值,这时我们需要先对镜像进行挂载,像ftkimager等等软件,再对挂载后的磁盘进行hash值的计算给出两个计算工具1、火眼放入检材后相当于自动挂载2、winhex(注意此时如果需要计算本地磁盘的hash值,需要以管理员的身份运行winhe......
  • 代码随想录 第六天 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交
    LeetCode:242.有效的字母异位词-力扣(LeetCode)思路:既然只判断两个字符串的字母,就一个++,一个--,最后如果二十六个字母都是零,说明两个字符串相等。反思: //charat(i)是返回字符串索引,所以s.charAt(i)-'a'实际上是获取字符串s中第i个字符相对于字母'a'的偏移量。......
  • python dict 哈希表
    哈希值Python 内置函数 hash 返回对象 哈希值 ,哈希表 依赖 哈希值 索引元素:根据哈希表性质, 键对象 必须满足以下两个条件,否则哈希表便不能正常工作:哈希值在对象整个生命周期内不能改变;可比较,且比较相等的对象哈希值必须相同;满足这两个条件的对象便是......
  • 图解一致性哈希算法
    一、背景在具体介绍一致性哈希算法之前,先问一个问题:为什么需要一致性哈希算法?下面我们通过一个案例来回答这个问题。假设有这么一种场景:我们有三台缓存服务器分别为:node0、node1、node2,有3000万个缓存数据需要存储在这三台服务器组成的集群中,希望可以将这些数据均匀的缓存到三台......
  • 算法-哈希表
    1.有效字母的异位词(LeetCode242)题目:给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。s和t仅包含小写字母思路:使用大小为26的数组存储单词中每个字母出现的次数因为题目限制了字......
  • [学习笔记]哈希与哈希表
    1.定义我们定义一个把字符串映射到整数的函数\(f\),这个\(f\)称为是Hash函数。我们希望这个函数\(f\)可以方便地帮我们判断两个字符串是否相等。词汇“映射”映射意为将一个集合中的任意元素和另一个集合中的元素一一对应。(请大佬指正)2.思想Hash的核心思想在于,将输入......
  • Python计算两图相似性-哈希算法(Hash)
    1、简介aHash:平均值哈希。速度比较快,但是常常不太精确。pHash:感知哈希。精确度比较高,但是速度方面较差一些。dHash:差异值哈希。精确度较高,均值哈希算法、差值哈希算法和感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的hash值有多少不同。三直方图和单通道直方图......
  • 4-Redis十大关系之哈希Hash
    Redis十大关系之哈希Hash:Map<String,Map<Object,Object>>HSETkeyfieldvaluefieldvalue...:设置属性值HGETkeyfield:获取对应属性值HGETALLkey:遍历哈希HDELkeyfield:删除field对应的属性HLENkey:获取某个key内的全部数量HEXISTSkeyfield:判断key中有没有fie......
  • Qt 哈希加密 QCryptographicHash
    QCryptographicHash类提供了生成密码散列的方法。该类可以用于生成二进制或文本数据的加密散列值。目前支持MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512。共有类型枚举QCryptographicHash::Algorithm:公共函数voidaddData(constchar*data,intlength)......
  • 字符串匹配——哈希算法
    一、算法原理我们不直接比较字符串\(S\)的字串和模式串\(T\)是否相等,而是比较二者的哈希值。设字符串\(S\)的长度为\(l\),字符串\(T\)的长度为\(m\)。取两个互素的常数\(b\)和\(h\)(\(l<b<h\)),设字符串\(C=c_1c_2...c_m\),则哈希函数为:\[H(C)=(c_1b^{m-1}+......