• Codeforces Round 888 (Div. 3)


    D

    Prefix Permutation Sums

    题意:有一个长度为n的前缀和数组,现在该数组丢了一个元素,问该数组能否匹配一个长度为n的排列。

    思路:

    求出该数组的差值后,只有两种情况是YES:
    ①1~n之间恰好有两个数的位置上是空的,并且恰好有一个数多余的数,等于这两个位置加起来,这样就能使得1~n填满。

    ②1~n之间恰好有一个数的位置上是空的。此时只需将这缺的数放到数组最后面,就能令数组合法。
     

    1. void solve() {
    2. unordered_map<int,int>mp;
    3. int n,sum=0,cnt=0,now;
    4. cin>>n;
    5. for(int i=1; i
    6. cin>>a[i];
    7. mp[a[i]-a[i-1]]++;
    8. }
    9. for(int i=1; i<=n; i++) {
    10. if(!mp[i]) {
    11. cnt++;
    12. sum+=i;
    13. }
    14. }
    15. for(auto x:mp) {
    16. if(x.second>=2||x.first>n) {
    17. now=x.first;
    18. break;
    19. }
    20. }
    21. if(now==sum&&cnt==2||cnt==1)yes;
    22. else no;
    23. }

    E

    Nastya and Potions

    题意:共有n种药水,每种药水的价格为c[i];药水也可以通过其他几种药水合成,合成使用的药水会被消耗。现在有k种药水无限供应,问获得每种药水的最小花费。
    思路:我们通过记忆化搜索(dfs) 的方法来确定他每一种原料的最小花销,这样就能得到通过合成路线相加获得该药剂的最小花销。之后我们将这个价格和市场价格做比对,保留最小值即可,并记得标记已经得到的答案,已便用它来更新答案.

    1. #include
    2. #define ios ios::sync_with_stdio(0), cin.tie(0)
    3. #define PII pair
    4. #define int long long
    5. typedef long long ll;
    6. const int N = 1e6 + 10;
    7. const int inf = 0x3f3f3f3f;
    8. using namespace std;
    9. int c[N];
    10. int st[N];
    11. vector<int> e[N];
    12. int dfs(int u)
    13. {
    14. if (st[u] != -1)
    15. return st[u];
    16. if (e[u].size() == 0)
    17. return c[u];
    18. int sum = 0;
    19. for (auto x : e[u])
    20. {
    21. sum += dfs(x);
    22. }
    23. return st[u] = min(c[u], sum);
    24. }
    25. void solve()
    26. {
    27. int n, k;
    28. cin >> n >> k;
    29. for (int i = 1; i <= n; i++)
    30. cin >> c[i], e[i].clear(), st[i] = -1;
    31. for (int i = 1; i <= k; i++)
    32. {
    33. int x;
    34. cin >> x;
    35. c[x] = 0;
    36. }
    37. for (int i = 1; i <= n; i++)
    38. {
    39. int x;
    40. cin >> x;
    41. for (int j = 1; j <= x; j++)
    42. {
    43. int xx;
    44. cin >> xx;
    45. e[i].push_back(xx);
    46. }
    47. }
    48. for (int i = 1; i <= n; i++)
    49. cout << dfs(i) << " \n"[i == n];
    50. }
    51. signed main()
    52. {
    53. // freopen("input.txt","r",stdin);
    54. // freopen("output.txt","w",stdout);
    55. ios;
    56. int _t = 1;
    57. cin >> _t;
    58. while (_t--)
    59. solve();
    60. system("pause");
    61. return 0;
    62. }

    F

    Lisa and the Martians

    题意:给定n和k,给你n个数,其中每个数a[i]<2^k。从中选取两个数,和一个任意数x(0 <= x < 2^k)。求的最大值。

    思路:考虑每一个二进制位,若ai与aj该位都为1,那么我们就让x该位为0;若ai和aj该位都为0,那么我们就让x该位为1.只有二进位上相同时,我们才能得到该位的贡献。所以我们让ai和aj同或后最大,也就是ai和aj异或后最小。
    结论,n个数的最小异或对答案就是排序后最小的相邻异或。
     

    1. #include
    2. #define ios ios::sync_with_stdio(0),cin.tie(0)
    3. #define PII pair
    4. typedef long long ll;
    5. const int N=1e6+10;
    6. const int inf=0x3f3f3f3f;
    7. using namespace std;
    8. int n,k;
    9. int a[N];
    10. void solve()
    11. {
    12. vectorv;
    13. cin>>n>>k;
    14. for(int i=1;i<=n;i++)
    15. {
    16. cin>>a[i];
    17. v.push_back({a[i],i});
    18. }
    19. sort(v.begin(),v.end());
    20. int mi=2e9,ansi=-1,ansj=-1;
    21. for(int i=1;i
    22. {
    23. int t=(v[i].first^v[i-1].first);
    24. if(t
    25. {
    26. mi=t;
    27. ansi=v[i].second;
    28. ansj=v[i-1].second;
    29. }
    30. }
    31. cout<' '<' '<<((1<-1)-a[ansi]<<'\n';
    32. }
    33. signed main()
    34. {
    35. //freopen("input.txt","r",stdin);
    36. //freopen("output.txt","w",stdout);
    37. ios;
    38. int _t=1;
    39. cin>>_t;
    40. while(_t--) solve();
    41. system("pause");
    42. return 0;
    43. }

    G

    Vlad and the Mountains

    题意:有n座山,告诉你每座山的高度h[i]。从山i到山j的力量花费为h[j]-h[i]。有q次询问,每次询问初始力量为e能否从a到b山。
    思路:从a到b到c的能量花费为hb-ha+hc-hb=hc-ha,hc-ha<=e才行,即我们能从顶点a出发,可以到达任何一个顶点,且路径不经过高度大于ha+e的顶点。
    我们可以将边(a,b)的边权看作max(ha,hb).因为hahb时,max(ha,hb)<=ha+e.

    询问(a,b,u)等价于只用边权<=ha+e的边 能否 联通a b节点。离线, 将询问按 (ℎa+e) 值非降序排列,将边也是按max(hu , hv)非递减排序,这样就转化为了并查集可以维护的加边操做,对于每个询问,我们依次按排序后的边加入,这样就不要每询问一次就从头遍历一次边了,我们加入的边的max(hu, hv)一定是满足后面的要求的,所以对于后面的边如果可以加边就加边,不行的话就判断当前是否联通了
     

    1. #include
    2. #define ios ios::sync_with_stdio(0),cin.tie(0)
    3. #define PII pair
    4. typedef long long ll;
    5. const int N=1e6+10;
    6. const int inf=0x3f3f3f3f;
    7. using namespace std;
    8. int n,m;
    9. int fa[N];
    10. int h[N];
    11. struct Edge{
    12. int u,v,w;
    13. };
    14. struct Query{
    15. int a,b,e;
    16. int num;
    17. bool ok;
    18. };
    19. bool cmp(Edge a,Edge b)
    20. {
    21. return a.w
    22. }
    23. bool cmp1(Query x,Query y)
    24. {
    25. return x.e+h[x.a]
    26. }
    27. bool cmp2(Query x,Query y)
    28. {
    29. return x.num
    30. }
    31. int getfa(int x)
    32. {
    33. return fa[x]==x? x:fa[x]=getfa(fa[x]);
    34. }
    35. void solve()
    36. {
    37. cin>>n>>m;
    38. for(int i=1;i<=n;i++) fa[i]=i;
    39. for(int i=1;i<=n;i++) cin>>h[i];
    40. vectoredge;
    41. for(int i=1;i<=m;i++)
    42. {
    43. int u,v,w;
    44. cin>>u>>v;
    45. w=max(h[u],h[v]);
    46. edge.push_back({u,v,w});
    47. }
    48. int q;
    49. cin>>q;
    50. vectorquery;
    51. for(int i=1;i<=q;i++)
    52. {
    53. int a,b,e;
    54. cin>>a>>b>>e;
    55. query.push_back({a,b,e,i,0});
    56. }
    57. sort(edge.begin(),edge.end(),cmp);
    58. sort(query.begin(),query.end(),cmp1);
    59. int p=0;
    60. for(int i=0;i
    61. {
    62. int a=query[i].a,b=query[i].b,e=query[i].e;
    63. while(p
    64. {
    65. int u=edge[p].u,v=edge[p].v,w=edge[p].w;
    66. if(getfa(u)!=getfa(v))
    67. {
    68. fa[getfa(u)]=getfa(v);
    69. }
    70. p++;
    71. }
    72. if(getfa(a)==getfa(b))
    73. {
    74. query[i].ok=1;
    75. }
    76. }
    77. sort(query.begin(),query.end(),cmp2);
    78. for(int i=0;i
    79. if(query[i].ok) cout<<"YES\n";
    80. else cout<<"NO\n";
    81. }
    82. signed main()
    83. {
    84. //freopen("input.txt","r",stdin);
    85. //freopen("output.txt","w",stdout);
    86. ios;
    87. int _t=1;
    88. cin>>_t;
    89. while(_t--) solve();
    90. system("pause");
    91. return 0;
    92. }

  • 相关阅读:
    Python:乘积尾零
    SD-WAN让跨境网络访问更快、更安全!
    使用Docker部署Gitlab的记录
    Unity3D Shader数据传递语法详解
    高防CDN:保障网络安全的未来之路
    TPM零知识学习二—— 相关链接和页面
    经济利益是黑客攻击主要驱动力
    如何解决php脚本运行占用内存过大无法释放或者内存不足的问题
    【Web】记录CISCN 2023 西南半决赛 seaclouds题目复现
    高级篇之ENC2-V2编码器的RTSP另一个妙用(长地址转换为短地址)
  • 原文地址:https://blog.csdn.net/qq_62615329/article/details/132993772