B题

思路

因为
\[
x=\sum\limits_{k=1}^{n}ka_k\\
y=\sum\limits_{k=1}^{n}ka_{k}^{2}
\]
我们设交换前和交换后的这两个等式的值设为\(x_1,y_1,x_2,y_2\),现在我们开始愉快的推公式
\[
\begin{aligned}
&x_1-x_2=(i-j)(a_i-a_j)&\\
&y_1-y_2=(i-j)(a_i^2-a_j^2)&\\
\Rightarrow &\frac{y1-y2}{x_1-x_2}=a_i-a_j&(1)\\
&j=i-\frac{x_1-x_2}{a_i-a_j}&(2)
\end{aligned}
\]
然后我们枚举每一个\(i\),根据\((1)(2)\)计算出\(a_j\)和\(j\)然后判断现在在\(j\)这个位置上的值是不是你算出来的这个\(a_j\),是就答案加一否则答案不变。

#include <bits/stdc++.h>
using namespace std;

#define bug printf("********\n")
#define FIN freopen("in.txt","r",stdin)
#define debug(x) cout<<"["<<x<<"]"<<endl

typedef long long LL;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;

int t, n;
LL x, y, b[maxn], cnt[maxn];

int main() {
#ifndef ONLINE_JUDGE
    FIN;
#endif // ONLINE_JUDGE
    scanf("%d", &t);
    while(t--) {
        scanf("%d%lld%lld", &n, &x, &y);
        LL xx = 0, yy = 0;
        for(int i = 1; i <= n; ++i) {
            scanf("%lld", &b[i]);
            cnt[b[i]]++;
            xx += b[i] * i;
            yy += b[i] * b[i] * i;
        }
        LL dx = xx - x, dy = yy - y;
        LL ans = 0;
        if(dx == 0 && dy == 0) {
            for(int i = 1; i <= n; ++i) {
                ans += cnt[b[i]] - 1;
                cnt[b[i]]--;
            }
            printf("%lld\n", ans);
            for(int i = 1; i <= n; ++i) cnt[b[i]] = 0;
            continue;
        }
        if(dx == 0 || dy == 0 || dy % dx) {
            printf("0\n");
            for(int i = 1; i <= n; ++i) cnt[b[i]] = 0;
            continue;
        }
        LL num = dy / dx;
        for(int i = 1; i <= n; ++i) {
            if(num - b[i] <= 0) continue;
            LL num1 = b[i], num2 = num - num1;
            if(num1 == num2 || dx % (num1 - num2) != 0) continue;
            LL pos = i - dx / (num1 - num2);
            if(pos >= 1 && pos < i && b[pos] == num2) ans++;
        }
        printf("%lld\n", ans);
        for(int i = 1; i <= n; ++i) cnt[b[i]] = 0;
    }
    return 0;
}

E题

思路

线段树,对于每个点它是否修改取决于在原序列是否有比它大的数或者比它大的数进行过操作。

代码实现如下

#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;

#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("in","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)

const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;

int t, n;
int a[maxn], num[maxn];
vector<int> v;

struct node {
    int l, r, sum;
}segtree[maxn<<2];

int getid(int x) {
    return lower_bound(v.begin(), v.end(), x) - v.begin() + 1;
}

void push_up(int rt) {
    segtree[rt].sum = segtree[lson].sum + segtree[rson].sum;
}

void build(int rt, int l, int r) {
    segtree[rt].l = l, segtree[rt].r = r;
    segtree[rt].sum = 0;
    if(l == r) return;
    int mid = (l + r) >> 1;
    build(lson, l, mid);
    build(rson, mid + 1, r);
}

void update(int rt, int pos) {
    if(segtree[rt].l == segtree[rt].r) {
        segtree[rt].sum++;
        return;
    }
    int mid = (segtree[rt].l + segtree[rt].r) >> 1;
    if(pos <= mid) update(lson, pos);
    else update(rson, pos);
    push_up(rt);
}

int query(int rt, int l, int r) {
    if(segtree[rt].l == l && segtree[rt].r == r) {
        return segtree[rt].sum;
    }
    int mid = (segtree[rt].l + segtree[rt].r) >> 1;
    if(r <= mid) return query(lson, l, r);
    else if(l > mid) return query(rson, l, r);
    else return query(lson, l, mid) + query(rson, mid + 1, r);
}

