1. 程式人生 > >牛客OI周賽2-提高組

牛客OI周賽2-提高組

++ ext href 水果 tar https close over 之前

A.遊戲

鏈接:https://www.nowcoder.com/acm/contest/210/A
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

BLUESKY007,fengxunling和dreagonm三個人發現了一個像素遊戲,這款神奇的遊戲每次會生成一個nxm的網格,其中每一個格子都被隨機染色為R,G,B三種顏色之一,每次都可以選擇任意一個非B顏色的格子進行一次操作,每次操作都會滿足以下規則:
1.操作的範圍為從整個網格的左上角到選定方格的矩形區域
2.操作區域內所有方格都遵循技術分享圖片變換 3.第一個不能執行操作的人為失敗者,且按操作順序在失敗者之前的人取勝
為了能讓BLUESKY007感到快樂(照顧到BLUESKY007是個蒟蒻),fengxunling和dreagonm的操作都盡可能的讓BLUESKY007取勝,她們想知道在操作順序為技術分享圖片的情況下,失敗者是誰.

輸入描述:

題目有多組數據
第一行一個整數t,表示數據組數
對於每組數據,第一行兩個整數n,m,接下來n行每行m個字符

輸出描述:

輸出共t行,每行一個字符串表示答案
示例1

輸入

復制
2
3 3
RGG
BBG
RRR
3 3
GRB
RGR
RBG

輸出

復制
dreagonm
fengxunling

備註:

對於
技術分享圖片
的數據,
技術分享圖片
 
對於另
技術分享圖片
的數據,
技術分享圖片
對於
技術分享圖片
的數據
技術分享圖片
/*
題目描述寫的很清楚,三個人的操作都是為了
BLUESKY007能贏,所以遊戲一定會結束,那麽當橫縱坐標最大的非 B 顏色方格變為 B 顏
色時,可操作的方格範圍顯然是趨向收斂的,又因為操作規則的要求,左上角的方格在每
次操作中都會按規則進行變換,當可操作範圍收斂到左上角且左上角變為 B 顏色時,遊
戲結束,所以無論中間的操作是怎樣進行的,最終左上角的方格一定會變為 B 顏色,而且
進行操作的人數和操作變換長度相同,所以只需要判斷左上角方格的顏色即可
*/ #include<bits/stdc++.h> using namespace std; char maze[1000+5][1000+5]; int main() { int t; cin>>t; int n,m; while(t--) { scanf("%d%d",&n,&m); for(int i=0; i<n; i++) { cin>>maze[i]; } if(maze[0][0]==R) puts("dreagonm"); else if(maze[0][0]==G) puts("fengxunling"); else puts("BLUESKY007"); } }

B.水果蛋糕

鏈接:https://www.nowcoder.com/acm/contest/210/B

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

BLUESKY007要過生日了,為此朋友們準備給她買一個n*m的水果蛋糕qwq,但是在訂蛋糕的時候卻出現了問題:
蛋糕是方形的,因為水果顆粒放整齊才好看,所以水果顆粒必須按行按列地擺放(也就是如果建立平面直角坐標系,它們的坐標必須都是整數)。
她的朋友們想要蛋糕店多放點水果,但是由於擺放得太密集也不好看qwq,所以蛋糕店拒絕在和任意的水果顆粒相距技術分享圖片的地方擺放水果顆粒。
她的朋友們想知道蛋糕上最多能擺放多少水果顆粒,但是由於她們沒有BLUESKY007聰(rui)慧(zhi),所以她們找到了你來幫忙

輸入描述:

一行兩個正整數n,m

輸出描述:

一行一個整數表示答案
示例1

輸入

復制
1 4

輸出

復制
4
示例2

輸入

復制
3 4

輸出

復制
10

備註:

技術分享圖片 如圖所示,左圖為樣例1的實現方案,右圖為樣例2的實現方案之一 對於10%的數據,n,m≤ 5
對於20%的數據,min(n,m)≤3,n,m≤10
3
 
對於100%的數據,n,m≤ 10
9

/*
規律題
*/
#include<bits/stdc++.h>

using namespace std;
int n,m;

int main()
{
    scanf("%d%d",&n,&m);
    if(n<3||m<3){printf("%lld\n",1ll*n*m);return 0;}
    if(n>m)swap(n,m);
    if(n==4&&m==4){puts("12");return 0;}
    if(n==4&&m==5){puts("17");return 0;}
    if(n==4)
    {
        int t=m/6,r=m%6;
        long long ans=2ll*m;
        if(r==1||r==2)ans+=2*r;
        else if(r==3||r==4)ans+=4;
        else if(r==5)ans=12ll*(t+1);
        printf("%lld\n",ans);
        return 0;
    }
    if(n==3)
    {
        int t=m/6,r=min(3,m%6);
        long long ans=m+6ll*t+2ll*r;
        printf("%lld\n",ans);
        return 0;
    }
    cout<<(1ll*n*m+1)/2<<endl;
    return 0;
}

技術分享圖片

技術分享圖片

技術分享圖片

C.好朋友

鏈接:https://www.nowcoder.com/acm/contest/210/C
來源:牛客網

時間限制:C/C++ 3秒,其他語言6秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

BLUESKY007有很多關系很好的朋友,他們無一例外,名字均由數字組成(首字符不為0)且含有"007"(例如“10007”,“10707”就是她的好朋友,而“97037”,“70709”不是),即對於字符串s存在i,j,k(i< j< k)滿足技術分享圖片. 雖然BLUESKY007眼力極佳,一眼就能看出一個人是不是自己的好朋友,但BLUESKY007是個蒟蒻,她並不擅長數數,但她又想知道在[li,ri]內有多少人是自己的好朋友,所以就找到了你來幫忙.
她會向你詢問t次,由於詢問次數可能很多,所以你只需要告訴她t次詢問答案的異或和即可.

輸入描述:

第一行一個整數t,表示詢問個數 
接下來t行,每行兩個整數l
i
,r
i

輸出描述:

一行一個整數表示答案
示例1

輸入

復制
3
1 1000
233 666
999 999

輸出

復制
0

說明

在0~1000範圍內不存在與題目要求相符的含有“007”的數,所以三次詢問的答案都是0
示例2

輸入

復制
3
10000 10086
2333 23333
6666 66666

輸出

復制
132
技術分享圖片

技術分享圖片
#include<bits/stdc++.h>

#define N 500000

using namespace std;
int n,m,l,r,ans;
int sum[N];

int main()
{
    int T;cin>>T;
    sum[1007]=1;
    sum[2007]=1;
    sum[3007]=1;
    sum[4007]=1;
    sum[5007]=1;
    sum[6007]=1;
    sum[7007]=1;
    sum[8007]=1;
    sum[9007]=1;
    sum[10007]=1;
    sum[20007]=1;
    sum[30007]=1;
    sum[40007]=1;
    sum[11007]=1;
    sum[12007]=1;
    sum[13007]=1;
    sum[14007]=1;
    sum[15007]=1;
    sum[16007]=1;
    sum[17007]=1;
    sum[18007]=1;
    sum[19007]=1;
    sum[10107]=1;
    sum[10207]=1;
    sum[10307]=1;
    sum[10407]=1;
    sum[10507]=1;
    sum[10607]=1;
    sum[10707]=1;
    sum[10807]=1;
    sum[10907]=1;
    sum[10017]=1;
    sum[10027]=1;
    sum[10037]=1;
    sum[10047]=1;
    sum[10057]=1;
    sum[10067]=1;
    sum[10077]=1;
    sum[10087]=1;
    sum[10097]=1;
        sum[11007]=1;
    sum[12007]=1;
    sum[13007]=1;
    sum[14007]=1;
    sum[15007]=1;
    sum[16007]=1;
    sum[17007]=1;
    sum[18007]=1;
    sum[19007]=1;
    sum[10107]=1;
    sum[10207]=1;
    sum[10307]=1;
    sum[10407]=1;
    sum[10507]=1;
    sum[10607]=1;
    sum[10707]=1;
    sum[10807]=1;
    sum[10907]=1;
    sum[10017]=1;
    sum[10027]=1;
    sum[10037]=1;
    sum[10047]=1;
    sum[10057]=1;
    sum[10067]=1;
    sum[10077]=1;
    sum[10087]=1;
    sum[10097]=1;
    sum[10070]=1;
    sum[10071]=1;
    sum[10072]=1;
    sum[10073]=1;
    sum[10074]=1;
    sum[10075]=1;
    sum[10076]=1;
    sum[10077]=1;
    sum[10078]=1;
    sum[10079]=1;
        sum[21007]=1;
    sum[22007]=1;
    sum[23007]=1;
    sum[24007]=1;
    sum[25007]=1;
    sum[26007]=1;
    sum[27007]=1;
    sum[28007]=1;
    sum[29007]=1;
    sum[20107]=1;
    sum[20207]=1;
    sum[20307]=1;
    sum[20407]=1;
    sum[20507]=1;
    sum[20607]=1;
    sum[20707]=1;
    sum[20807]=1;
    sum[20907]=1;
    sum[20017]=1;
    sum[20027]=1;
    sum[20037]=1;
    sum[20047]=1;
    sum[20057]=1;
    sum[20067]=1;
    sum[20077]=1;
    sum[20087]=1;
    sum[20097]=1;
    sum[20070]=1;
    sum[20071]=1;
    sum[20072]=1;
    sum[20073]=1;
    sum[20074]=1;
    sum[20075]=1;
    sum[20076]=1;
    sum[20077]=1;
    sum[20078]=1;
    sum[20079]=1;
        sum[31007]=1;
    sum[32007]=1;
    sum[33007]=1;
    sum[34007]=1;
    sum[35007]=1;
    sum[36007]=1;
    sum[37007]=1;
    sum[38007]=1;
    sum[39007]=1;
    sum[30107]=1;
    sum[30207]=1;
    sum[30307]=1;
    sum[30407]=1;
    sum[30507]=1;
    sum[30607]=1;
    sum[30707]=1;
    sum[30807]=1;
    sum[30907]=1;
    sum[30017]=1;
    sum[30027]=1;
    sum[30037]=1;
    sum[30047]=1;
    sum[30057]=1;
    sum[30067]=1;
    sum[30077]=1;
    sum[30087]=1;
    sum[30097]=1;
    sum[30070]=1;
    sum[30071]=1;
    sum[30072]=1;
    sum[30073]=1;
    sum[30074]=1;
    sum[30075]=1;
    sum[30076]=1;
    sum[30077]=1;
    sum[30078]=1;
    sum[30079]=1;
        sum[41007]=1;
    sum[42007]=1;
    sum[43007]=1;
    sum[44007]=1;
    sum[45007]=1;
    sum[46007]=1;
    sum[47007]=1;
    sum[48007]=1;
    sum[49007]=1;
    sum[40107]=1;
    sum[40207]=1;
    sum[40307]=1;
    sum[40407]=1;
    sum[40507]=1;
    sum[40607]=1;
    sum[40707]=1;
    sum[40807]=1;
    sum[40907]=1;
    sum[40017]=1;
    sum[40027]=1;
    sum[40037]=1;
    sum[40047]=1;
    sum[40057]=1;
    sum[40067]=1;
    sum[40077]=1;
    sum[40087]=1;
    sum[40097]=1;
    sum[40070]=1;
    sum[40071]=1;
    sum[40072]=1;
    sum[40073]=1;
    sum[40074]=1;
    sum[40075]=1;
    sum[40076]=1;
    sum[40077]=1;
    sum[40078]=1;
    sum[40079]=1;            
    
    for(int i=1007;i<=50000;i++) sum[i]+=sum[i-1];
    while(T--)
    {
        cin>>l>>r;
        if(l<=1000 && r<=1000) ans^=0; 
        else if(l<=50000 && r<=50000)
        ans^=sum[r]-sum[l-1];
    }
    printf("%d\n",ans);
    return 0;
}
40打了個表...

