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;
}
相关推荐
橘子汽水1681 天前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子1 天前
Adaboost算法原理与计算实例
算法
别怪我很水1 天前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法
Re.不晚1 天前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
蓝悦无人机1 天前
《Planning algorithms》读书笔记——第1章 引言
算法·读书笔记·规划算法·lavalle
Sagittarius_A*1 天前
分组密码基础(二):Feistel 结构与 DES 的设计思想
算法·信息安全·密码学·des·数论
青山木1 天前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
alexwang2111 天前
HDU 4348 详细题解
c++·算法·题解·hdu·主席树·可持久化数据结构·可持久化线段树
可编程芯片开发1 天前
基于分段变步长搜索RMDCFT算法的天基雷达空间机动目标检测方法MATLAB仿真,对比RMDCFT算法
算法