Codeforces Round #803 (Div. 2)vp

A XOR Mixup

长度为 1 的数列中,有一个数是其他数 X O R XOR XOR 来, 问这个数是多少

随便输出数列中的一个数就行

Code

void solve(){
    int n;cin>>n;
    vector<int> a(n+1);
    int ans = 0;
    forr(i,1,n) cin >> a[i];
    cout << a[1] << endl;
}

B Rising Sand

当 m = 1 时, 最大的数量就是 ( n − 1 ) / 2 (n-1)/2 (n1)/2;
m > 1 时,最大数量就是原数列 t o o   t a l l too\ tall too tall 的个数;

Code

void solve(){
    int n,m;
    cin>>n>>m;
    vector<int> a(n+1);
    forr(i,1,n) cin >> a[i];
    if(m == 1){
        int res = (n-1)/2;
        cout << res << endl;
    }
    else{
        int res = 0;
        forr(i,2,n-1){
            if(a[i] > a[i-1]+a[i+1]) res++;
        }
        cout << res << endl;
    }
}

C 3SUM Closure

当正数个数或负数个数 >= 3 时,必定不符合条件,输出 no;
当0的个数大于0时,最多有一正一负且枚举1个0即可,否则输出 no;
故,满足条件的数组元素个数最多是4个 O ( n 3 ) O(n^3) O(n3) 枚举即可

Code

void solve(){
    int n;
    cin>>n;
    map<int,int> mp;
    vector<int>v;
    int t = 0;
    int a =  0, b = 0;
    forr(i,1,n){
        int x;cin>>x;
        mp[x] = 1;
        if(x>0)a++,v.push_back(x);
        else if(x<0)b++,v.push_back(x);
        else t++;
    }
    if(t) v.push_back(0);
    if(a>=3||b>=3){
        puts("no");
        return;
    }
  forr(i,0,v.size()-1)
      forr(j,i+1,v.size()-1)
      	forr(k,j+1,v.size()-1){
        	int g = 0;
        	if(mp[v[i]+v[j]+v[k]]){
            	g = 1;
        	}
        	if(!g){
            	puts("no");
            	return ;
        	}
    	}
    puts("yes");
}

D Fixed Point Guessing

交互题

发现 l o g 1 e 4 ≈ 14 log^{1e4} ≈ 14 log1e414 考虑二分答案
对于区间 [ l , r ] [l,r] [l,r] 内的数有两种情况
值在 [ l , r ] [l,r] [l,r]范围内或者不在
值在区间[l,r]范围内的数也有两种情况
一种是与[l,r]内的值 s w a p swap swap,因而成对存在
另一种是在原位置
故对于[l,r]
若在这个范围内的数的个数为偶数,说明都是进行了 s w a p swap swap 操作
那么答案一定不在这个区间里,二分搜另一个区间

Code

vector<int> ask1(int l,int r){
    cout  << '?' <<" " << l << " " << r << endl;
    vector<int> v;
    forr(i,1,r-l+1){
        int x;
        cin>>x;
        v.push_back(x);
    }
    return v;
}
bool check(vector<int> x,int l, int r){
    int cnt = 0;
    for(auto i:x){
        if(i >=  l && i <= r) cnt++;
    }
    if(cnt%2==0) return 0;
    return 1;
}
void solve(){
    int n;
    cin >> n;
    int l = 1, r= n;
    int res = 0;
    while(l < r){
        int mid = l + r  >> 1;
        int f = 0;
        vector<int> b;
        b = ask1(l,mid);
        int t =  check(b,l,mid);
        if(t){
            r = mid;
        }
        else{
            l = mid + 1;
        }
    }
    cout << '!' <<" " << l << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值