首页 > 其他分享 >2024.4.8 数据结构课件补题

2024.4.8 数据结构课件补题

时间:2024-04-08 23:25:03浏览次数:33  
标签:ch 2024.4 int 课件 while maxn 补题 now size

[AGC055B] ABC Supremacy

ABC 分别为 1,2,3,然后令 \(s_i=(s_i-i) \text mod 3\) 且结果大于 0。

然后可以发现三种组合均为连贯的三个相同数。且可以自由移动。

可以选择每遇到三个相同数就删掉,或者不断加入栈,如果栈顶三个数相同全部弹出。

再比较剩下的数即可。

#include<bits/stdc++.h>
#define maxn 600100

using namespace std;

int n,cnts,cntt;
int S[maxn],T[maxn];
string a,b;
bool viss[maxn],vist[maxn];
int s[maxn],t[maxn]; 
stack<int> A,B;

int read(){
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
	return s*w;
}

int main(){
	n=read();
	cin>>a>>b;
	for(int i=0;i<n;i++){
		if(a[i]=='A') s[i+1]=1;
		if(a[i]=='B') s[i+1]=2;
		if(a[i]=='C') s[i+1]=3;
		if(b[i]=='A') t[i+1]=1;
		if(b[i]=='B') t[i+1]=2;
		if(b[i]=='C') t[i+1]=3;
		s[i+1]=(s[i+1]-(i+1))%3;
		t[i+1]=(t[i+1]-(i+1))%3; 	
		if(s[i+1]<0) s[i+1]+=3;
		if(t[i+1]<0) t[i+1]+=3; 
	} 
	for(int i=1;i<=n;i++){
		if(A.size()>=2){
			int x=A.top();A.pop();
			int y=A.top();A.pop();
			if(!(x==y&&x==s[i])){
				A.push(y);A.push(x);
				A.push(s[i]);
			}
		}
		else A.push(s[i]);
		if(B.size()>=2){
			int x=B.top();B.pop();
			int y=B.top();B.pop();
			if(!(x==y&&x==t[i])){
				B.push(y);B.push(x);
				B.push(t[i]);
			}
		}
		else B.push(t[i]);
	}

	if(A.size()!=B.size()){
		puts("NO");return 0;
	}
	while(A.size()){
		if(A.top()!=B.top()) {puts("NO");return 0;}
		A.pop();B.pop();
	}

	puts("YES");
	return 0;
}

BZOJ2616 SPOJ PERIODNI

题解做法,注意统计答案的顺序。

#include<bits/stdc++.h>
#define maxn 1000100
#define Mod 1000000007 
#define LL long long

using namespace std;

int n,k;
int a[maxn];
LL st[maxn],top;
int ls[maxn],rs[maxn],size[maxn];
LL int f[1010][1010],g[1010][1010];
LL int inv[maxn],mul1[maxn],mul2[maxn];

int read(){
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
	return s*w;
}

LL int C(LL int x,LL int y){
	return y>x?0:mul1[x]*mul2[y]%Mod*mul2[x-y]%Mod;
}

void dfs(int u,int fa){
	if(ls[u])dfs(ls[u],u);
	if(rs[u])dfs(rs[u],u);
	size[u]=size[ls[u]]+size[rs[u]]+1;
	for(int i=0;i<=size[ls[u]];i++){
		for(int o=0;o<=size[rs[u]];o++){
			g[u][i+o]+=f[ls[u]][i]*f[rs[u]][o]%Mod;
			g[u][i+o]%=Mod;
		}
	}
	for(int i=0;i<=size[u];i++){
		for(int o=0;o<=i;o++){
			f[u][i]+=g[u][o]*(C(size[u]-o,i-o)*C(a[u]-a[fa],i-o)%Mod*mul1[i-o]%Mod)%Mod;
			f[u][i]%=Mod;
		}
	}
}
int main(){
	n=read();k=read(); 
	inv[0]=mul1[0]=mul2[0]=1;
	inv[1]=mul1[1]=mul2[1]=1;
	for(LL int i=2;i<=1e6;i++){
		inv[i]=inv[Mod%i]*(Mod-Mod/i)%Mod;
		mul1[i]=mul1[i-1]*i%Mod;
		mul2[i]=mul2[i-1]*inv[i]%Mod;
	}
	for(int i=1,k;i<=n;i++){
		a[i]=read();k=top;
		while(k>0&&a[st[k]]>a[i])k--;
		if(k)rs[st[k]]=i;
		if(k<top)ls[i]=st[k+1];
		st[++k]=i;top=k;
	}
	f[0][0]=1;
	dfs(st[1],0);
	cout<<f[st[1]][k];
}

