• Educational Codeforces Round 166 (Rated for Div. 2)题解(A,B,D)


    今天真的巨抽象,第三题没做出来,但是第四题过了,也是准备上小分了,因为nnd不按那个分数,而是按照做题数,直接废了

    A. Verify Password

     题解:小丑水题一个人,按照ASCII码比较一遍直接过了,最主要要不是一开始卡了3分钟,我感觉能直接在第一题打进前一千 

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. int t;
    5. string s;
    6. signed main()
    7. {
    8. cin>>t;
    9. while(t--)
    10. {
    11. int flag=1;
    12. cin>>s;
    13. int len=s.size();
    14. for(int i=1;i<len;i++)
    15. {
    16. if(s[i]-'0'<s[i-1]-'0')
    17. {
    18. flag=0;
    19. }
    20. }
    21. if(flag==1)
    22. printf("YES\n");
    23. else
    24. printf("NO\n");
    25. }
    26. return 0;
    27. }

    B. Increase/Decrease/Copy

    题解,也不难,主要是去考虑最后一个位置的步数,总共就两种方法,一是先去a数组找到合适的放在最后一个位置,二是在a向b发生变化的时候去放在最后一个位置,找到两个方法的最小的一个步数即可, 别的位置直接一个绝对值秒了

    1. #include
    2. using namespace std;
    3. #define int long long
    4. int t;
    5. int n;
    6. int a[200005];
    7. int b[200005];
    8. signed main()
    9. {
    10. cin>>t;
    11. while(t--)
    12. {
    13. int sum=0;//统计总步数
    14. cin>>n;
    15. for(int i=1;i<=n;i++)
    16. cin>>a[i];
    17. for(int i=1;i<=n+1;i++)
    18. {
    19. cin>>b[i];
    20. }
    21. for(int i=1;i<=n;i++)
    22. {
    23. sum+=labs(b[i]-a[i]);
    24. }
    25. int num1=0x3f3f3f3f;//先找差值,再变
    26. int flag1=0;;
    27. int num2=0x3f3f3f3f;//先变,再转移
    28. int flag2=0;
    29. //第一中方案
    30. for(int i=1;i<=n;i++)
    31. {
    32. if(labs(a[i]-b[n+1])
    33. {
    34. num1=labs(a[i]-b[n+1]);
    35. }
    36. }
    37. num1+=1;//第一种方案找到的最小步数
    38. //第二种方案
    39. for(int i=1;i<=n;i++)
    40. {
    41. int ans=0;
    42. if(b[n+1]>=max(b[i],a[i])||b[n+1]<=min(a[i],b[i]))
    43. ans=labs(b[n+1]-b[i])+1;
    44. else if(b[n+1]<max(b[i],a[i])&&b[n+1]>min(b[i],a[i]))
    45. ans=1;
    46. num2=min(ans,num2);
    47. }
    48. sum+=min(num1,num2);
    49. cout<"\n";
    50. }
    51. return 0;
    52. }

    D. Invertible Bracket Sequences

     题解:这题我们统计序列前i个有多少个左括号是剩余的,然后思考(l,r)的选择有何特征:可以发现,若第i位之前所剩余的左括号跟第j位之前所剩余的左括号数量一样,那么(i+1,j)这个区间就可能被选择,否则一定不会被选择。

    然后就可以用前缀和加双指针很轻松的AC了,平常学长给我说的那个stl我也有用,也算是今天用到了吧,set以及pair,平常还是pair用的多一点

    因此我们将剩余左括号数量相同的位置放一起,然后考虑其区间能否真的被选中。通过观察可以发现:若之间位置的剩余左括号数量小于等于第位之前所剩余的左括号的两倍,那么这个区间就可以被选中,因此本题转换成区间最值(RMQ问题)。

     光这样的朴素算法复杂度是O(n^2logn),这不就直接爆了,怎么能这样做,但是枚举位置时末尾也是非递减的,因而可以用双指针来优化成为O(nlogn)然后就AC了

    合法的区间要满足LR的前缀和相等,然后MAX  L~R<=2*前缀和

    1. #include
    2. #define int long long
    3. using namespace std;
    4. const int N = 200010;
    5. int n, pre[N];
    6. char s[N];
    7. pair<int, int> p[N];
    8. int cnt[N];
    9. setint, int> > pos[N];
    10. void init()
    11. {
    12. memset(pre,0,sizeof(pre));
    13. return ;
    14. }
    15. signed main()
    16. {
    17. int t;
    18. cin>>t;
    19. while(t--)
    20. {
    21. init();
    22. scanf("%s", s + 1);
    23. n = strlen(s + 1);
    24. for(int i = 0; i <= n; i++)
    25. pos[i].clear(), cnt[i] = 0;
    26. for(int i = 1; i <= n; i++)
    27. {
    28. if(s[i] == '(') pre[i] = pre[i - 1] + 1;
    29. else pre[i] = pre[i - 1] - 1;
    30. p[i] = make_pair(pre[i], i);
    31. }
    32. sort(p + 1, p + n + 1, greaterint, int> >());
    33. set<int> ins;
    34. int ans = 0, R = 0;
    35. for(int i = 1; i <= n; i++)
    36. {
    37. while(R < n && p[R + 1].first > p[i].first * 2)
    38. ins.insert(p[R + 1].second), R++;
    39. if(ins.upper_bound(p[i].second) == ins.end())
    40. {
    41. ans += pos[p[i].first].size();
    42. }
    43. else
    44. {
    45. auto it1 = ins.upper_bound(p[i].second);
    46. auto it2 = pos[p[i].first].lower_bound(make_pair(*it1, 0));
    47. ans += pos[p[i].first].size();
    48. if (it2 != pos[p[i].first].end()) ans -= (*it2).second;
    49. }
    50. cnt[p[i].first]++;
    51. pos[p[i].first].insert(make_pair(p[i].second, cnt[p[i].first]));
    52. }
    53. printf("%lld\n", ans);
    54. }
    55. return 0;
    56. }

  • 相关阅读:
    vue项目因内存溢出启动报错
    Python使用OpenCV加载彩色图像为BGR图、计算每个图像通道的均值(mean of each channel)、可视化图像在每个通道的均值
    Coinbase:Celer Bridge攻击分析
    leetcode-链表类题目
    【设计模式】适配器模式
    智能安防监控如何助力汽车4S店信息化精细化管理?最大程度做到降本增效?
    二、Eclipse 安装(Neon 版本)
    跳石板(牛客)
    推荐系统常用知识点
    div+css 设备看板样式
  • 原文地址:https://blog.csdn.net/2301_80475191/article/details/139338046