1. 程式人生 > >【Codeforces - Mail.Ru Cup 2018 Round 3 】A.B.C.D.E

【Codeforces - Mail.Ru Cup 2018 Round 3 】A.B.C.D.E

前言

又是一個深夜場,本來想給biubiubiu_上個紫,沒想到全程不在狀態,最後四題,E甚至都沒讀題,賽後讀題+寫題直接半小時就過了,開場又是寫錯一個for迴圈的變數,導致7分鐘才過掉a,之後看b感覺是一個好難的題,沒什麼思路,畫個圖想了一個做法,tle,開啟程式碼一看一個O(1e9)的for迴圈擺在那裡,趕緊優化掉,0:22過掉之後D過的比C多,想了一個nlogn的貪心然後wa了,反向貪心又wa了,仔細思考一下,01:31一個sort就過了,回頭看C,**互動模擬題,不知道為什麼比D過的少,直接寫,寫完交,返回未知錯誤,我以為是哪裡不合法,一直找問題,最後加了個’\n’,就過了?2:28過掉C,宣告GG。賽後看D,sdHash題,分析一下複雜度,就是個nlogn,寫完之後被卡ull的單hash,向pls學習了一波多hash的模板之後過掉了。
biubiubiu_ rating-=27 1888->1861


A. Determine Line

題意

給你n個序列,每個序列中的數在該序列中只出現一次,
輸出在n個序列中都出現過的數
2 < = n < = 100

2<=n<=100 ,每個數的值域為1-100

做法

先統計在第一個序列中出現過的,之後只儲存所有之前出現過的就可以了。
我這個做法不是很好,我們其實只要統計哪些數出現過n次就可以了。

程式碼

#include<stdio.h>
int vis[105];
int vis2[105];
int main()
{
    int n,x,y;
    scanf("%d",&n);
    scanf("%d",&x);
    while
(x--) { scanf("%d",&y); vis[y]=1; } for(int i=1;i<=n-1;i++) { scanf("%d",&x); for(int j=1;j<=100;j++) vis2[j]=0; while(x--) { scanf("%d",&y); vis2[y]=1; } for(int j=1;j<=100;j++) { if(vis[j]&&vis2[j]) vis[j]=1; else vis[j]=0; } } for(int i=1;i<=100;i++) if(vis[i]) printf("%d ",i); printf("\n"); return 0; }

B. Divide Candies

題意

給你一個n*n的方格,點(i,j)的權值為 i 2 + j 2 i^2+j^2
問這個方格內有多少個數是m的倍數
1 &lt; = n &lt; = 1 0 9 , 1 &lt; = m &lt; = 1000 1&lt;=n&lt;=10^9,1&lt;=m&lt;=1000

做法

m m m m 由於m的資料範圍很小,我們可以直接算出m*m之內的是m的倍數的個數
m m + m m 如果把m*m這個矩形內的所有點的橫座標+m,m的倍數的個數還是不變的
n n m m , 縱座標同理,於是我們算出n*n中包含多少個m*m,之後同理再算剩下的小塊
O ( n l o g n ) 複雜度O(nlogn)
在這裡插入圖片描述
如上圖藍色陰影用藍色塊翻倍算,紅色陰影用紅色塊翻倍算,紫色塊自己算
程式碼

#include<stdio.h>
typedef long long ll;
int main()
{
    ll n,m;
    scanf("%lld%lld",&n,&m);
    ll cnt=0;
    for(ll i=1;i<=m;i++)
    {
        for(ll j=1;j<=m;j++)
        {
            ll tmp=i*i+j*j;
            if(tmp%m==0) cnt++;
        }
    }
    ll ans=((n/m)*(n/m))*cnt;
    cnt=0;
    for(ll i=(n-n%m)+1;i<=n;i++)
    {
        for(ll j=1;j<=m;j++)
        {
            ll tmp=i*i+j*j;
            if(tmp%m==0) cnt++;
        }
    }
    ans+=2LL*cnt*(n/m);
    cnt=0;
    for(ll i=(n-n%m)+1;i<=n;i++)
    {
        for(ll j=(n-n%m)+1;j<=n;j++)
        {
            ll tmp=i*i+j*j;
            if(tmp%m==0) cnt++;
        }
    }
    ans+=cnt;
    printf("%lld\n",ans);
    return 0;
}


C. Pick Heroes

題意

有兩個勢力,給你2*n個英雄,每個英雄有戰鬥力,兩方輪流選擇英雄
有m對英雄有捆綁關係,對於每對捆綁的英雄,若某一個被其中一方選擇
則下個回合另一方必須選擇捆綁的另一個英雄
要求儘量使所選英雄總戰鬥力值最大
如果最開始輸入1,則表示你先選擇,否則對手先選擇

做法