ICPC2023 Macau Gym104891C

贪心想的话是能选哪种选哪种。

分块跳跳跳,统计跳出当前块的步数和位置。

统计一个标记来维护整个块内部,记录用哪一种牌。

代码实现借鉴了凉笙和课件 std。

#include <bits/stdc++.h>
#define maxn 100010

using namespace std;

int read(){
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
	return s*w;
}

int n,k,len,maxx;
int pos[maxn],L[maxn],R[maxn],a[maxn];
int to[maxn],nxt[maxn],f[maxn],tag[maxn],lstf[maxn];
set<int> s;

void change(int x,int val){
    if(val>0)nxt[x]=val;
    else nxt[x]=x+k;
}

void rebuild(int id){
    for(int i=R[id];i>=L[id];i--){
        if(nxt[i]>R[id]){
        	to[i]=nxt[i];f[i]=1;
			lstf[i]=(!(i>=maxx));
        }
        else{
        	to[i]=to[nxt[i]];f[i]=f[nxt[i]]+1;
			lstf[i]=(i>=maxx)?0:lstf[nxt[i]]+1;
        }
    }
}

void pushdown(int u){
    if(!tag[u]) return;
    for(int i=L[u];i<=R[u];i++)change(i,tag[u]);
    tag[u]=0;
}

void update(int x,int y,int val){
    if(pos[x]==pos[y]){
        pushdown(pos[x]);
        for(int i=x;i<=y;i++)change(i,val);
        rebuild(pos[x]);
        return ;
    }
    pushdown(pos[x]);
    for(int i=x;i<=R[pos[x]];i++)change(i,val);
    rebuild(pos[x]);
    
	pushdown(pos[y]);
    for(int i=L[pos[y]];i<=y;i++)change(i,val);
    rebuild(pos[y]);
    
	for(int i=pos[x]+1;i<pos[y];i++)tag[i]=val;
}

int query(int mx){
    int now=0,res=0;
    while(now<mx){
        if(tag[pos[now]]>0)res++,now=tag[pos[now]];
        else if(tag[pos[now]]==-1)res++,now+=k;
        else {
            if(pos[now]!=pos[mx])res+=f[now],now=to[now];
            else res+=lstf[now],now=to[now];
        }
    }
    return res;
}

int main(){
    int T=read();
    while(T--){
        n=read();k=read();len=sqrt(n);
        for(int i=1;i<=n;i++)
			a[i]=read(),L[i]=R[i]=0;
        
		for(int i=0;i<=n;i++){
            pos[i]=(i-1)/len+1;
            if(!L[pos[i]])L[pos[i]]=i;
            R[pos[i]]=i;
            nxt[i]=to[i]=n+1;
            f[i]=lstf[i]=tag[i]=0;
        }
        
        pos[0]=L[0]=R[0]=0;s.insert(0);
		for(int i=1;i<=n;i++){
            maxx=max(maxx,a[i]);s.insert(a[i]);
            int lst=*(--s.lower_bound(a[i]));
            int l=max(lst,a[i]-k);update(l,a[i]-1,-1);
            if(lst<a[i]-k)update(lst,a[i]-k-1,a[i]);
            int ans=query(maxx);cout<<ans<<" ";
        }
        puts("");
        maxx=0;
    }
    return 0;
}

标签:ch,2024.4,int,课件,while,maxn,补题,now,size
From: https://www.cnblogs.com/KnightL/p/18122889

