ABC274 题解

A

题目:给定 A,B 输出 BA 保留 3 位小数。

简答题,和A+B problem 一样,除一除,保留一下小数。

B

题目:给定一个 nm 列由'.'和'#'的方阵,求每列有多少个 '#'(n,m1000 )。

暴力遍历每一行进行统计。

C

题目:给定 N 个数的数列 A,开始时有 1 只变形虫,第 i 时刻时,第 i 只变形虫会变化为 2i2i+1 ,定义这两只变形虫的亲代为 Ai,求每只变形虫距离 1 号虫间隔几代,对 2N+1 只虫输出答案 (N2×105)。

按题意模拟即可,注意可能亲代编号比当前的大,用搜索实现。

D

题目:给定数列 A 以及 x,y 要求判断是否有一个点集满足以下条件(N1000,|x|,|y|104,Ai10 )。

  • P0=(0,0),P1=(A1,0),PN=(x,y)
  • PiPi1 的距离为 Ai
  • Pi1PiPi+190

题目等同与将点 B(0,0) 每次选择一维加减 Ai,最后能否成为 (x,y)
发现当i为奇数时第一维改变,反之第二维。
数据范围较小,对两位分别进行 O(NV) 的dp,定义 fi,j 表示前 i 个点 能否和为 j。转移是平凡的。

E

题目:给定平面直角坐标系上 n 个小镇和 m 个加速站,从 (0,0) 出发,每经过一个加速站就可以使速度乘 2,重复经过加速站无用,求最少时间遍历所有小镇并回到 (0,0)。(n12,m5)

发现 n,m 规模很小考虑状压dp,记录以及经过的位置与当前从哪个位置出发,转移是平凡的。

F

河中有 N 条鱼,每条鱼都有出发位置 xi,速度 vi 以及重量 wi,现在让你在任意时刻选择一段长度为 A 的区间,使得 w 最大。(N2000,xi,vi,wi109)

考虑钦定一条鱼在这个区间的右端点上,正确性显然。现在就有这个区间在第 0 时刻位置。根据其他鱼相对的初始位置与速度计算出每一条鱼进出区间的时刻 (记为 si,ti)。
将鱼以 s 为第一关键字排序,用扫描线把所有鱼可能的在与不在区间的状态遍历并取 max
复杂度为 O(n2logn)

G

给定一个 NM 列的矩形,每个位置上有'.'或'#'。前者表示当前位置为空,后者表示当前位置有障碍。现在可以在空位置放置监控,监控可以监控上下左右四个方向,一个监控只有一个方向,可以看到该方向上没有被障碍遮挡的位置,现在求最少用多少个监控可以覆盖所有的空位置。(N,M300)

下面用 0 指代'.',用 1 指代'#'。
发现最优答案一定可以被以下方式构造:在一个 0 的极长横向连续段的左端放置一个向右监控,在一个 0 的极长纵向连续段顶端放置一个向下的监控。正确性显然。
fi,gi 表示点 i 所在极长横向\纵向 0 连续段的 左端\顶端,发现 fi,gi 必有一个点放置监控。
容易想到二分图最小点覆盖,使用网络流解决,复杂度 O(n3)

Ex

题目:定义函数 S(A,B)={A1B1,A2B2,A3B3AnBn},现在给定一个序列 A,有 q 个询问,每个询问给定 a,b,c,d,e,f,求 S(A(a,b),A(c,d)) 字典序是否严格小于 A(e,f)。(q5×104,n5×105)

首先考虑运算是 + 要怎么做,发现可以预处理出序列的哈希值,然后二分 S(A(a,b),A(c,d)) 与 A(d,e) 的 LCP。
那么我们现在想要一个哈希函数 H(X),满足 H(A,B)=H(A)H(B),并且可以类似地满足"异或乘法"。
考虑使用异或与 Nim 积,即 H(Ai)=H(Ai1)baseAi,其中 表示 Nim 积。
关于 Nim 积可以阅读 这篇这篇 博客。
剩下的内容就是二分了,复杂度为 O(qlog3n)

点击查看代码
#include<bits/stdc++.h>
#define reg register
#define int long long
using namespace std;
inline int read(){
	int k=1,x=0;char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') k=-1; ch=getchar();}
	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-48,ch=getchar();
	return k*x;
}
inline int cmin(reg int x,reg int y){return x<y?x:y;}
const int N=5e5+10;
int n,m,A[N];
#define ull unsigned long long
ull f[300][300],hsh[N],pw[N],base;
mt19937_64 rnd(333);
inline ull Nimp(reg ull x,reg ull y,reg int p){
	if (x<=1||y<=1) return x*y; if (p<8&&f[x][y]) return f[x][y];
	reg ull a=x>>p,b=((1ull<<p)-1)&x,c=y>>p,d=((1ul<<p)-1)&y;
	reg ull bd=Nimp(b,d,p>>1),ac=Nimp(Nimp(a,c,p>>1),1ull<<p>>1,p>>1),res;
	res=((Nimp(a^b,c^d,p>>1)^bd)<<p)^ac^bd;
	if (p<8) return f[x][y]=res; return res;
}
inline ull query(reg int l,reg int r){return hsh[r]^Nimp(hsh[l-1],pw[r-l+1],64);}
signed main(){
	for (reg int i=0;i<256;i++) for (reg int j=0;j<256;j++) f[i][j]=Nimp(i,j,8);
	n=read();m=read();
	for (reg int i=1;i<=n;i++) A[i]=read();
	pw[0]=1,hsh[0]=0,base=rnd();
	for (reg int i=1;i<=n;i++) hsh[i]=Nimp(hsh[i-1],base,64)^A[i],pw[i]=Nimp(pw[i-1],base,64);
	while (m--){reg int a=read(),b=read(),c=read(),d=read(),e=read(),f=read();
	    reg int l=0,r=cmin(b-a+1,f-e+1)+1,ans=0;
		while (l+1<r){ reg int mid=l+r>>1; query(a,a+mid-1)^query(c,c+mid-1)^query(e,e+mid-1)?r=mid:l=mid,ans=mid;} ans=l;
		if (e+ans-1==f) puts("No"); else{
			if (a+ans-1==b||(A[a+ans]^A[c+ans])<A[e+ans]) puts("Yes"); else puts("No");
		}
	}
	return 0; 
}

posted @   Matutino_Lux  阅读(104)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示