1. 程式人生 > >2018 Multi-University Training Contest 3 杭電多校第三場

2018 Multi-University Training Contest 3 杭電多校第三場

整數 其余 for cube cst ace 長度 get 每次

躺了幾天 終於記得來填坑了

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; }
View Code

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;
}
View Code

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;
}
View Code

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;
}
View Code

2018 Multi-University Training Contest 3 杭電多校第三場