D题:https://codeforces.com/contest/1321/problem/D

题意:题目给个有向图,然后给一段序列,我们要沿着这个序列走,问走的过程中当前点到t的最短路会重构多少次,输出最小最大可能

分析:终点是不变的,我们在按照序列走到某个位置的时候,到终点有若干条长度相同的最短路,也由此有最大最小可能;

   我们考虑最短路的dis[](各点到终点的距离)我们模拟走的过程,当前点u,下一个点v,很明显地,当dis[u]+1!=dis[v]时,肯定会重构;

   当等于是,最小可能就不要加贡献,那么最大就重u的出边造出有没有另一条满足dis[u]+1==dis[k](k!=v)若存在则最大可能加一贡献

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int inf=0x3f3f3f3f;
  5. const int M=2e5+6;
  6. #define pb push_back
  7. struct node{
  8. int v,cost;
  9. node(int vv=0,int cc=0):v(vv),cost(cc){}
  10. bool operator<(const node &b)const{
  11. return cost>b.cost;
  12. }
  13. };
  14. struct edge{
  15. int v,cost;
  16. edge(int vv=0,int cc=0):v(vv),cost(cc){}
  17. };
  18. vector<edge>g1[M],g2[M];
  19. int vis[M],dis[M],a[M];
  20. void dij(int n,int s){
  21. memset(vis,0,sizeof(vis));
  22. for(int i=1;i<=n;i++)
  23. dis[i]=inf;
  24. priority_queue<node>que;
  25. while(!que.empty())
  26. que.pop();
  27. dis[s]=0;
  28. que.push(node(s,0));
  29. while(!que.empty()){
  30. node now=que.top();
  31. que.pop();
  32. int u=now.v;
  33. if(vis[u])
  34. continue;
  35. vis[u]=1;
  36. for(int i=0;i<g2[u].size();i++){
  37. int v=g2[u][i].v;
  38. int cost=g2[u][i].cost;
  39. if(!vis[v]&&dis[v]>dis[u]+cost){
  40. dis[v]=dis[u]+cost;
  41. que.push(node(v,dis[v]));
  42. }
  43. }
  44. }
  45. }
  46. int main(){
  47. int n,m;
  48. scanf("%d%d",&n,&m);
  49. while(m--){
  50. int u,v;
  51. scanf("%d%d",&u,&v);
  52. g1[u].pb(edge(v,1));
  53. g2[v].pb(edge(u,1));
  54. }
  55.  
  56. scanf("%d",&m);
  57. for(int i=1;i<=m;i++)
  58. scanf("%d",&a[i]);
  59. dij(n,a[m]);
  60.  
  61. int ans1=0,ans2=0;
  62. for(int i=2;i<=m;i++){
  63. int x=a[i-1],y=a[i];
  64. if(dis[x]!=dis[y]+1)
  65. ans1++,ans2++;
  66. else{
  67. int flag=0;
  68. for(int i=0;i<g1[x].size();i++){
  69. int v=g1[x][i].v;
  70. if(v!=y&&dis[x]==dis[v]+1){
  71. flag=1;
  72. break;
  73. }
  74. }
  75. ans2+=flag;
  76. }
  77. }
  78. printf("%d %d\n",ans1,ans2);
  79. return 0;
  80. }

E题:

题意:给定n个剑,m个盾,每个剑和盾都有俩个属性val和cost,p个怪兽,每个怪兽都有三个属性vala(对应剑的属性),valb(对应盾的属性),cost。题目要求一定要选一剑一盾,会对答案造成cost的消耗;你可以把属性严格小于你所选的武器的怪兽消灭来得到怪兽的cost加到贡献上,要求输出最大贡献;