int main() {
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &n);
        v.clear();
        priority_queue<pii> q;
        for(int i = 1; i <= n; ++i) {
            scanf("%d", &a[i]);
            num[i] = 0;
            v.push_back(a[i]);
            q.push({a[i], i});
        }
        sort(v.begin(), v.end());
        v.erase(unique(v.begin(), v.end()), v.end());
        build(1, 1, v.size() + 1);
        for(int i = 1; i <= n; ++i) {
            num[i] = query(1, getid(a[i]) + 1, v.size() + 1);
            update(1, getid(a[i]));
        }
        int x;
        int ans = 0, las = 0;
        build(1, 1, v.size() + 1);
        while(!q.empty()) {
            int x = q.top().second; q.pop();
            if(num[x] || query(1, getid(a[x]) + 1, v.size() + 1)) {
                ans++;
                update(1, getid(a[x]));
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

F题

思路

暴力模拟即可。

代码实现如下

#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;

#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("in","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)

const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;

int t;
vector<char> v;
char s[105];
set<char> st;

int main() {
    scanf("%d", &t);
    st.insert({'a', 'e', 'i', 'y', 'o', 'u'});
    while(t--) {
        scanf("%s", s);
        v.clear();
        int len = strlen(s), flag = 0;
        for(int i = 0; i < len; ++i) {
            if(!st.count(s[i])) v.push_back(s[i]), flag = 1;
            else if(!flag) v.push_back(s[i]), flag = 1;
        }
        for(int i = 0; i < (int)v.size(); ++i) {
            printf("%c", v[i]);
        }
        printf("\n");
    }
    return 0;
}

G题

思路

暴力判断。

代码实现如下

#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;

#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("in","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)

const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;

int t, n;

bool check(int x) {
    return x % 7 == 0 && x % 4 != 0;
}

int main() {
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &n);
        while(!check(n)) n++;
        printf("%d\n", n);
    }
    return 0;
}

H题

思路实现如下

暴力枚举每个点删除会对答案的影响,然后对所有情况取最小值。

代码实现如下

#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;

#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("in","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)

const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;

int t, n;
int a[maxn];

int main() {
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &n);
        for(int i = 0; i <= n + 1; ++i) {
            a[i] = inf;
        }
        for(int i = 1; i <= n; ++i) {
            scanf("%d", &a[i]);
        }
        int sum = 0;
        for(int i = 2; i < n; ++i) {
            if(a[i] > a[i-1] && a[i] > a[i+1]) {
                sum++;
            }
        }
        int ans = sum;
        for(int i = 1; i <= n; ++i) {
            int num = 0;
            if(a[i] > a[i-1] && a[i] > a[i+1]) {
                num++;
                if(i >= 2 && a[i-1] > a[i-2] && a[i-1] > a[i+1]) num--;
                if(i <= n - 2 && a[i+1] > a[i+2] && a[i+1] > a[i-1]) num--;
            } else {
                if(i >= 2) {
                    if(a[i-1] > a[i-2] && a[i-1] > a[i]) num++;
                    if(a[i-1] > a[i-2] && a[i-1] > a[i+1]) num--;
                }
                if(i <= n - 2) {
                    if(a[i+1] > a[i] && a[i+1] > a[i+2]) num++;
                    if(a[i+1] > a[i+2] && a[i+1] > a[i-1]) num--;
                }
            }
            ans = min(ans, sum - num);
        }
        printf("%d\n", ans);
    }
    return 0;
}

I题

思路

从\(4\)的倍数往上每四个数异或后都会是\(0\),因此对\(a\)和\(b\)枚举到在\([a,b]\)间离它们最近的\(4\)的倍数,然后把这中间的数进行异或即可。

代码实现如下

