Codeforces Round #395 (Div. 2)

传送门:http://codeforces.com/contest/764

A题:题意是求1~z之间有多少个数既是n的倍数,也是m的倍数,直接z/lcm(n,m)就行了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#define X first
#define Y second
#define clr(u,v); memset(u,v,sizeof(u));
#define in() freopen("data","r",stdin);
#define out() freopen("ans","w",stdout);
#define Clear(Q); while (!Q.empty()) Q.pop();
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 1e5 + 10;
const int INF = 0x3f3f3f3f;

int main()
{
    ll a, b, c;
    cin >> a >> b >> c;
    cout << c / (a / __gcd(a, b)*b) << endl;
    return 0;
}
View Code

B题:给你一个长度为n的序列,让你对该序列进行如下操作,起始指针st=1,end=n,然后对st到end这部分旋转180度,既swap(N[st+i],N[end-i]。一直操作直到st>=end。可以考虑,在交换的时候,一定会有多余的交换,如果我们下标为0开始,那下标为奇数的都是被交换偶数次,可以抵消掉,那我们只要对下标为偶数的进行交换就行了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#define X first
#define Y second
#define clr(u,v); memset(u,v,sizeof(u));
#define in() freopen("data","r",stdin);
#define out() freopen("ans","w",stdout);
#define Clear(Q); while (!Q.empty()) Q.pop();
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 2e5 + 10;
const int INF = 0x3f3f3f3f;
int N[maxn];
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> N[i];
    for (int i = 0; i < n / 2; i += 2)
        swap(N[i], N[n-i-1]);
    for (int i = 0; i < n; i++)
        cout << N[i] << " ";
    return 0;
}
View Code

C题:给你一棵无根树,每个节点都有一种颜色。现在你要找到一个节点作为根节点,使得这棵树上除了根节点外,其他节点的颜色都要和他子树上的所有点颜色一样。可以记录下每个点与多少个颜色不同的点相连,注意颜色不同的点只可能在根节点处,所以记录下度数就行了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#define X first
#define Y second
#define clr(u,v); memset(u,v,sizeof(u));
#define in() freopen("data","r",stdin);
#define out() freopen("ans","w",stdout);
#define Clear(Q); while (!Q.empty()) Q.pop();
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 2e5 + 10;
const int INF = 0x3f3f3f3f;
pii E[maxn];
int c[maxn];
int in[maxn];
int cnt;
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i < n; i++)
        scanf("%d%d", &E[i].X, &E[i].Y);
    for (int i = 1; i <= n; i++)
        scanf("%d", &c[i]);
    for (int i = 1; i < n; i++)
        if (c[E[i].X] != c[E[i].Y])
        {
            cnt++;
            in[E[i].X]++;
            in[E[i].Y]++;
        }
    for (int i = 1; i <= n; i++)
        if (in[i] == cnt)
        {
            puts("YES");
            printf("%d\n", i);
            return 0;
        }
    puts("NO");
    return 0;
}
View Code

D题:题意是给你n个矩形,相邻的矩形不能有同种颜色,问能否用四种颜色给矩形染色,并输出方案,矩形边长为奇数。由四色定理可以得出答案一定是YES,那如何分配颜色呢?注意到矩形的边长为奇数,那么对于一个矩形,我们只考虑他的左下角的点的下标(x,y),两个矩形左下角的坐标分别为(x1,y1)和(x2,y2),如果x1和x2奇偶性相同,y1和y2奇偶性也相同,那么两个矩形是不可能相交的,因为abs(x1-x2)=边长=奇数,如果x1,x2奇偶性相同,则abs(x1-x2)=偶数,与前面矛盾,y同理。所以如果x1和x2奇偶性相同,y1和y2奇偶性也相同的两个矩形不可能相邻,那么我们可以根据x和y的奇偶性对矩形进行染色,刚好四种颜色,分别对应x奇y奇,x奇y偶,x偶y奇,x偶y偶。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#define X first
#define Y second
#define clr(u,v); memset(u,v,sizeof(u));
#define in() freopen("data","r",stdin);
#define out() freopen("ans","w",stdout);
#define Clear(Q); while (!Q.empty()) Q.pop();
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 5e5 + 10;
const int INF = 0x3f3f3f3f;
int main()
{
    int n, x, y;
    scanf("%d", &n);
    puts("YES");
    while (n--)
    {
        scanf("%d%d%*d%*d", &x, &y);
        printf("%d\n", 2 * (x & 1) + (y & 1) + 1);
    }
    return 0;
}
View Code

这场又是粗心掉分场= =所以没心情到现在才来补题解,越来越弱Orz

posted @ 2017-02-08 19:43  酱油党gsh  阅读(156)  评论(0编辑  收藏  举报