CF1208(div1+div2)总题解

我又打了一个猝死场....

不过猝死倒是没有,就是自闭了.....

1522713-20190826093833991-1154705587.png

自闭过程如下:

当L_Y_T刚刚做完A,B打了一半时........

kr : 您C题会做嘛?

L_Y_T : 还没看啊

kr : wucstdio 切到D题了.....
___

A

仔细考虑一下就会发现,这个玩意是三个一循环的,然后就是sb题了

#include <bits/stdc++.h>
#define int long long
using namespace std ;
int T ;
signed main () {
    cin >> T ;
    while(T--) {
        int n , a , b ;
        cin >> a >> b >> n ;
        int c = n%3 ;
//      cout << c <<endl ;
        if(c == 2) {
            cout << (a^b) << endl ;
        }else if(c == 0) {
            cout << a <<endl ;
        }else {
            cout << b << endl ;
        }
    }
    return 0 ;
} 

1522713-20190826094036612-1252289803.png


B

离散化一下,用桶一存,然后二分

题解思路:删除子段后,前缀和后缀保持不变,可能长度为0.让我们修复不包含任何重复元素的前缀,并找到我们可以获得的最大后缀而不重复元素。我们可以使用map / set来跟踪元素。

#include<bits/stdc++.h>
#define int long long
#define maxn 2010 
 
using namespace std ;
 
int n , num[maxn] ;
struct Node{
    int lop , data ;
}LS[maxn] ;
bool cmp(Node x,Node y){
    return x.data < y.data;
}
int Tong[maxn][maxn] ;
bool check(int Lenth) {
    int flag = 1 ;
    for (int l = 1 ; l + Lenth - 1 <= n ; l ++) {
        int r = l + Lenth - 1 ;
        bool F = 1 ;
        for(int j = 1 ; j <= n ; j ++) {
            if(Tong[n][j] - Tong[r][j] + Tong[l-1][j] > 1) { F = 0 ; break; }
        }
        if(F) return true ;
    }
    return false ;
}
signed main() {
    cin >> n ;
    for(int i = 1 ; i <= n ; i ++) { cin >> LS[i].data; LS[i].lop=i; }
    sort(LS+1,LS+1+n,cmp);
    int idx = 0 ;
    LS[0].data = -1 ;
    for(int i = 1 ; i <= n ; i ++){
        if(LS[i].data != LS[i-1].data)
            num[LS[i].lop] = ++idx ;
        else
            num[LS[i].lop] = idx ;
    }
    for(int i = 1  ; i <= n ;  i ++) {
        for(int j = 1 ; j <= n ; j ++)
            Tong[i][j] = Tong[i-1][j];
        Tong[i][num[i]]++ ;
    }
    int l = 0 , r = n ;
    while(l <= r) {
        int mid = (l+r) / 2 ;
        if(check(mid))
            r = mid - 1 ;
        else
            l = mid +  1 ;
    }
    cout<< l <<endl ;
    return 0;
}

1522713-20190826093929137-1722951021.png


C

这道题我是真的不会啊QAQ

我就一句话....

张老板 NB


思路

把这个n*n的玩意分成四个象限,然后先填充第一象限的,再分别复制到二三四象限,然后为了避免重复分别加123,完结撒花

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxn 1010
using namespace std ;
int a[maxn][maxn] , n ;
int main() {
    cin >> n ;
    int tot = 0 ;
    for(int i = 1 ; i <= n/2 ; i ++) {
        for(int j = 1 ; j <= n/2 ; j ++,tot ++) {
            a[i][j] = tot*4 + 1 ;
            a[i][j+n/2] = tot*4 + 2 ;
            a[i+n/2][j] = tot*4+3 ;
            a[i+n/2][j+n/2] = tot*4 ;
        }
    }
    for(int i = 1 ; i <= n ; i ++) {
        for(int j = 1 ; j <= n ; j ++) {
            cout << a[i][j] << " " ;
        }
        puts("") ;
    }
    return 0 ;
} 

1522713-20190826103628705-1170857423.gif

1522713-20190826103633674-254847550.jpg

1522713-20190826103637834-1299609239.gif

溜了溜了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值