相关文章

  • 2024/4/8 课件补题
    2024/4/8课件补题[AGC055B]ABCSupremacy思维题。发现所有的\(ABC\),\(BCA\),\(CAB\)都可以任意向左向右移动,所以只需要把所有的\(ABC\)挪到字符串结尾即可,具体操作时可以删掉再比对\(s\)和\(t\)是否相同。#include<bits/stdc++.h>usingnamespacestd;#defineld......
  • 云原生周刊:2024 年 K8s 基准报告 | 2024.4.8
    开源项目推荐ArgoCDImageUpdaterArgoCDImageUpdater是一个自动更新ArgoCD管理的Kubernetes工作负载容器镜像的工具。简而言之,它将跟踪ArgoCD应用程序资源上的注释指定的图像版本,并通过使用ArgoCDAPI设置参数覆盖来更新它们。目前,它仅适用于使用Kustomize......
  • 2024.4.8 pytorch框架初上手
    pytorchPyTorch是一个针对深度学习,并且使用GPU和CPU来优化的tensorlibrary(tensor库)中文文档:https://pytorch.org/resources梯度/导数计算#linear.pyimporttorchimportnumpyasnpx=torch.tensor(3,)w=torch.tensor(4.,requires_grad=True)b=t......
  • 2024.4.7 训练1(rating) Codeforces Global Round 25
    https://codeforces.com/contest/1951题解参考:https://zhuanlan.zhihu.com/p/691034931A题一开始的思路比较绕,wa很多发卡了半小时才过。hansun的思路比较硬直,他在极短的时间内过了Ahansun的题解:https://codeforces.com/contest/1951/submission/255262403我的想法是分奇偶情......
  • [护网必备]知攻善防实验室蓝队应急响应工具箱v2024.4
    前言蓝队工具箱是为打造一款专业级应急响应的集成多种工具的工具集,由真实应急响应环境所用到的工具进行总结打包而来,由ChinaRan404,W啥都学,清辉等开发者编写.把项目现场中所用到的工具连同环境一同打包,并实现“可移植性”“兼容性”“使用便捷”等优点。集成模块:“常用工具......
  • 日记 2024.4.7:子集卷积
    日记2024.4.7:子集卷积记号\(F(x)=\sum_{S\subseteq[n]}f_Sx^{S}\)是一个集合幂级数,其中\([n]=\{1,2,\cdots,n\}\),\(f_S\)是一个数组,然后写成像生成函数(其实是“形式幂级数”)的形式,\(x^S\)的这个指数是没意义的。FWT/FMT即两个集合幂级数的并、交、异或卷积运算。h......
  • 2024.4.7每日一题
    mysql1.创建索引idx_emp_no,查询emp_no为10005,使用强制索引forceindex(idx_emp_no)2.现在在last_update后面新增加一列名字为create_date,类型为datetime,NOTNULL,默认值为'000000:00:00'这里的默认值要写成,我还不知道为什么要这样default'2020-10-0100:00:00'java1......
  • 2024.4 做题纪要
    aaaaaaaaaaaaaaaaa大致是在成七集训,虽然挺多都是3月底的不过还是整一下。目录2024.3.30T2简单题2024.4.1T3木棍AGC059EGrid3-coloring2024.4.2T1斩首(Gym104901F)T3战争2024.4.5T3Text2024.4.7CF1707DPartialVirtualTreesCF1874EJellyfishandHack2024.3.30T2......
  • 2024.4.7
    2024.4.7【南天寂静亮星少,北落师门赛明灯。】Sunday二月三十<theme=oi-"search">A.填充单词题目描述小C认识很多单词,但是他并不喜欢其中的一些单词。具体地说,如果一个单词包含连续的3个元音字母,或连续的3个辅音字母,或者1个“L”字母都不包含的话,这个单词是不被小C喜......
  • 2024.4.7 向量化编程AVX/NEON
    基本介绍X86:Intelx86是英特尔公司于1978年推出的16位微处理器;而x86泛指一系列基于Intel8086且向后兼容的中央处理器指令集架构IntelICC和开源的GCC编译器支持SSE/AVX指令的C语言接口(intrinsic,内置函数),在intrinsic.h头文件中(头文件可能有所不同)函数命名:第一部分:mm/mm256......