Codeforces Round #368 (Div. 2)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #368 (Div. 2)相关的知识,希望对你有一定的参考价值。

A. Brain‘s Photos

题目大意:根据照片里的颜色判断一下是黑白照片还是彩照吧。水题

 1 #include <cstdio>
 2 int main()
 3 {
 4     int n,m;
 5     char ch;
 6     bool flag = false;
 7     scanf("%d%d",&n,&m);
 8     for(int i = 0; i < n; i++)
 9     {
10         for(int j = 0; j < m; j++)
11         {
12             getchar();
13             scanf("%c",&ch);
14             if(ch ==C || ch ==M || ch ==Y)
15                 flag =  true;
16         }
17     }
18     if(flag)
19         printf("#Color\n");
20     else
21         printf("#Black&White\n");
22     return 0;
23 }

 

B. Bakery

 题目大意:有k个储存点,在n-k个点中,找一个离他们最近的。

 1 #include <cstdio>
 2 #include <cstring>
 3 const int INF = 0x3f3f3f3f;
 4 const int maxn = 1e5 + 5;
 5 struct _
 6 {
 7     int u,v,l;
 8 }edge[maxn];
 9 int a[maxn];
10 int main()
11 {
12     int n,m,k,u,v,l;
13     scanf("%d%d%d", &n, &m, &k);
14     for(int i = 0; i < m; i++)
15     {
16         scanf("%d%d%d", &u, &v, &l);
17         edge[i].u = u, edge[i].v = v, edge[i].l = l;
18     }
19     memset(a,0,sizeof(a));
20     int x;
21     for(int i = 0; i < k; i++)
22         scanf("%d",&x), a[x] = 1;
23     int ans = INF;
24     for(int i = 0; i < m; i++)
25     {
26         _ e = edge[i];
27         if(a[e.u] != a[e.v] && e.l < ans)
28         {
29             ans = e.l;
30         }
31     }
32     if(ans == INF)
33         printf("-1\n");
34     else
35         printf("%d\n", ans);
36     return 0;
37 }

 

C. Pythagorean Triples(勾股数构造)

题目大意:给你一个数,构造勾股数。

若m是奇整数,则m,(m^2-1)/2及(m^2+1)/2便是勾股数。不是奇数的时候,就要小小考虑一下哦。还有别漏了特判。

 1 #include <cstdio>
 2 typedef long long LL;
 3 int main()
 4 {
 5     LL n;
 6     while(~scanf("%I64d", &n))
 7     {
 8         if(n == 1 || n == 2) {printf("-1\n");continue;}
 9         if(n % 2 == 1)
10         {
11             printf("%I64d %I64d\n", (n * n - 1) / 2, (n * n + 1) / 2);
12         }
13         else
14         {
15             LL t = n;
16             while(t % 2 == 0)   t /= 2;
17             if(t == 1)  
18                 LL temp = n / 2;
19             else        
20                 printf("%I64d %I64d\n", (t * t - 1) / 2 * (n / t), (t * t + 1) / 2 * (n / t) ) ;
21         }
22     }
23     return 0;
24 }

 

解法二:

(1)n<=2,无解

(2)n为偶数  k - r = 2;k + r = n ^ 2 / 2;  解得k = n ^ 2 / 4 + 1, r = n ^ 2 / 4 - 1;

(3)n为奇数  k - r = 1;k + r = n ^ 2;    解得k = (n ^ 2 + 1) / 2, r = (n ^ 2 - 1) / 2;

 

D. Persistent Bookcase
题目大意:详见题目吧,各种数字代表各种操作。比较特殊的一点是会,返回到之前某次操作的之前。

离线处理+dfs

把每次操作看做一个点,和前一次操作的点相连。

这个dfs超级重要,画个图你就能明白了。

1 for(int i = 0;i < vec[v].size(); i++)
2 {
3         dfs(vec[v][i]);
4 }

 

 1 #include <cstdio>
 2 #include <vector>
 3 using namespace std;
 4 const int maxn = 1e5 + 5;
 5 int n, m, q;
 6 int type[maxn], ans[maxn], x[maxn], y[maxn], ma[1005][1005];
 7 int cnt;
 8 vector<int>vec[maxn];
 9 
10 void dfs(int v)
11 {
12     if(type[v] == 1 && ma[x[v]][y[v]] == 0)          cnt++, ma[x[v]][y[v]] = 1;
13     else if(type[v] == 2 && ma[x[v]][y[v]] == 1)     cnt--, ma[x[v]][y[v]] = 0;
14     else if(type[v] == 3)
15     {
16         for(int i = 0 ; i < m; i++)
17         {
18             if(ma[x[v]][i] == 1)    cnt--, ma[x[v]][i] = 0;
19             else                    cnt++, ma[x[v]][i] = 1;
20         }
21     }
22 
23     ans[v] = cnt;
24 
25     for(int i = 0;i < vec[v].size(); i++)
26     {
27         dfs(vec[v][i]);
28     }
29 
30     if(type[v] == 1)         cnt--, ma[x[v]][y[v]] = 0;
31     else if(type[v] == 2)    cnt++, ma[x[v]][y[v]] = 1;
32 
33 
34 
35     }
36     else if(type[v] == 3)
37     {
38         for(int i = 0;i < m ;i++)
39         {
40             if(ma[x[v]][i] == 0)         cnt++, ma[x[v]][i] = 1;
41             else if(ma[x[v]][i] == 1)    cnt--, ma[x[v]][i] = 0;
42         }
43     }
44 }
45 
46 int main()
47 {
48     scanf("%d%d%d", &n, &m, &q);
49     for(int i = 1; i <= q; i++)
50     {
51         scanf("%d%d", &type[i], &x[i]);
52         if(type[i] <= 2)    scanf("%d", &y[i]);
53         if(type[i] == 4)    vec[x[i]].push_back(i);
54         else                vec[i-1].push_back(i);
55     }
56     cnt = 0;
57     dfs(0);
58     for(int i = 1; i <= q; i++)
59         printf("%d\n", ans[i]);
60 
61     return 0;
62 }

 

E. Garlands

以上是关于Codeforces Round #368 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #368 (Div. 2) ABCD

Codeforces Round #368 (Div. 2)

Codeforces Round #368 (Div. 2) D. Persistent Bookcase 主席树套bitset

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)