[关闭]
@2368860385 2018-07-05T06:13:05.000000Z 字数 2429 阅读 206

976——Educational Codeforces Round 43 (Rated for Div. 2)

codeforces

http://codeforces.com/contest/976

2018.6.27模拟参加(ABC)
2018.6.27整理(E)


A:

一个01字符串,可以两种操作,交换相邻的,两个相邻的11变成1
问最后二进制数最小是多少,不含前导0。

所有的1最后一定变成一个1,再把0填上即可。特判0的情况!

B:

此处输入图片的描述
这样走,问走k步后在哪?

模拟

C:

一堆区间,问有没有一个区间包含一个区间(L1<=L2 && R2<=R1)

其实就是求逆序对。

昨天刚学了CDQ分治,发现这是典型的二维偏序问题。

D:

E:

很多怪兽,每个怪兽有hp(生命),和dmg(伤害)两个属性。
有两个操作。
第一个操作:指定一个怪兽,hp*2
第二个操作:指定一个怪兽,dmg = hp
第一个有a个,第二个有b个,问最大伤害和。

思路:模拟参加时想的dp(预处理后,背包),然后发现dp空间开不下,换状态表示,还是不行。
正解:首先一个结论:所以的a操作只对一个怪兽进行,所以判断一下对哪个怪兽使用就好了。


代码:

A:

  1. int main() {
  2. int n;cin >> n;
  3. scanf("%s",s+1);
  4. int cnt = 0;
  5. for (int i=1; i<=n; ++i) {
  6. if (s[i] == '1') cnt ++;
  7. }
  8. if (cnt) {
  9. printf("1");
  10. for (int i=1; i<=(n-cnt); ++i) printf("0");
  11. return 0;
  12. }
  13. for (int i=1; i<=n; ++i) printf("0");
  14. return 0;
  15. }

B:

  1. int main() {
  2. LL n,m,k;
  3. cin >> n >> m >> k;k++;
  4. if (k <= n) {
  5. cout << k << " 1";return 0;
  6. }
  7. k -= n;
  8. LL a = (k - 1) / (m - 1) + 1;
  9. a = n - a + 1;
  10. LL b = k % (m - 1);
  11. if (b==0) b = m - 1;
  12. if (a & 1) cout << a << " " << (m-1)-b+2;
  13. else cout << a << " " << b + 1;
  14. return 0;
  15. }

C:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. inline int read() {
  5. int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
  6. for (;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
  7. }
  8. const int N = 500010;
  9. struct Edge{
  10. int a,b,id;
  11. bool operator < (const Edge &x) const {
  12. return a==x.a ? b>x.b : a<x.a; // 必须是b > x.b
  13. }
  14. }A[N],B[N];
  15. int X = -1,Y = -1;
  16. void CDQ(int L,int R) {
  17. if (L == R) return ;
  18. int M = (L + R) >> 1;
  19. CDQ(L,M);
  20. CDQ(M+1,R);
  21. int i = L,j = M + 1,k = L,tmp;
  22. while (i <= M && j <= R) {
  23. if (A[i].b >= A[j].b) {
  24. printf("%d %d",A[j].id,A[i].id);
  25. exit(0);
  26. }
  27. else {
  28. B[k++] = A[j++];
  29. }
  30. }
  31. while (i <= M) B[k++] = A[i++];
  32. while (j <= R) B[k++] = A[j++];
  33. for (i = L; i <= R; ++i) A[i] = B[i];
  34. }
  35. int main() {
  36. int n = read();
  37. for (int i=1; i<=n; ++i) {
  38. A[i].a = read(),A[i].b = read(),A[i].id = i;
  39. }
  40. sort(A+1,A+n+1);
  41. CDQ(1,n);
  42. printf("-1 -1");
  43. return 0;
  44. }

D:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. inline int read() {
  5. int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
  6. for (;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
  7. }
  8. const int N = 500100;
  9. struct Node{ LL hp,dmg; }A[N];
  10. int main() {
  11. int n = read();LL a = read(),b = read();
  12. LL sum = 0;
  13. b = min(b,(LL)n);
  14. for (int i=1; i<=n; ++i) {
  15. A[i].hp = read(),A[i].dmg = read();
  16. sum += A[i].dmg; // 初始答案值
  17. }
  18. if (!b) return !printf("%lld",sum);
  19. sort(A+1,A+n+1,[](Node x,Node y){ // 排序
  20. return x.hp-x.dmg > y.hp-y.dmg;
  21. });
  22. for (int i=1; i<=b; ++i) //初始时进行b操作后的答案值
  23. sum += max(0LL,A[i].hp - A[i].dmg);
  24. LL Ans = sum;
  25. for (int i=1; i<=n; ++i) {
  26. LL tans = sum;
  27. if (i <= b) {
  28. tans += max(A[i].hp<<a, A[i].dmg) - A[i].dmg; // 第i个的怪兽的生命值进行a次操作,后进行b操作
  29. tans -= max(0LL, A[i].hp - A[i].dmg); // 减去第i个怪兽的初始b操作。
  30. }
  31. else {
  32. tans += max(A[i].hp<<a, A[i].dmg) - A[i].dmg;
  33. tans -= max(0LL, A[b].hp - A[b].dmg);
  34. }
  35. Ans = max(Ans,tans);
  36. }
  37. return !(cout << Ans);
  38. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注