import java.util.*;
import java.math.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while(t-- != 0) {
            BigInteger a = sc.nextBigInteger();
            BigInteger b = sc.nextBigInteger();
            int ans = 0;
            while(!a.mod(BigInteger.valueOf(3)).equals(BigInteger.ZERO) && a.compareTo(b) <= 0) {
                ans++;
                a = a.add(BigInteger.ONE);
            }
            while(!b.mod(BigInteger.valueOf(3)).equals(BigInteger.ZERO) && b.compareTo(a) > 0) {
                ans++;
                b = b.subtract(BigInteger.ONE);
            }
            System.out.println(ans % 2);
        }
        sc.close();
    }
}
T = eval(input())
while(T):
    T -= 1
    a, b = map(int, input().split())
    ans = 0
    while(a % 3 != 0 and a <= b):
        ans += 1
        a += 1
    while(b % 3 != 0 and b > a):
        ans += 1
        b -= 1
    print(ans % 2)

J题

思路

我们先用并查集来维护联通块,为了保持字典序最小,我们从小到大将每个联通块取一个数放进优先队列,然后跑\(bfs\)即可。

代码实现如下

#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;

#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("in","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)

const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;

int t, n, m, x, y;
vector<int> G[maxn];
priority_queue<int> q;
int fa[maxn], vis[maxn], pp[maxn];

int fi(int x) {
    return fa[x] == x ? x : fa[x] = fi(fa[x]);
}

void mer(int x, int y) {
    int p1 = fi(x), p2 = fi(y);
    if(p1 == p2) return;
    if(p1 < p2) {
        fa[p2] = p1;
    } else {
        fa[p1] = p2;
    }
}

int main() {
#ifndef ONLINE_JUDGE
    FIN;
#endif
    scanf("%d", &t);
    while(t--) {
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; ++i) {
            fa[i] = i;
            pp[i] = vis[i] = 0;
            G[i].clear();
        }
        for(int i = 1; i <= m; ++i) {
            scanf("%d%d", &x, &y);
            G[x].push_back(y);
            G[y].push_back(x);
            mer(x, y);
        }
        while(!q.empty()) q.pop();
        for(int i = 1; i <= n; ++i) {
            int p = fi(i);
            if(pp[p]) continue;
            q.push(-p);
            pp[p] = 1;
        }
        printf("%d\n", (int)q.size());
        int flag = 0;
        while(!q.empty()) {
            int u = -q.top(); q.pop();
            if(vis[u]) continue;
            if(flag) printf(" ");
            flag = 1;
            printf("%d", u);
            vis[u] = 1;
            for(int i = 0; i < (int)G[u].size(); ++i) {
                int v = G[u][i];
                if(vis[v]) continue;
                q.push(-v);
            }
        }
        printf("\n");
    }
    return 0;
}

K题

思路

这题我们分两种情况进行分析:
\(1.s==t:\)这种情况我们可以用\(manacher\)将\(s\)中的所有回文子串数计算出来;
\(2.s!=t:\)这种情况我们先找到\(s\)中与\(t\)不相同的最左最右的端点,然后判断这一段能否翻转使得\(s==t\),不能答案就是\(0\),否则就枚举这个区间能够向外延伸多远。

代码实现如下

#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;

#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("in.txt","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)

const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;

int t, n;
LL x, y, xx, yy, b[maxn];
map<LL, int> cnt;

int main() {
#ifndef ONLINE_JUDGE
    FIN;
#endif
    scanf("%d", &t);
    while(t--) {
        scanf("%d%lld%lld", &n, &x, &y);
        xx = yy = 0;
        cnt.clear();
        for(int i = 1; i <= n; ++i) {
            scanf("%lld", &b[i]);
            xx += b[i] * i;
            yy += b[i] * b[i] * i;
            cnt[b[i]]++;
        }
        LL ans = 0;
        if(x != xx) {
            if((y - yy) % (x - xx) != 0) {
                printf("0\n");
                continue;
            }
            LL num = (y - yy) / (x - xx);
            for(int i = 1; i <= n; ++i) {
                LL num1 = b[i], num2 = num - b[i];
                if(num1 == num2) continue;
                LL tmp = num1 - num2;
                if((x - xx) % tmp != 0) continue;
                LL j = (x - xx) / tmp;
                LL pos = i + j;
                if(pos >= 1 && pos <= n && b[pos] == num2) ans++;
            }
            printf("%lld\n", ans/2);
        } else {
            if(y == yy) {
                for(int i = 1; i <= n; ++i) {
                    ans += cnt[b[i]] - 1;
                    cnt[b[i]]--;
                }
            }
            printf("%lld\n", ans);
        }
    }
    return 0;
}