分析:我们考虑枚举每一个vala作为最大值,比vala小的怪兽肯定在候选队列中,然后考虑选取哪一位置的盾来使答案最优;

   因为我们枚举的这个vala最大值,所以我们必须在[valb+1,max]中选取盾,涉及到区间,也是求区间最大值,我们考虑能否用线段树解决,于是我们把每次枚举到的valb,在线段树的[valx+1,max]加上它的cost,表示我们选了盾的属性在[valb+1,max],就可以得到他的贡献cost;

   在vala枚举的过程中我们肯定要先把vala进行升序处理,就把已经处理过的加到线段树上,区间取最大值即可;

   我们用线段树解决的盾和怪兽对盾属性的处理,那么对于剑和怪兽对剑属性,我们只要在剑属性升序的序列中找到第一个比当前vala大的位置pos,再在[pos,n]中找cost最小即可,这俩者相加就是当前vala最为最大值的最优解;

   ///实际也就分出俩部分处理,一部分(剑/盾  对 怪兽)和另一部分(剑/盾  对怪兽),任意一个用一个数据结构维护剩下的直接贪心解决;

  1. using namespace std;
  2. typedef long long ll;
  3. const int inf=0x3f3f3f3f;
  4. const ll INF=1e18;
  5. const int M=1e6+6;
  6. #define pb push_back
  7. #define lson root<<1,l,midd
  8. #define rson root<<1|1,midd+1,r
  9. struct node{
  10. ll val,cost;
  11. bool operator<(const node &no)const{
  12. return val<no.val;
  13. }
  14. }a[M+6],b[M+6];
  15. struct Node{
  16. ll vala,valb,cost;
  17. bool operator<(const Node &No)const{
  18. return vala<No.vala;
  19. }
  20. }c[M+6];
  21. ll tr[(M<<2)+6],ly[(M<<2)+6];
  22. ll all[M+6],tmp[M+6],suf[M+6];
  23. void up(int root){
  24. tr[root]=max(tr[root<<1],tr[root<<1|1]);
  25. }
  26. void pushdown(int root,int l,int r){
  27. if(ly[root]){
  28. ll x=ly[root];
  29. tr[root<<1]+=x;
  30. ly[root<<1]+=x;
  31. tr[root<<1|1]+=x;
  32. ly[root<<1|1]+=x;
  33. ly[root]=0;
  34. }
  35. }
  36. void build(int root,int l,int r){
  37. if(l==r){
  38. tr[root]=-tmp[l];
  39. return ;
  40. }
  41. int midd=(l+r)>>1;
  42. build(lson);
  43. build(rson);
  44. up(root);
  45. }
  46. void update(int L,int R,ll c,int root,int l,int r){
  47. if(L<=l&&r<=R){
  48. tr[root]+=c;
  49. ly[root]+=c;
  50. return ;
  51. }
  52. pushdown(root,l,r);
  53. int midd=(l+r)>>1;
  54. if(L<=midd)
  55. update(L,R,c,lson);
  56. if(R>midd)
  57. update(L,R,c,rson);
  58. up(root);
  59. }
  60. ll query(int L,int R,int root,int l,int r){
  61. if(L<=l&&r<=R){
  62. return tr[root];
  63. }
  64. if(ly[root])
  65. pushdown(root,l,r);
  66. int midd=(l+r)>>1;
  67. ll res=-INF;
  68. if(L<=midd)
  69. res=query(L,R,lson);
  70. if(R>midd)
  71. res=max(res,query(L,R,rson));
  72. up(root);
  73. return res;
  74. }
  75. int main(){
  76. int n,m,p;
  77. scanf("%d%d%d",&n,&m,&p);
  78. ll minn1=INF,minn2=INF;
  79. for(int i=1;i<=n;i++)
  80. scanf("%lld%lld",&a[i].val,&a[i].cost),minn1=min(minn1,a[i].cost);
  81. for(int i=1;i<=m;i++)
  82. scanf("%lld%lld",&b[i].val,&b[i].cost),minn2=min(minn2,b[i].cost);
  83. ll ans=-minn1-minn2;///因为题目说必须要选盾和剑,所以不考虑消灭了怪兽就直接减去最小的;
  84. sort(a+1,a+1+n);
  85. sort(b+1,b+1+m);
  86. for(int i=1;i<=n;i++)
  87. all[i]=a[i].val;
  88. // all[n+1]=INF;
  89. ///求i~n的剑消耗的最小值
  90. suf[n+1]=INF;
  91. for(int i=n;i>=1;i--)
  92. suf[i]=min(a[i].cost,suf[i+1]);
  93. ///初始化线段树,最优的贡献肯定是若干个价值为i的b的cost的最小的负数
  94. for(int i=0;i<=M;i++)
  95. tmp[i]=INF;
  96. for(int i=1;i<=m;i++)
  97. tmp[b[i].val]=min(tmp[b[i].val],b[i].cost);
  98. build(1,1,M-1);
  99. for(int i=1;i<=p;i++)
  100. scanf("%lld%lld%lld",&c[i].vala,&c[i].valb,&c[i].cost);
  101. sort(c+1,c+1+p);
  102. for(int i=1;i<=p;i++){
  103. // cout<<ans<<endl;
  104. update(c[i].valb+1,M-1,c[i].cost,1,1,M-1);
  105. ll res1=query(c[i].valb+1,M-1,1,1,M-1);///盾和怪兽对答案的贡献
  106. // cout<<res1<<endl;
  107. int pos=upper_bound(all+1,all+1+n,c[i].vala)-all;
  108. ll res2=suf[pos];///当前情况下选择的最优的剑的消耗
  109. ans=max(ans,res1-res2);
  110. }
  111. printf("%lld\n",ans);
  112. return 0;
  113. }
  114. contest/1321/problem/E