首先如果我們先手,我們肯定先選完所有捆綁英雄中最戰鬥力大的那一個,
之後剩下的英雄中不斷選擇戰鬥力最高的就可以
如果我們後手,對手選擇捆綁英雄的情況我們只能跟著選
否則我們直接轉守為攻,選擇完所有捆綁英雄,
之後再每次可以選的時候直接選剩下的英雄裡戰鬥力最大的

程式碼

#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 1e4+5;
int vis2[maxn];
int vis[maxn];
int l[maxn],r[maxn];
struct data
{
    int id,num;
}a[maxn];
bool cmp(const data &a,const data &b)
{
    return a.num<b.num;
}
int xx[maxn];
int main()
{
    int n,m,x;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=2*n;i++)
    {
        scanf("%d",&a[i].num);
        a[i].id=i;
        xx[i]=a[i].num;
    }
    sort(a+1,a+1+2*n,cmp);
    for(int i=1;i<=m;i++) scanf("%d%d",&l[i],&r[i]);
    int op;
    scanf("%d",&op);
    if(op==1)
    {
        int pos=1;
        for(int i=1;i<=n;i++)
        {
            if(pos<=m)
            {
                if(xx[l[pos]]>xx[r[pos]])
                {
                    vis[l[pos]]=1;
                    printf("%d\n",l[pos]);fflush(stdout);
                }
                else
                {
                    vis[r[pos]]=1;
                    printf("%d\n",r[pos]);fflush(stdout);
                }
                pos++;
            }
            else
            {
                for(int j=2*n;j>=1;j--)
                {
                    if(!vis[a[j].id])
                    {
                        vis[a[j].id]=1;
                        printf("%d\n",a[j].id);fflush(stdout);
                        break;
                    }
                }
            }
            scanf("%d",&x);
            vis[x]=1;
        }
    }
    else
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            vis[x]=1;
            int flag=0;
            for(int j=1;j<=m;j++)
            {
                if(vis2[j]) continue;
                if(l[j]==x)
                {
                    vis2[j]=1;
                    flag=1;
                    vis[r[j]]=1;
                    printf("%d\n",r[j]);fflush(stdout);
                    break;
                }
                else if(r[j]==x)
                {
                    vis2[j]=1;
                    flag=1;
                    vis[l[j]]=1;
                    printf("%d\n",l[j]);fflush(stdout);
                    break;
                }
            }
            if(flag==0)
            {
                int ff=0;
                for(int j=1;j<=m;j++)
                {
                    if(!vis2[j])
                    {
                        ff=1;
                        vis2[j]=1;
                         if(xx[l[j]]>xx[r[j]])
                        {
                            vis[l[j]]=1;
                            printf("%d\n",l[j]);fflush(stdout);
                        }
                        else
                        {
                            vis[r[j]]=1;
                            printf("%d\n",r[j]);fflush(stdout);
                        }
                        break;
                    }
                }
                if(ff==0)
                {
                    for(int j=2*n;j>=1;j--)
                    {
                        if(!vis[a[j].id])
                        {
                            vis[a[j].id]=1;
                            printf("%d\n",a[j].id);fflush(stdout);
                            break;
                        }
                    }
                }
            }
        }
    }
    return 0;
}


D. Decorate Apple Tree

題意

給你一棵樹每個葉子節點上都有一個顏色,
如果某個節點是好節點,要滿足他子樹內所有的葉子節點顏色不同

相關推薦

Codeforces - Mail.Ru Cup 2018 Round 3 A.B.C.D.E

前言 又是一個深夜場,本來想給biubiubiu_上個紫,沒想到全程不在狀態,最後四題,E甚至都沒讀題,賽後讀題+寫題直接半小時就過了,開場又是寫錯一個for迴圈的變數,導致7分鐘才過掉a,之後看b感覺是一個好難的題,沒什麼思路,畫個圖想了一個做法,tle,開啟程式碼一看一個O(1e9)

[codeforces Mail.Ru Cup 2018 Round 3][B Divide Candies ][思維+數學]

https://codeforces.com/contest/1056/problem/B 題意:輸入n,m    求((a*a)+(b*b))%m==0的(a,b)種數(1<=a,b<=n) (n<=1e9,m<=1000) 題解:由於a,b的數量級

Mail.Ru Cup 2018 Round 3 B. Divide Candies分析+暴力

B. Divide Candies 題意 給你一個n*n的方格,點(i,j)的權值為 i 2

Mail.Ru Cup 2018 Round 3 E. Check Transcription Hash+尺取

E. Check Transcription 題意 給你一個01串s,一個字串t, 0 可

Mail.Ru Cup 2018 Round 3 D. Decorate Apple Tree排序+思維

D. Decorate Apple Tree 題意 給你一棵樹每個葉子節點上都有一個顏色, 如果某個節點是好節點,要滿足他子樹內所有的葉子節點顏色不同 對

