Codeforces Round 1093 (Div. 2)vp补题

原题连接

B 取模 模拟 找规律

cpp 复制代码
void solve(){
    int n,m;cin>>n>>m;
    vector<int>a(n+1);
    forr(i,1,n){
        cin>>a[i];
    }
    // forr(i,1,n)cout<<(a[i]+i)%m<<' ';cout<<endl;
    int fg=0;
    forr(i,1,n)if((a[i]+i)%m==0){
        fg=1;
        break;
    }
    if(!fg)yes;
    else{
        /*
        注意时机 每秒末移动 每秒初判定 所以要想前进 相邻两格在这一秒都不能为0
        如果数组的一段总会有一个(a_i+x)%m=0 那这一段一定过不去
        得出结论 连续相同的数 长度>=m 那这一段每秒都一定有一个障碍 过不去
        */
        int len=1,mx=0;
        forr(i,2,n){
            if(a[i]!=a[i-1])mx=max(mx,len),len=1;
            else len++;
        }
        mx=max(mx,len);
        // cout<<mx<<endl;
        if(mx>=m)no;
        else yes;
    }
}

C 思维 数学

参考@qwqohO_Ohoqwq的题解
性质:

用所有的拼块,不能重叠: p + 2 q = n ( m + 1 ) + m ( n + 1 ) p+2q=n(m+1)+m(n+1) p+2q=n(m+1)+m(n+1)

L型的有一横一竖,线段可横可竖,横竖边分别满足

  • 所有横边 H = m ( n + 1 ) = p h + q H=m(n+1)=p_h+q H=m(n+1)=ph+q
  • 所有纵边 V = n ( m + 1 ) = p v + q V=n(m+1)=p_v+q V=n(m+1)=pv+q

H − V = p h − p v = m − n H-V=p_h-p_v=m-n H−V=ph−pv=m−n

柯西定理 ∣ p h − p v ∣ = ∣ m − n ∣ ≤ p h + p v = p |p_h-p_v|=|m-n|\leq p_h+p_v=p ∣ph−pv∣=∣m−n∣≤ph+pv=p
凑数:
p + 2 q = n ( m + 1 ) + m ( n + 1 ) = 2 m n + n + m p+2q=n(m+1)+m(n+1)=2mn+n+m p+2q=n(m+1)+m(n+1)=2mn+n+m

令 t = p + 2 q t=p+2q t=p+2q
t = 2 m n + n + m t=2mn+n+m t=2mn+n+m
2 t + 1 = 4 m n + 2 n + 2 m + 1 = ( 2 n + 1 ) ( 2 m + 1 ) 2t+1=4mn+2n+2m+1=(2n+1)(2m+1) 2t+1=4mn+2n+2m+1=(2n+1)(2m+1)分解为两个奇数

cpp 复制代码
void solve(){
    int p,q;cin>>p>>q;
    int t=p+2*q;
    int sm=2*t+1,sq=sqrt(sm);
    int n,m;
    // cout<<"ans";
    for(int a=1;a<=sq;a+=2){
        if(sm%a==0){
            int b=sm/a;
            n=(a-1)/2,m=(b-1)/2;
            if(n*(m+1)+m*(n+1)==p+2*q&&abs(n-m)<=p){
                return cout<<n<<' '<<m<<endl,void();
            }
        }
    }
    cout<<-1<<endl;
}

D 二分 交互题 对答案的奇偶性贡献规律


思路参考@RoBin05

cpp 复制代码
bool ask(int l,int r){
	cout<<"? "<<r-l+1<<' ';
	forr(i,l,r)cout<<i<<' ';cout<<endl;
	fls;
	int ans;
	cin>>ans;
	return ((ans^(r-l+1))&1);
}
int ask(int l,int r,int p){
	cout<<"? "<<r-l+2<<' '<<p<<' ';
	forr(i,l,r)cout<<i<<' ';cout<<endl;
	fls;
	int ans;
	cin>>ans;
	return ((ans^(r-l+2))&1);
}
void solve(){
	int n;cin>>n;
	int l=1,r=2*n+1;
	/*
		询问部分的数 有三种情况
		出现次数cnt=1 对询问长度贡献1 对答案贡献1
		cnt=2 +2 +0
		cnt=3 +3 +0 
		发现要找的cnt=3 对询问长度和答案的贡献 奇偶性不同
		所以询问长度和得到回答 奇偶性不同 询问中包含cnt=3部分

		找cnt=3 右左中三点 3*log(1e3)=10 <=33
	*/
	// 找包含cnt=3的右端
	int rp;
	while (l<=r)
	{
		int mid=(l+r)>>1;
		if(ask(1,mid))rp=mid,r=mid-1;// 奇偶性不同 包含cnt=3
		else l=mid+1;
	}
	// 左端
	int lp;
	l=1,r=rp;
	while (l<=r)
	{
		int mid=(l+r)>>1;
		if(ask(mid,rp))lp=mid,l=mid+1;
		else r=mid-1;;
	}
	// 中间
	int mp;
	l=lp+1,r=rp;
	while (l<=r)
	{
		int mid=(l+r)>>1;
		if(ask(mid,rp,lp))mp=mid,l=mid+1;
		else r=mid-1;
	}
	cout<<"! "<<lp<<' '<<mp<<' '<<rp<<endl;
}
相关推荐
算法即正义2 小时前
知识竞赛音乐推荐:从开场抢答到颁奖环节的背景音乐选择指南
算法·职场和发展·学习方法
RTC老炮2 小时前
音视频FEC前向纠错算法Reed-Solomon原理分析
网络·算法·架构·音视频·webrtc
噜噜噜噜鲁先森2 小时前
STL——String类
开发语言·c++·算法
Severus_black2 小时前
算法题C——用队列实现栈/用栈实现队列
c语言·数据结构·算法·链表
谭欣辰2 小时前
详细讲解 C++ 有向无环图(DAG)及拓扑排序
c++·算法·图论
承渊政道2 小时前
【递归、搜索与回溯算法】(掌握记忆化搜索的核心套路)
数据结构·c++·算法·leetcode·macos·动态规划·宽度优先
闻缺陷则喜何志丹2 小时前
【 线性筛 调和级数】P7281 [COCI 2020/2021 #4] Vepar|普及+
c++·算法·洛谷·线性筛·调和级数
zzzsde2 小时前
【Linux】线程概念与控制(1)线程基础与分页式存储管理
linux·运维·服务器·开发语言·算法
穿条秋裤到处跑2 小时前
每日一道leetcode(2026.04.23):等值距离和
算法·leetcode·职场和发展