1. 程式人生 > >Codeforces Round #395 (Div. 2)

Codeforces Round #395 (Div. 2)

滿足 sed ace 是我 ret dfs include 裏的 思路

今天自己模擬了一套題,只寫出兩道來,第三道時間到了過了幾分鐘才寫出來,啊,太菜了。

A. Taymyr is calling you

水題,問你在z範圍內 兩個序列 n,2*n,3*n...... 和 m,2*m,3*m.....有多少個是一樣的。

技術分享
#include<bits/stdc++.h>
using namespace std;
int n,m,z;
int main()
{
    cin>>n>>m>>z;
    int gcd=__gcd(n,m);
    int now=n*m/gcd;
    int ans=0;
    
int res=now; while(res<=z) { ans++; res+=now; } cout<<ans<<endl; return 0; }
View Code

B. Timofey and cubes

題目大意:給你n個數,進行(n/2)次操作,每次操作將制定區間裏的數交換,給你交換後的

讓你求原來的。

思路:水題,奇偶討論。

技術分享
#include<bits/stdc++.h>
const int N=2*1e5+5;
using namespace std;
int
a[N]; int n; int main() { cin>>n; for(int i=1;i<=n;i++) scanf("%d",&a[i]); int mid=n/2; int i=1,j=n; bool flag=true; while(i<=j) { if(flag) { int t=a[i]; a[i]=a[j]; a[j]=t; } flag=!flag; i
++,j--; } for(int i=1;i<=n;i++) printf("%d%c",a[i],i==n? \n: ); return 0; }
View Code

C. Timofey and a tree

題目大意:給你一顆樹,每個節點都有一個顏色,讓你挑選一個節點當做整棵樹的根,滿足所有

子樹中節點的顏色都是一樣的。如果沒有輸出NO 否則輸入YES 且輸出選擇的節點。

思路:剛開始的思路是我覺得這棵樹中的顏色不能超過 3 種,後來一想這種想法好智障啊,明顯

不對,後來枚舉樹根每個都dfs一下超時,結束後想我隨便找一個點dfs找到兩個相鄰的顏色不同的

點,那麽這兩個點中間肯定有一個要當做樹根的,否則不成立。這樣只要dfs兩次就行了。

技術分享
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
vector<int> e[N];
int c[N],item1,item2,n;
map<int,bool> mp;
bool flag;
void dfs1(int u,int pre)
{
    //printf("%d\n",u);
    if(pre!=-1 && c[u]!=c[pre])
    {
        item1=u;
        item2=pre;
        return;
    }
    for(int i=0;i<e[u].size();i++)
    {
        int to=e[u][i];
        if(to!=pre) dfs1(to,u);
        if(item1!=-1) return;
    }
}
void dfs(int u,int pre,int item)
{
   // printf("%d %d %d**\n",u,pre,item);
    if(pre!=item && pre!=-1 && c[u]!=c[pre])
    {
        flag=false;
        return;
    }
    for(int i=0;i<e[u].size();i++)
    {
        int to=e[u][i];
        if(to!=pre) dfs(to,u,item);
        if(!flag) return;
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int f,t;
        scanf("%d%d",&f,&t);
        e[f].push_back(t);
        e[t].push_back(f);
    }
    int cnt=0;
    for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    item1=-1,item2=-1;
    dfs1(1,-1);
    if(item1==-1)
    {
        puts("YES");
        puts("1");
        return 0;
    }
    flag=true;
    dfs(item1,-1,item1);
    if(flag)
    {
        puts("YES");
        printf("%d\n",item1);
        return 0;
    }
    flag=true;
    dfs(item2,-1,item2);
    if(flag)
    {
        puts("YES");
        printf("%d\n",item2);
        return 0;
    }
    puts("NO");
    return 0;
}
View Code

D. Timofey and rectangles

題目大意:給你n個矩形,且矩形的邊長為奇數,任意兩個矩形都不相交,最多相鄰,現在讓你給這些矩形上色,

一種4種顏色,相鄰的矩形顏色不能相等,問你有沒有這樣的方案,如果有則輸出。

思路:赤裸裸的腦洞題,專門碾壓我這種低智商的,這題最關鍵的是矩形的邊長是奇數,雖然我知道,但是

我還是不會寫QAQ。

首先,四個矩形不可能兩兩互相相鄰,所以結論一定是YES

然後,我們考慮矩形的左下角的頂點,如果 x 和 y 的值都為奇數,因為邊長是奇數,所以這個矩形不可能和

另一個左下角坐標都為奇數的矩形相鄰。所以我們給這類矩形染色 1 。

其他三種同理。

技術分享
#include<bits/stdc++.h>
using namespace std;
const int N=5*1e5+5;
int n,vis[N],m=1e9;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x1,y1,x2,y2;
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        if((x1+m)%2 && (y1+m)%2) vis[i]=1;
        else if((x1+m)%2) vis[i]=2;
        else if((y1+m)%2) vis[i]=3;
        else vis[i]=4;
    }
    cout<<"YES"<<endl;
    for(int i=1;i<=n;i++) printf("%d\n",vis[i]);
    return 0;
}
View Code

Codeforces Round #395 (Div. 2)