XR-4 div2 總結

寫在前面

又是什麼都不會系列\(QAQ\),lb.png數組

T1模擬賽

連接ide

Idea

這就是一道模擬題。題目背景如題面所述。idea

開始的時候腦子木掉了,想了十幾分鍾spa

而後發現十分簡單。個人思路以下code

\(a[i][j]\)表示第\(i\)我的第\(j\)天作的第\(k\)套題get

\(b[i][j]\)表示第\(i\)天的第\(j\)套題是否有人作,有就是1,沒有就是0class

\(ans[i]\)表示第\(i\)天要作幾套題。複雜度\(O(nm+nk)\)方法

\(ans[i]+=b[i][j]\)便可im

Code

//比賽時 時空 19ms,4.87MB
int n,m,k;
int a[maxn][maxn],ans[maxn];
bool b[maxn][maxn];
int main(){
    n=read(); m=read(); k=read();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int x=read();
            a[i][x]=j;
        }   
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            b[j][a[i][j]]=1; 
        }
    }
    for(int i=1;i<=k;i++)
    for(int j=1;j<=m;j++){
        ans[i]+=b[i][j];
    }
    for(int i=1;i<=k;i++) printf("%d ",ans[i]);
    return 0;
}

T2歌唱比賽

連接img

Idea

構造題。

思路很簡單:

\(s[i]=K\)時,\(x[i]=y[i]=0\),

\(s[i]=X\)時,\(x[i]=1,y[i]=0\)

\(s[i]=Y\)時,\(x[i]=0,y[i]=1\)

如何判斷無解?

很簡單,好比對於XYXZZZZ,有解;對於ZYXZ,無解

由於ZXYZ的話,根據個人構造方法,x=0100;y=0010,

可是與ZXYZ相矛盾;因此無解。

那就是說若是當前位爲Z,那麼這一位日後的字符都得是Z

(我講的不是很清楚,不懂的同窗請本身手寫cy.png

因而,就有了一種判斷方法

//倒序枚舉,第i位是Z時
for(int j=1;j<i;j++)
    if(s[i]!='Z') return puts("-1"),0;

顯然超時。

因而咱們能夠開一個flag,記錄當前位是不是Z,是則爲1,不是則爲0;

每次掃到Z時判斷下便可,具體見代碼cy.png

Code

char s[maxn],x[maxn],y[maxn];
bool flag=1;
int main(){
    scanf("%s",s+1);
    int len=strlen(s+1);
    for(int i=len;i;i--){
        if(s[i]=='Z'){
            if(!flag) return printf("-1"),0;
            x[i]=y[i]='0'; 
        }       
        if(s[i]=='X'){
            flag=0;
            x[i]='1'; y[i]='0';
        }
        if(s[i]=='Y'){
            flag=0;
            x[i]='0'; y[i]='1';
        }
    }
    printf("%s",x+1);
    puts("");
    printf("%s",y+1);
    return 0;
}

T3題

連接

Idea

考場上只會\(\inf\)的作法,,因而只有\(3\ pts\);

結束的時候想出了正解(霧?解題過程以下

解法一

觀察式子:\(y^2-x^2=ax+b\)

因而我想出消掉\(y\)。設\(y=x+k,k \ge 0\),顯然有\(y \ge x\)

代入,化簡得:\(2kx+k^2=ax+b\)

變爲關於\(x\)的式子,爲\((2k-a)x=b-k^2\)

  • \(2k-a=0\ \And \And\ b-k^2=0\)時,\(0=0\).因此\(\forall x \in \mathbb N\),方程恆成立,即 \(\displaystyle \frac{a}{2}=\sqrt b\)時,方程有無數組解

  • \(\displaystyle \frac{a}{2} \not=b\)時,\(x=\displaystyle \frac{b-k^2}{2k-a},x \ge 0\)。將\(k\)看做主元,可得

    • \(\displaystyle \frac{a}{2} \lt \sqrt{b}\)時,\(\displaystyle k \in (\frac{a}{2},\sqrt{b}\ \ ]\)

    • \(\displaystyle \frac{a}{2} \gt \sqrt{b}\)時,\(\displaystyle k \in [\sqrt{b},\frac{a}{2})\)

而後能夠根據範圍枚舉\(k\),由於\(y=x+k\),因此每獲得一個\(x\),就會獲得一組解。而後,注意精度形成的影響,就沒了。看戲1.jpg

解法二

同窗想到的。

就是先把已知式子配方,即\(\displaystyle y^2-(x+\frac{a}{2})^2=\frac{4b-a^2}{4}\)

化簡得\(\displaystyle (2y+2x+a)(2y-2x-a)=4b-a^2\)

而後判斷\(4b-a^2\)的正負,若\(4b-a^2=0\),則輸出\(\inf\)

枚舉\(4b-a^2\)的因子,再求解相應的\(x,y\),符合要求則\(ans++\)

而後,又沒了看戲1.jpg

複雜度大概都在\(O(\displaystyle \min(\frac{a}{2},\sqrt{b}))\)。。。。吧。。

Code

\(Code1\)

int ans;
signed main(){
    int a=read(),b=read();
    int sq=sqrt(b),q=a/2;
    if(sq*sq==b&&sq*2==a) printf("inf");
    else if(a==1&&b==0) printf("1");
    else if(sq>=q){
        for(int i=q+1;i<=sq;i++)
            if((abs(b-i*i))%(abs(2*i-a))==0) ans++;
        printf("%lld",ans);
    }
    else{
        int ed=(q*2==a)?(q-1):(q);
        for(int i=sq;i<=ed;i++)
            if((abs(b-i*i))%(abs(2*i-a))==0) ans++;
        printf("%lld",ans);
    }
    return 0;
}

\(Code2\)

//同窗的代碼,壓了壓行,請見諒
const int sea=1e5+7;
int a,b,ans=0;
bool check(int A,int B){
    if((A+B)%2!=0||(B-A)%2!=0) return 0;
    int x,y;y=(A+B)/2;x=(B-A)/2;
    if(x<0||y<0) return 0; else return 1;
}
bool check1(int A,int B){
    if((A+B)%2!=0||(B-A)%2!=0) return 0;
    int x,y;x=(A+B)/2;y=(B-A)/2;
    if(x<0||y<0) return 0;else return 1;
}
signed main(){
    a=read(); b=read();  int xx=4*b-a*a; if(!xx) {puts("inf");return 0;}
    if(xx>=0){ 
        for(int i=1;i<=sqrt(xx);i++){
            if(xx%i==0){
                if((i+a)%2!=0||(xx/i-a)%2!=0) continue;
                int A=(i+a)/2,B=(xx/i-a)/2;
                if(check(A,B)) ans++;
            }
        }
    }
    else{
        xx=-xx;
        for(int i=1;i<=sqrt(xx);i++){
            if(xx%i==0){
                if((i-a)%2!=0||(xx/i-a)%2!=0) continue;
                int A=(i-a)/2,B=(xx/i-a)/2;
                if(check1(A,B)) ans++; 
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}

其餘

餘下兩題不會/寫lb.png,仍是我太菜kk.png

回來再補上
\[ The \quad End \]

\[ \text{只要有心就能看見.從白雲看到,不變藍天;從風雨尋回,夢的起點.-《夢想天空分外藍》陳奕迅} \]

相關文章
相關標籤/搜索