A:https://codeforces.com/contest/617/problem/A

题意:

水题,一只大象一次能走1,2,3,4,5步,问你到达n最少需要几步,大象初始在0位置。

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 100010;
int main()
{
    int x;
    scanf("%d",&x);
    int k = x%5;
    if(k){
        cout<<x/5+1<<endl;
    }else{
        cout<<x/5<<endl;
    }
    return 0;
}

B:https://codeforces.com/contest/617/problem/B

题意:

给出n个木棒,每个木棒只能是1或者是0,问你一共有多少种方法可以分割成每一组都是有且仅一根为1的木棒,输出分割的方法数

题解:

组合相乘,就是每俩个1间距相乘,注意也有全为0的样例,得输出0

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 100010;
int a[110],b[110];
int main()
{
    int n,cnt = 0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i] == 1){
            b[++cnt] = i;
        }
    }
    if(cnt == 0){
        printf("0\n");
        return 0;
    }
    ll ans = 1;
    for(int i=2;i<=cnt;i++){
        ans *= 1ll*(b[i] - b[i-1]);
    }
    printf("%lld\n",ans);

    return 0;
}

C:https://codeforces.com/contest/617/problem/C

题意:

给出俩个点代表俩个喷泉,让你构造俩个喷泉的半径r1和r2,要求每一朵花都要被浇灌到,输出最小的r1^2+r2^2

题解:

将其中一维排序,然后另外一维直接取剩下的最大值就好了

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
    ll l1,l2;
};
node a[2010];
bool cmp(node p1,node p2){
    if(p1.l1 == p2.l1)
        return p1.l2 < p2.l2;
    return p1.l1 < p2.l1;
}

ll n,x1,x2,yy,y2;
ll x[2010],y[2010];
ll pre[2010];
int main()
{
    scanf("%lld%lld%lld%lld%lld",&n,&x1,&yy,&x2,&y2);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld",&x[i],&y[i]);
        a[i].l1 = 1ll*abs((x1 - x[i])*(x1 - x[i]) + (yy - y[i])*(yy - y[i]));
        a[i].l2 = 1ll*abs((x2 - x[i])*(x2 - x[i]) + (y2 - y[i])*(y2 - y[i]));
    }

    sort(a+1,a+1+n,cmp);
    for(int i=n;i>=1;i--)
        pre[i] = max(pre[i+1],a[i].l2);
    ll ans = pre[1];
    for(int i=1;i<=n;i++)
        ans = min(ans,a[i].l1 + pre[i+1]);

    printf("%lld\n",ans);
    return 0;
}

D:https://codeforces.com/contest/617/problem/D

题意:

给你三个点,问你最少用多少条线段将这三个点连一起。

题解:

讨论多种情况
1.3个点共线 ,输出1
2.2个点共线 ,如果第三个点在共线俩个点的外部,输出2,否则输出3
3.无共线 ,输出2

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
    int x,y;
}a[4];
bool cmp1(node p1,node p2){
    return p1.x < p2.x;
}
bool cmp2(node p1,node p2){
    return p1.y < p2.y;
}
int main()
{
    for(int i=1;i<=3;i++){
        scanf("%d%d",&a[i].x,&a[i].y);
    }
    if((a[1].x == a[2].x && a[1].x == a[3].x) || (a[1].y == a[2].y && a[1].y == a[3].y)){
        cout<<"1"<<endl;
        return 0;
    }
    sort(a+1,a+1+3,cmp1);
    for(int i=2;i<=3;i++){
        if(a[i].x == a[i-1].x){
            int maxx = max(a[i].y , a[i-1].y);
            int minn = min(a[i].y , a[i-1].y);
            if(i == 2){
                if(a[3].y < maxx && a[3].y > minn){
                    cout<<"3"<<endl;
                    return 0;
                }
                cout<<"2"<<endl;
                return 0;
            }else{
                if(a[1].y < maxx && a[1].y > minn){
                    cout<<"3"<<endl;
                    return 0;
                }
                cout<<"2"<<endl;
                return 0;
            }
        }
    }
    sort(a+1,a+1+3,cmp2);
    for(int i=2;i<=3;i++){
        if(a[i].y == a[i-1].y){
            int maxx = max(a[i].x , a[i-1].x);
            int minn = min(a[i].x , a[i-1].x);
            if(i == 2){
                if(a[3].x < maxx && a[3].x > minn){
                    cout<<"3"<<endl;
                    return 0;
                }
                cout<<"2"<<endl;
                return 0;
            }else{
                if(a[1].x < maxx && a[1].x > minn){
                    cout<<"3"<<endl;
                    return 0;
                }
                cout<<"2"<<endl;
                return 0;
            }
        }
    }
    cout<<"3"<<endl;
    return 0;
}

E:https://codeforces.com/contest/617/problem/E

题意:

模板题,给出长度为n的数组,每次询问l到r区间上有多少[L,R]满足异或和 = k

莫队

代码:

#include <bits/stdc++.h>
using namespace std;
using namespace std;
typedef long long ll;
typedef long double ld;
const double eps = 1e-6;
const double PI = acos(-1);
const int mod = 1000000000 + 7;
const int INF = 0x3f3f3f3f;
const int seed = 131;
const ll INF64 = ll(1e18);
const int maxn = 1e6*2 + 10;
int T,n,m,k;
int pos[maxn];  /// 每个数所在的块, 用来排序
ll ans[maxn];   /// 每个询问的答案
ll cnt[maxn];   /// 每个前缀和出现的次数
ll Ans;         /// 当前的答案
int L, R;       /// 当前区间
int a[maxn];    /// 前缀异或值
struct node {
    int l, r, id;
    node(int l=0, int r=0, int id=0):l(l), r(r), id(id) {}
    bool operator < (const node& rhs) const {
        if(pos[l] == pos[rhs.l]) return r < rhs.r;
        else return pos[l] < pos[rhs.l];
    }
}Q[maxn];
inline void add(int x) {
    Ans += cnt[a[x]^k];
    cnt[a[x]]++;
}
inline void del(int x) {
    cnt[a[x]]--;
    Ans -= cnt[a[x]^k];
}
int main() {
    scanf("%d%d%d", &n, &m, &k);
    int sz = sqrt(n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        a[i] ^= a[i-1];
        pos[i] = i / sz;
    }
    for(int i = 1; i <= m; i++) {
        scanf("%d%d", &Q[i].l, &Q[i].r);
        Q[i].id = i;
    }
    sort(Q+1, Q+m+1);
    L = 1, R = 0, Ans = 0;
    cnt[0] = 1;
    for(int i = 1; i <= m; i++) {
        while(L < Q[i].l) {
            del(L-1);
            L++;
        }
        while(L > Q[i].l) {
            L--;
            add(L-1);
        }
        while(R < Q[i].r) {
            R++;
            add(R);
        }
        while(R > Q[i].r) {
            del(R);
            R--;
        }
        ans[Q[i].id] = Ans;
    }
    for(int i = 1; i <= m; i++) {
        printf("%I64d\n", ans[i]);
    }
    return 0;
}