2018 Multi-University Training Contest 3 杭电多校第三场

躺了几天 终于记得来填坑了

1001 Ascending Rating   (hdoj 6319)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6319

单调队列 具体有点类似双端队列滑动窗口

题意:在一个队列中 每次都给定一个固定长度的区间 从i=1开始向后移动 每次在这个区间中进行a[i]和a[j]的比较 若a[i]<a[j] count++ 最大值更新为a[j] ,每个区间的最大值和count都分别异或i 求出分别的和

求区间最大值可以比较容易的想到单调队列 在求count的时候 正向求难以在规定的时间内求得 想到的做法是从后往前使用双端队列 因为这题谜之卡常 从头一个队列从尾一个队列 两个队列就超时 将两个都从尾部扫

代码如下

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e7+10;
long long a[maxn],qq[maxn];
int main(){
    int t,n,m,k;
    long long p,q,r,mod;
    scanf("%d",&t);
    while(t--){
        int head=0,tail=0;
        scanf("%d%d%d%lld%lld%lld%lld",&n,&m,&k,&p,&q,&r,&mod);
        for(int i=1;i<=k;i++) scanf("%lld",&a[i]);
        for(int i=k+1;i<=n;i++) a[i]=((a[i-1]*p)%mod+(q*i)%mod+r)%mod;
        for(int i=n;i>=n-m+1;i--){
            while(head<tail&&a[qq[tail-1]]<=a[i]) tail--;
            qq[tail++]=i;
        }
        long long ans=0,cnt=0;
        ans+=a[qq[head]]^(n-m+1);
        cnt+=(tail-head)^(n-m+1);
        for(int i=n-m;i>=1;i--){
            while(qq[head]>i+m-1&&head<tail) ++head;
            while(head<tail&&a[qq[tail-1]]<=a[i]) --tail;
            qq[tail++]=i;
            ans+=a[qq[head]]^i;
            cnt+=(tail-head)^i;
        }
        printf("%lld %lld\n",ans,cnt);
    }
    return 0;
}

1004 Euler Function   (hdoj 6322)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6322

签到题

题意:给出了欧拉函数的定义 求欧拉函数为合数的第k个数是什么

题目说的有点绕 但是看懂了 就是在介绍欧拉函数 在数论中 对于正整数N,少于或等于N ([1,N])  且与N互质的正整数(包括1)的个数 记作φ(n) 即为欧拉函数

这是一题假的数论题 可以打个表找个规律 发现第一个合数为5 第二个为7 之后第三个数就是k+5

代码如下

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>

using namespace std;

int main(){
    int t,k;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&k);
        if(k==1) printf("5\n");
        if(k==2) printf("7\n");
        if(k>=3) printf("%d\n",k+5);
    }
    return 0;
}

1006  Grab The Tree   (hdoj 6324)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6324

签到题

除了异或和为0是平手 其余情况都是先手必胜

代码如下

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
const int maxn = 1e6 + 10;
int a[maxn];

int main(){
    int t, n, u, v, sum;
    scanf("%d", &t);
    while (t--){
        scanf("%d", &n);
        sum = 0;
        for (int i = 0; i < n; i++){
            scanf("%d", &a[i]);
            sum ^= a[i];
        }
        for (int i = 0; i < n-1; i++){
            scanf("%d%d", &u, &v);
        }
        if(sum == 0) printf("D\n");
        else printf("Q\n");
    }
    return 0;
}

1012  Visual Cube     (hdoj 6330)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6330

签到题  模拟题

题意:根据题意 给出了长方体的长宽高 模拟出长方体

难度不大 但是非常麻烦并且让人头疼……

代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn=110;
char mp[maxn][maxn];
int t,a,b,c,m,n;