The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple (Mirror)的更多相关文章

  1. The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - L Doki Doki Literature Club

    Doki Doki Literature Club Time Limit: 1 Second      Memory Limit: 65536 KB Doki Doki Literature Club ...

  2. 2018浙江省赛(ACM) The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple

    我是铁牌选手 这次比赛非常得爆炸,可以说体验极差,是这辈子自己最脑残的事情之一. 天时,地利,人和一样没有,而且自己早早地就想好了甩锅的套路. 按理说不开K就不会这么惨了啊,而且自己也是毒,不知道段错 ...

  3. The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored E.Sequence in the Pocket(思维题)

    传送门 题意: 给出一个序列,你可以将任意一个数移到最前面: 求最少需要移动多少次,可以是此序列变成非递减序列: 思路: 定义 (ai,aj) 为逆序对 ( i < j , ai > aj ...

  4. The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored(E F G H I)

    http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId=392 E:Sequence in the Pocket 思路:从 ...

  5. The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - F 贪心+二分

    Heap Partition Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge A sequence S = { ...

  6. The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - C 暴力 STL

    What Kind of Friends Are You? Time Limit: 1 Second      Memory Limit: 65536 KB Japari Park is a larg ...

  7. The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - M Lucky 7

    Lucky 7 Time Limit: 1 Second      Memory Limit: 65536 KB BaoBao has just found a positive integer se ...

  8. The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - J CONTINUE...?

    CONTINUE...? Time Limit: 1 Second      Memory Limit: 65536 KB      Special Judge DreamGrid has  clas ...

  9. The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - B King of Karaoke

    King of Karaoke Time Limit: 1 Second      Memory Limit: 65536 KB It's Karaoke time! DreamGrid is per ...

随机推荐

  1. [转]Gnome桌面的录屏插件easyscreencast

    原文地址:https://www.linuxprobe.com/gnome-easyscreencast.html

  2. centos7如何将docker容器配置成开机自启动

    docker 服务器开机自启动: 1.systemctl is-enabled docker.service  检查服务是否开机启动 2.systemctl enable docker.service ...

  3. codesmith设置mysql的连接字符串

    .net core,codesmith连不上 server=192.168.3.240;Initial Catalog=tpmdb;User=root;Password=root .net frame ...

  4. js生成条形码——JsBarcode

    原文地址:https://www.cnblogs.com/huangenai/p/6347607.html 介绍一下在GitHub生成条形码的js插件→JsBarcode 条码支持的有: CODE12 ...

  5. Android MVP模式简单介绍:以一个登陆流程为例

    老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚.简洁,流程更加清晰,对于后续版本迭代维护都挺方便.对于一些想要学习MVP模式的同学来讲,百度搜出来 ...

  6. vue中ref在input中详解

    当我们在项目中遇见文本输入框的时候,获取时刻输入框中的值 1.v-model <template> <input type="text" v-model=&quo ...

  7. 为何一个@LoadBalanced注解就能让RestTemplate拥有负载均衡的能力?【享学Spring Cloud】

    每篇一句 你应该思考:为什么往往完成比完美更重要? 前言 在Spring Cloud微服务应用体系中,远程调用都应负载均衡.我们在使用RestTemplate作为远程调用客户端的时候,开启负载均衡极其 ...

  8. vs2017- C语言- winsocket- 链接错误 LNK2019

    错误介绍 操作系统:windows10 IDE:vs2017 语言:C语言 项目内容简介:编写一个双人网络海战棋对战游戏 错误类型:链接错误 LNK2019 解决方案:程序需要用到ws2_32.lib ...

  9. 《JAVA高并发编程详解》-volatile和synchronized

  10. Huber Loss 介绍

    Huber Loss 是一个用于回归问题的带参损失函数, 优点是能增强平方误差损失函数(MSE, mean square error)对离群点的鲁棒性. 当预测偏差小于 δ 时,它采用平方误差,当预测 ...