[codeforces Mail.Ru Cup 2018 Round 1 D][ xor 操作]

http://codeforces.com/contest/1054/problem/D 題目大意:一個序列a1 a2...an,可以對若干個元素進行取反,使所得的新序列異或和為0的區間個數最多. 題目分析:首先易知每個位置的字首異或和的值只有兩種,因為對元素進行取反時,取偶數個元素異或和不變,奇數個元素

Codeforces Mail.Ru Cup 2018 Round 2

A. Metro #include<cstdio> int main(){ int n,s; int a[1005],b[1005]; while(~scanf("%d%d",&n,&s)){ int k=0; for(int i=0;i<n;i

Mail.Ru Cup 2018 Round 3 Solution

A. Determine Line Water. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n, vis[110]; 5 6 int main() 7 { 8 while

B. Divide Candies Mail.Ru Cup 2018 Round 3 (數學)

題目連結:CF 題意:給出n,讓你找出 (x*x+y*y)%m==0的點對(0<x<=n,0<y<=n),問有多少對。 參考官方題解:(x*x+y*y)%m==0,等價於 ((x%m)^2+(y%m)^2)%m==0,設i=x%m,j=y%m,即座標範圍n*n內滿

Codeforces Mail.Ru Cup 2018 Round 1 C. Candies Distribution(構造)

Description: 有一個長度為n的整數序列,Li表示在第i個數的左邊有多少個數比它大,Ri表式在第i個數的右邊有多少個數比它大 (li is the number of indices j (1≤j<i), such that ai<aj and ri

Mail.Ru Cup 2018 Round 3

ini r+ inf con n+1 決策 int 方程 pac   A:簽到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #

Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) A.B.C.D

前言 在晚上的div2之前開啟的這場,但是自己頭腦貌似不太清醒,全程在寫bug,而且B題不知道自己在寫啥,寫了一百多行?,C也寫了好多bug導致最後的D一眼思路但是沒寫完。希望晚上狀態不要這麼差!QWQ A. Golden Plate 題意 給你一個h*w的長方形邊框,

Mail.Ru Cup 2018 Round 2 B Alice and Hairdresser

【連結】 我是連結,點我呀:) 【題意】 【題解】 因為只會增加。 所以。 一開始暴力算出來初始答案 每次改變一個點的話。 就只需要看看和他相鄰的數字的值就好。 看看他們是不是大於l 分情況增加、減少答案就好 【程式碼】 #include <bits/stdc++.h&

Mail.Ru Cup 2018 Round 1 virtual participate記

  因為睡過了只好vp。   A:閱讀理解。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring>

[題解]Mail.Ru Cup 2018 Round 1 - D. Changing Array

【題目】 D. Changing Array 【描述】 給n個整數a[1],...,a[n],滿足0<=a[i]<=2^k-1。Vanya可以對這n個數中任一多個數進行操作,即將x變為x',其中x'指x限制在k位內二進位制取反。問a[1],...,a[n]中最多有多少個連續子段的異或和不為0

[題解]Mail.Ru Cup 2018 Round 1 - B. Appending Mex

【題目】 B. Appending Mex 【描述】 Ildar定義了一種方法,可以由一個數組產生一個數。具體地,從這個陣列中任選一個子集,不在這個子集中的最小的非負整數稱為mex,就是由這個陣列得到的數。初始時刻Ildar的陣列是一個空陣列,通過上述方法得到某個mex,加入到陣列的尾端,不斷重複以上操

[題解]Mail.Ru Cup 2018 Round 1 - A. Elevator or Stairs?

【題目】 A. Elevator or Stairs? 【描述】 Masha要從第x層樓去第y層樓找Egor,可以選擇爬樓梯或者坐直升電梯。已知爬樓梯每層需要時間t1;坐直升電梯每層需要時間t2,直升電梯開門或者關門一次需要時間t3,當前直升電梯在第z層樓,直升電梯門是在關閉狀態的。如果爬樓梯總時間嚴格

Mail.Ru Cup 2018 Round 2 Problem C Lucky Days

設在第 $x$ 天二人都 lucky,則有 $\DeclareMathOperator{\lcm}{lcm}$ $ x = y_a t_a + l_a + R_a $ $ x= y_b t_ b + l_b + R_b$ 令 $L_a = r_a - l_a + 1, L_b = r_b - l_b + 1

Mail.Ru Cup 2018 Round 2 Solution

A. Metro Solved. 題意: 有兩條鐵軌,都是單向的,一條是從左往右,一條是從右往左,Bob要從第一條軌道的第一個位置出發,Alice的位置處於第s個位置,有火車會行駛在鐵軌上,一共有n個站點,1表示火車會在該站點停下,0表示不會,求Bob能否到達地s個位置(到達任意一邊即可) 思路: