传送门
把所有关键点提出来处理,然后分成相邻两个数分别贪心计算答案最后加起来。
现在把问题转化成了如下模型:
给你一个010101序列,你可以进行如下几种操作(四种操作代价不同):

  1. 删去一个1
  2. 删去一个0
  3. 删去一个1,并允许在其后面删去一个0
  4. 删去一个0,并允许在其后面删去一个1

然后比比四种操作的代价讨论一下即可。
代码:

#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
const int rlen=1<<18|1;
inline char gc(){static char buf[rlen],*ib,*ob;(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));return *ib++;
}
inline int read(){int ans=0;char ch=gc();while(!isdigit(ch))ch=gc();while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();return ans;
}
inline char readch(){char ch=gc();while(!isalpha(ch))ch=gc();return ch;
}
typedef long long ll;
typedef pair<int,int> pii;
const int N=600005;
int n,d,m,a[N],id[N];
const int mogic=1e6+7;
pii seg[N];
vector<bool>seq[N];
ll va[N],vb[N],vc[N],vd[N];
const ll inf=1e18;
struct Hash_table{vector<pii>ori[mogic];vector<int>idx[mogic];int tot;Hash_table(){tot=0;}inline int query(pii x){int t=((ll)x.fi*n%mogic+x.se)%mogic;for(ri i=ori[t].size()-1;~i;--i)if(ori[t][i]==x)return idx[t][i];return ori[t].push_back(x),idx[t].push_back(++tot),seg[tot]=pii(0,0),tot;}inline int check(pii x){int t=((ll)x.fi*n%mogic+x.se)%mogic;for(ri i=ori[t].size()-1;~i;--i)if(ori[t][i]==x)return idx[t][i];return 0;}
}S;
inline void update(ll&a,ll b){a=min(a,b);}
inline ll min(const ll&a,const ll&b,const ll&c){return a<b?(a<c?a:c):(b<c?b:c);}
inline ll query(vector<bool>f,ll a,ll b,ll c,ll d){if(!f.size())return 0;int ca=0,cb=0,cc=0,cd=0;for(ri i=0,p1=0,p2=0;i<f.size();++i){ca+=f[i];cb+=!f[i];if(f[i]){++p1;if(p2)--p2,++cd;}else{++p2;if(p1)--p1,++cc;}}if(a+b<=c&&a+b<=d)return a*ca+b*cb;if(a+b<=c)return d*cd+a*(ca-cd)+b*(cb-cd);if(a+b<=d)return c*cc+a*(ca-cc)+b*(cb-cc);vector<bool>ff;if(c==inf&&d==inf)return a*ca+b*cb;if(c<=d){int cnt=0,pre=0;for(ri i=1;i<=cb-cc;++i)ff.push_back(0);for(ri i=1;i<=ca-cc;++i)ff.push_back(1);return c*cc+query(ff,a,b,inf,d);}int cnt=0,pre=0;for(ri i=1;i<=ca-cd;++i)ff.push_back(1);for(ri i=1;i<=cb-cd;++i)ff.push_back(0);return d*cd+query(ff,a,b,c,inf);
}
int main(){n=read(),d=read();for(ri i=1;i<=d;++i)a[i]=read();for(ri t,i=1;i<d;++i){id[i]=S.query(pii(a[i],a[i+1]));t=S.query(pii(min(a[i+1],a[i]),max(a[i],a[i+1])));if(!seg[t].fi)seg[t]=pii(a[i],a[i+1]);seq[t].push_back(seg[t]==pii(a[i],a[i+1]));}for(ri i=1,up=S.tot;i<=up;++i)va[i]=vb[i]=vc[i]=vd[i]=inf;m=read();char op;for(ri t,f,i=1,u,v,w;i<=m;++i){u=read(),v=read(),op=readch(),w=read();if(!S.check(pii(u,v)))continue;t=S.query(pii(min(u,v),max(u,v)));f=seg[t]==pii(u,v);if(op=='O'){if(f)update(va[t],w);else update(vb[t],w);}else{if(f)update(va[t],w),update(vc[t],w);else update(vb[t],w),update(vd[t],w);}}ll ans=0;for(ri i=1,up=S.tot;i<=up;++i)ans+=query(seq[i],va[i],vb[i],vc[i],vd[i]);cout<<ans;return 0;
}

CSP-S模拟 环球巡演(hash表+贪心)相关推荐

  1. SCU4438 Censor(审查员) (KMP算法与模拟栈的应用 || HASH表与模拟栈的结合)

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text pp. Her j ...

  2. Hash表_拉链法_开放寻址法_模拟散列表

    文章目录 Hash表 作用 ① 拉链法 ② 开放寻址法 例 - 模拟散列表 > 拉链法 > 开放寻址法 Hash表 一般只有添加.查找 (注意:离散化为特殊的哈希方式,因为离散化需要提前保 ...

  3. Map和Set,简单模拟实现哈希表以及哈希表部分底层源码的分析

    目录 Map和Set的简单介绍 降低哈希冲突发生的概率以及当冲突发生时如何解决哈希冲突 简单模拟实现哈希表--1.key为整形:2.key为引用类型 哈希表部分底层源码的分析 1.Map和Set的简单 ...

  4. 暑假集训总结——区间DP,堆的概念及应用,STL(vector、set、pair、map、priority_queue),hash表,树状数组,图论

    序言: 经过长达十几天的集训,确实学了不少知识点.我想如果再不总结的话,6天之后又要忘完了. 所以发一篇具有总结回忆性的博客,供大家回忆. 目录会本人自己排列的时间的先后顺序来排列,可直接食用. 目录 ...

  5. hash表--c语言 字符串键值配对——(key, value)

    c语言键值配对--(key, value) 看一个C++项目时,其中解析配置文的部分引发了我的思考. 配置文件问普通字符文件,内容都是类似 如下: ipaddr=127.0.0.1 port=888 ...

  6. 从头到尾彻底解析Hash表算法

    从头到尾彻底解析Hash表算法 发布时间: 2013-10-02 10:26  阅读: 25156 次  推荐: 14   原文链接   [收藏]   作者:July.wuliming.pkuoliv ...

  7. 0x14.基础数据结构 — hash表与字符串hash

    目录 一.Hash表 1.AcWing 137. 雪花雪花雪花 0.hash表+链表 1.字符串的最小表示法 二.字符串hashhashhash 0.AcWing 138. 兔子与兔子 1.luogu ...

  8. 关于表单的java的程序_JAVA BOT程序模拟人类用户填写表单 并 发送

    仿真表单:BOT程序模拟人类用户填写表单 并 发送 抓取表单: HTTPSocket http = new HTTPSocket(); SocketFactory.setProxyHost(" ...

  9. 一步一步写算法(之hash表)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链 ...

最新文章

  1. 从头学起androidlt;AutoCompleteTextView文章提示文本框.十九.gt;
  2. Unicode 和 UTF-8关系
  3. 谈中型项目下的编码技巧二
  4. oracle选择语言设置,oracle本地语言变量设置
  5. 基于 Jenkins 快速搭建持续集成环境
  6. Drools 在告警关联分析中的应用
  7. 分组中查询不符合条件的组
  8. Entropay(欧贝通)
  9. python中get属性_python3中__get__,__getattr__,__getattribute__的区别
  10. 【基础】网络常见的9大命令,非常实用!
  11. 众专家推荐《移动微技(Mobile Widget)应用开发权威指南》
  12. 隐马尔科夫模型 和动态贝叶斯网络
  13. 关系抽取之PCNN(Piece-Wise-CNN)
  14. 分享餐饮管理组织结构流程图模板
  15. 百度搜索正式升级冰桶算法5.0!
  16. Window 重置所有网络驱动器的命令
  17. 虎牙在全球 DNS 秒级生效上的实践
  18. python标准库不需要导入即可使用其中的所有对象和方法_Python编程及应用-中国大学mooc-题库零氪...
  19. 微信小程序富文本插件mp-html
  20. 我的文章让老婆看到了……

热门文章

  1. 小程序referer
  2. 集成电路+太阳能发电+芯片制造+平板显示+锂电烘干+制药爱德华Edwards干式真空泵应用
  3. 【ReID】AlignedReID ++ : Dynamically matching local information for person re-identification
  4. JAVA利用Jacob将EXCEL转成PDF
  5. 【DIY创意】自制3D折纸装饰
  6. NumPy 布尔索引
  7. Gen2-UHF-RFID-Reader学习(一)概览
  8. 暑期实践课题 开题报告
  9. ajax 调用sqlserver,js连接sqlserver进行查询
  10. 计算机英语四级证书编号查询,英语四级99宿舍网查准考证号