CodeForces Round #585 (Div 2)

score:1336 (-45), pupil
Rank: 3313(又炸了,没啥好说的。。)

B.http://codeforces.com/contest/1215/problem/B

这个题万万没想到是dp,我的天,一开始直接上暴力,没仔细分析时间复杂度,估计是最近网络赛暴力惯了,没缓过神来。。。

分析见代码:

 1 /*
 2     设pos[i]表示以i为结尾的正区间,neg[i]表示以i为结尾的负区间。状态转移很容易了,见代码
 3     这次真的wa到自闭了,后来改了改竟然又tle,真的自闭到家。。。自闭到家。。。。。
 4 */
 5 #include <bits/stdc++.h>
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn = 1e6;
 9 ll pos[maxn], neg[maxn];
10 
11 int main()
12 {
13     int n; cin >> n;
14     int x;
15     ll maxpos, maxneg;
16 
17     maxpos = maxneg = 0;
18     for (int i = 1; i <= n; i++)
19     {
20         scanf("%d", &x);
21         if (x < 0)
22         {
23             pos[i] = neg[i - 1];
24             neg[i] = 1 + pos[i - 1];
25         }
26         else
27         {
28             pos[i] = 1 + pos[i - 1];
29             neg[i] = neg[i - 1];
30         }
31         maxpos += pos[i];
32         maxneg += neg[i];
33     }
34     cout << maxneg << " " << maxpos << endl;
35 }

C.http://codeforces.com/contest/1215/problem/C

这道题也是,贪心想到了(而且很好想),但是情况没处理好,当ab和ba的情况加起来是奇数的时候输出-1,不然一定有解;

当时以为ab和ba都为奇数的时候还需要一个aa或者bb来做媒介,但其实不用,ab可以自己交换,然后再跟ba交换,花费两次。

代码如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e6;
 4 
 5 int vis[maxn];
 6 char a[maxn], b[maxn];
 7 
 8 int main()
 9 {
10     int n; cin >> n;
11     int same, ab, ba;
12     vector<int> resa, resb;
13 
14     same = ab = ba = 0;
15     scanf("%s%s", a + 1, b + 1);
16     for (int i = 1; i <= n; i++)
17     {
18         vis[i] = a[i] == b[i] ? 1 : a[i] == 'a' ? 2 : 3;
19         if (vis[i] == 1)
20             continue;
21         else if (vis[i] == 2)
22             resa.push_back(i);
23         else resb.push_back(i);
24     }
25     if ((resa.size() + resb.size()) & 1) return cout << -1 << endl, 0;
26     printf("%d\n", resa.size() / 2 + resb.size() / 2 + (resa.size() % 2 ? 2 : 0));
27     for (int i = 1; i < resa.size(); i += 2)
28         printf("%d %d\n", resa[i - 1], resa[i]);
29     for (int i = 1; i < resb.size(); i += 2)
30         printf("%d %d\n", resb[i - 1], resb[i]);
31     if (resa.size() % 2)
32     {
33         printf("%d %d\n", resa[resa.size() - 1], resa[resa.size() - 1]);
34         printf("%d %d\n", resb[resb.size() - 1], resa[resa.size() - 1]);
35     }
36 }

猜你喜欢

转载自www.cnblogs.com/liuwenhan/p/11526711.html