int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&a,&b,&c);
        n=2*c+1+2*b;
        m=2*a+1+2*b;
        //初始化
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                mp[i][j]=‘.‘;
            }
        }
        //上方 +-的构造
        for(int i=1;i<=2*b;i+=2){
            for(int j=2*b-i+2;j<=2*a+2*b-i+2;j++){
                if(j%2==1) mp[i][j]=‘+‘;
                else mp[i][j]=‘-‘;
            }
            for(int j=2*a+2*b-i+2+2;j<=m;j++){
                if(j%2==1) mp[i][j]=‘+‘;
            }
        }
        //| /的构造
        for(int i=2;i<=2*b;i+=2){
            for(int j=2*b-i+2;j<=m;j++){
                if(j%2==0) mp[i][j]=‘/‘;
            }
            for(int j=m;j>=m-i+2;j-=2){
                mp[i][j]=‘|‘;
            }
        }
        for(int i=2*b+2;i<=n;i+=2){
            for(int j=1;j<=m;j+=2){
                mp[i][j]=‘|‘;
            }
            for(int j=2*a+2;j<=m;j+=2){
                mp[i][j]=‘/‘;
            }
        }
        //下方的+-构造
        for(int i=2*b+1;i<=2*c+1;i+=2){
            for(int j=1;j<=2*a+1;j++){
                if(j%2==1) mp[i][j]=‘+‘;
                else mp[i][j]=‘-‘;
            }
            for(int j=2*a+2;j<=m;j++){
                if(j%2==1) mp[i][j]=‘+‘;
            }
        }
        for(int i=n;i>2*c+1;i-=2){
            for(int j=1;j<=2*a+1;j++){
                if(j%2==1) mp[i][j]=‘+‘;
                else mp[i][j]=‘-‘;
            }
            for(int j=2*a+2;j<=m;j++){
                if(j%2==1) mp[i][j]=‘+‘;
            }
        }
        int pos=0;
        for(int i=1;i<2*b+1;i++){
            for(int j=1;j<=2*b+1-i;j++){
                mp[i][j]=‘.‘;
            }
        }
        for(int i=n;i>2*c+1;i--){
            for(int j=2*a+2+pos;j<=m;j++){
                mp[i][j]=‘.‘;
            }
            pos++;
        }
        //输出
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                printf("%c",mp[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/whdsunny/p/9454955.html

时间: 2024-11-09 05:47:00

2018 Multi-University Training Contest 3 杭电多校第三场的相关文章

2019 杭电多校 第三场

2019 Multi-University Training Contest 3 补题链接:2019 Multi-University Training Contest 3 1002 Blow up the city (HDU-6604) 题意 给定 \(n\) 个点和 \(m\) 条边的有向无环图,给出 \(q\) 次询问,每个询问给出 \(a\) 和 \(b\),求有多少个点,满足该点删去后 \(a\) 和 \(b\) 中至少一个点不能到达出度为 \(0\) 的点. 题解 支配树/灭绝树 拓

杭电多校第三场 A Ascending Rating

Problem Description Before the start of contest, there are n ICPC contestants waiting in a long queue. They are labeled by 1 to n from left to right. It can be easily found that the i-th contestant's QodeForces rating is ai.Little Q, the coach of Qua

2019杭电多校第三场 1004 Distribution of books

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606 考虑二分答案,我们二分一个值\(x\),那么要怎么来验证这个答案是否可行,考虑dp求解,设\(dp[i]\)为前i个在答案为\(x\)的情况下划分最最多组数,那么若\(dp[n] \geq k\) 则这个x可行, 很显然可以看出\(x\)是单调的,所以二分. \[dp[i] = max(dp[j]) + 1 (sum[i] - sum[j-1] \leq x)\] 如果直接采用暴力枚举的话复杂

2019年杭电多校第三场 1011题Squrirrel(HDU6613+树DP)

题目链接 传送门 题意 给你一棵无根树,要你寻找一个根节点使得在将一条边权变为\(0\)后,离树根最远的点到根节点的距离最小. 思路 本题和求树的直径很像,不过要记得的东西有点多,且状态也很多. \(fi[u][0]\)表示在\(u\)这个结点不删边沿着子树方向能到达的最远距离,\(se[u][0]\)为第二远,\(th[u][0]\)为第三远,\(fa[u][0]\)表示沿着父亲方向能到达的最远距离,第二维为\(1\)表示删一条边能到达的距离. 不删边的转移和求树的直径转移方程基本上是一样的,

2019杭电多校第三场 1008 K-th Closest Distance

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6621 考虑主席树,我们先将所有值离散化之后建主席树.对于每个查询\(s,t,p,k\) 我们考虑二分一个值\(mid\),考虑当前区间内,\([p-mid, p+mid]\)的值有多少个,很显然这是符合单调性的,那么我们只需要每次判断即可.时间复杂度\(O(nlog^2n)\) #include <bits/stdc++.h> #define pii pair<int, int> #d

HDU 5742 It&#39;s All In The Mind (贪心) 2016杭电多校联合第二场

题目:传送门. 题意:求题目中的公式的最大值,且满足题目中的三个条件. 题解:前两个数越大越好. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; int gcd(int a,int b) { if(!b) return a; return gcd(b,a%b); } int main() { int t; ci

2019 杭电多校 第五场

2019 Multi-University Training Contest 5 补题链接:2019 Multi-University Training Contest 5 罚时爆炸 自闭场 1004 equation (HDU 6627) 题意: 给定一个整数 \(C\) 和 \(N\) 组 \(a_i,b_i\),求 \(∑_{i=1}^N|a_i\cdot x + b_i| = C\) 的所有解,如果有无穷多个解就输出 -1. 思路 分类讨论 分类讨论去绝对值.根据 \(b_i / a_i

2019 杭电多校 第八场

2019 Multi-University Training Contest 8 补题链接:2019 Multi-University Training Contest 8 1003 Acesrc and Good Numbers HDU 6659 题意 定义 \(f(d, n)\) 为十进制下 \(1\) 到 \(n\) 所有数的数位中数字 \(d\) 出现的次数.给定 \(x\),找出最大的 \(n(n \le x)\) 满足 \(f(d, n) = n\). 题解 看到了一个神仙做法. 显

2019 杭电多校 第七场

2019 Multi-University Training Contest 7 补题链接:2019 Multi-University Training Contest 7 1001 A + B = C 题意: 给出 \(a, b, c\),求 \(x, y, z\) 满足 \(a\cdot 10^x + b\cdot 10^y = c\cdot 10^z\).\(a, b, c \le 10^{100000}\). 题解: 补零到 \(a, b, c\) 长度相等之后,可能的情况只有四种: \