/*
因為"好朋友"的定義為含有"007",所以有很多情況都會被視為含有"007",例如
"10707","17007"等,此時我們發現對於含有"007"的情況的討論比較復雜,所以我們不
妨討論不含"007"的情況,也即對於任意的含有 7 的數,其中每一個7前都至多有2個0 ,
由此可以設f[i][j]表示在前 i 位有 j 個 0 的數的個數,在數位DP過程中存當前位置和已有
的 0 的個數,顯然在 0 的個數>=2時,後面的數位上都不可能再有7.在求出不含"007"的
數之後,用總數減掉即可。 
*/
#include<bits/stdc++.h>

#define ll long long

using namespace std;

ll l,r,ans,f[20][4],d[20];
int t,m,i,j,k,x,a[20];

ll work(ll n)
{
    if(n<1000)return 0;
    for(m=0;n;n/=10)a[m++]=n%10;
    reverse(a,a+m);
    memset(f,0,sizeof(f));
    f[1][0]=a[0]-1;
    x=0;
    for(i=1;i<m;i++)
    {
        f[i+1][0]=f[i][0]*9;
        f[i+1][1]=f[i][0]+f[i][1]*9;
        f[i+1][2]=f[i][1]+f[i][2]*9;
        f[i+1][3]=f[i][2]+f[i][3]*10;
        f[i+1][x]+=a[i]-1;
        f[i+1][x+(x<2&&a[i]||x==2&&a[i]>7)]++;
        if(x<2&&!a[i]||x==2&&a[i]==7)x++;
    }
    return d[m-1]+f[m][3];
}

int main()
{
    for(i=0,l=1;i<=18;i++,l*=10)d[i]=work(l-1);
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld",&l,&r);
        ans^=work(r+1)-work(l);
    }
    cout<<ans<<endl;
    return 0;
}


牛客OI周賽2-提高組