Codeforces Round #625 Div. 2 D E的更多相关文章

  1. Codeforces Round #625 (Div. 2)

    Contest Info Practice Link Solved A B C D E F 4/6 O O Ø  Ø     O 在比赛中通过 Ø 赛后通过 ! 尝试了但是失败了 - 没有尝试 Sol ...

  2. Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) D. Navigation System(有向图,BFS,最短路)

    题意: n 点 m 边有向图,给出行走路径,求行走途中到路径终点最短路变化次数的最小值和最大值 . 思路 : 逆向广搜,正向模拟. #include <bits/stdc++.h> usi ...

  3. Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) C. Remove Adjacent(字符串,贪心,枚举)

    题意: 给你一个由小写字母组成的字符串,若串中两个相邻元素字典序中也相邻,移除较大字母,问最多能移除多少个字母. 思路: 从大到小依次枚举. Tips: 注意下标的处理. 以小消大: #include ...

  4. Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) B. Journey Planning(映射)

    题意: 已知 n 所城市(从 1 至 n 编号)及其美丽值,选取一条旅行路线,满足路线中两两城市美丽值之差等于编号之差,求所有旅行路线中美丽值的最大值. 思路: 美丽值与编号作差,差值为键,映射累加 ...

  5. Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) A. Contest for Robots(数学)

    题意: n 道题,2 个答题者,已知二者的做题情况,你是受贿裁判,可以给每题指定分值(≥1),求甲乙分数(甲>乙)相差最小时最大分值的最小值. 思路: 统计只有甲或乙做出的题目数. 加一取下整判 ...

  6. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  7. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  8. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  9. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

随机推荐

  1. 九个最容易出错的 Hive sql 详解及使用注意事项

    阅读本文小建议:本文适合细嚼慢咽,不要一目十行,不然会错过很多有价值的细节. 文章首发于公众号:五分钟学大数据 前言 在进行数仓搭建和数据分析时最常用的就是 sql,其语法简洁明了,易于理解,目前大数 ...

  2. 常用 .gitignore 模板

    前言 每次建项目的时候可以直接复制了,也算是方便自己,以后发现少的会更新 正文 作用 git提交时忽略文件 文件名 .gitignore Python # Byte-compiled / optimi ...

  3. 【JavaWeb】AJAX 请求

    AJAX 请求 什么是 AJAX AJAX(Asynchronous JavaScript And XMl),即异步 JS 和 XML.是指一种创建交互式网页应用的网页开发技术. AJAX 是一种浏览 ...

  4. Shiro的认证与授权

    shiro实战教程 一.权限管理 1.1什么是权限管理 基本上涉及到用户参与的系统都需要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以 ...

  5. win10打开IIS服务并发布网站

    1.打开控制面板 win+x后点击控制面板 2.点击程序集下边的解除安装程式 3.点击开启或关闭windows功能 4.找到Internet information services并勾选前面的复选框 ...

  6. 浅谈JavaScript代码性能优化

    可以通过https://jsbench.me/测试网站完成性能测试. 一.慎用全局变量 1.全局变量定义在全局执行上下文,是所有作用域链的顶端,在局部作用域中没找到的变量都会到全局变量中去查找,所以说 ...

  7. java基础-01代理类

    简单的代理类实现案例主实现类:ProxyTestimport java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;im ...

  8. Mac下IDEA激活Jrebel

    第一步:在idea中下载jrebel,过程省略 第二步:配置反向代理工具 Windows 版:http://blog.lanyus.com/archives/317.html MAC 版: 安装hom ...

  9. 容器调度 • Docker网络 • 持续交付 • 动态运行应用程序 部署的多元化

    <英雄联盟>在线服务运维之道 - InfoQ https://www.infoq.cn/article/running-online-services-riot/ 第一章 简 介 我是Jo ...

  10. 某cms最新版前台RCE漏洞(无需任何权限)2020-03-15

    漏洞文件:application/common/controller/Base.php 中的 getAddonTemplate 方法: 错误的使用了public,导致我们可以直接外部访问. 然后使用了 ...