当前位置: 首页 > wzjs >正文

好用的海报设计网站淮安网站网站建设

好用的海报设计网站,淮安网站网站建设,慢慢网站建设,wordpress首页被篡改思路 将点 i i i 视为固定点, 点 j j j 视为灵活点,其中 s i 1 s_{i} 1 si​1, s j 0 s_{j} 0 sj​0。维护四个队列,其中 q 0 q_{0} q0​ 和 q 1 q_{1} q1​ 分别维护还没有被选用的固定点 和 灵活点, Q 0 Q…

思路

将点 i i i 视为固定点, 点 j j j 视为灵活点,其中 s i = 1 s_{i} = 1 si=1 s j = 0 s_{j} = 0 sj=0。维护四个队列,其中 q 0 q_{0} q0 q 1 q_{1} q1 分别维护还没有被选用的固定点 和 灵活点, Q 0 Q_{0} Q0 Q 1 Q_{1} Q1 分别维护 正在被使用的固定点 和 灵活点。此外,维护一个 rnum 表示当前位置右边(包含当前位置)正在被使用的固定点和灵活点的总数,维护 dis 表示当前的最优答案.

依次求解位置 i = 0, 1, …, n - 1 情况下的最优解,并动态更新队列和rnum,在此基础上探索四个队列的一些基本性质:
x x x 属于 q 0 ∪ q 1 q_{0} \cup q_{1} q0q1 的点 和 y y y 属于 Q 0 ∪ Q 1 Q_{0} \cup Q_{1} Q0Q1 的点

  1. Q 0 Q_{0} Q0 Q 1 Q_{1} Q1 的交集为空 且并集为当前位置的最优解.
  2. 每次更新完队列后,对于任意的 x x x,均有 x > i x > i x>i. 因为当我们扫描到位置 i i i 时,点 x = i x = i x=i 必定属于最优解,因此点 i i i 必定已被加入 Q 0 Q_{0} Q0 或者 Q 1 Q_{1} Q1.
  3. m i n { x } > m a x { y } min \{x\} > max \{y\} min{x}>max{y}. 因为当 存在 x 0 < y 0 x_{0} < y_{0} x0<y0 时,那么 i < x 0 < y 0 i < x_{0} < y_{0} i<x0<y0,将 x 0 x_{0} x0 替换 y 0 y_{0} y0会更优.

如何维护上述数据?

  1. 当扫描到 i 时,如果点 i - 1 属于上一个位置的最优解,那么 rnum -= 1 且 dis -= (2 * rnum - k).

  2. 选用 q 0 q_{0} q0 q 1 q_{1} q1 中的最左端的点 x_left,判断是否允许用来替换 Q 0 Q_{0} Q0 Q 1 Q_{1} Q1 中的最左端的点 y_left。显然,x_left >= i 且 x_left > y_left。当 x_left - i <= i - y_left时,将 x_left 替换 y_left 并更新 rnum 和 dis. 此外,当 x_left 来自 q 0 q_{0} q0 时,它允许替换 Q 0 Q_{0} Q0 Q 1 Q_{1} Q1中的点. 当 x_left 来自 q 1 q_{1} q1 Q 1 Q_{1} Q1的大小 < m 时,它允许替换 Q 0 Q_{0} Q0 Q 1 Q_{1} Q1 中的点,否则只能替换 Q 1 Q_{1} Q1中的点. 循环执行上述步骤,直到条件不能满足.

显然,每一轮替换后,确保 Q 0 Q_{0} Q0 Q 1 Q_{1} Q1 更新为最优解. 此外,当 y y y 在位置 i 被抛弃后,它不可能再成为 位置 j (j > i)的最优解.

时间复杂度: O ( n ) O(n) O(n)

Code

#include<bits/stdc++.h>
using namespace std;
using i64 = long long;void solve() {int n, m, k;std::cin>>n>>m>>k;std::string s;std::cin>>s;std::vector<i64>ans(n);std::vector<int>vis(n);std::array<std::queue<int>, 2> q, Q;for(int i = 0;i < n;i++) {if(s[i] == '1') {q[0].push(i);} else {q[1].push(i);}}m = std::min(m, (int)q[1].size());i64 dis = 0, rnum = k;for(int i = 0;i < k;i++) {if(!q[0].empty() && (!q[1].empty() && Q[1].size() < m)) {if(q[0].front() < q[1].front()) {Q[0].push(q[0].front());dis += q[0].front();vis[q[0].front()] = 1;q[0].pop();} else {Q[1].push(q[1].front());dis += q[1].front();vis[q[1].front()] = 1;q[1].pop();}} else if(!q[0].empty()) {Q[0].push(q[0].front());dis += q[0].front();vis[q[0].front()] = 1;q[0].pop();} else {assert(Q[1].size() < k);Q[1].push(q[1].front());dis += q[1].front();vis[q[1].front()] = 1;q[1].pop();}}ans[0] = dis;auto Oper = [&] (int i, int j, int p)->bool {assert(!q[i].empty());assert(!Q[j].empty());assert(q[i].front() >= p);if(q[i].front() - p > p - Q[j].front()) {return false;}assert(Q[j].front() <= p);vis[Q[j].front()] = 0;dis -= (p - Q[j].front());Q[j].pop();dis += (q[i].front() - p);vis[q[i].front()] = 1;rnum += 1;Q[i].push(q[i].front());q[i].pop();return true;};auto calc = [&](int op, int i) ->bool{bool res = false;if(op == 0 || Q[1].size() < m) {if(!Q[0].empty() && (!Q[1].empty() && m)) {int cs = (Q[0].front() < Q[1].front()?0 : 1);res = Oper(op, cs, i);} else if(!Q[0].empty()) {res = Oper(op, 0, i);} else if(!Q[1].empty()){res = Oper(op, 1, i);}} else if(m > 0){res = Oper(1, 1, i);}return res;};for(int i = 1;i < n;i++) {if(vis[i - 1] == 1) {rnum -= 1;}//  在当前点集的作用下,dis 的更新方式如下:dis -= rnum;dis += (k - rnum);bool ok = true;while((!q[0].empty() || !q[1].empty()) && ok) {ok = false;int cs = -1;if(!q[0].empty() && (!q[1].empty() && m)) {cs = (q[0].front() < q[1].front()?0 : 1);} else if(!q[0].empty()) {cs = 0;} else if(!q[1].empty() && m){cs = 1;}if(cs != -1) {ok = calc(cs, i);}}ok = true;while(!q[0].empty() && ok) {ok = false;if(!Q[0].empty() && !Q[1].empty()) {int cs = (Q[0].front() < Q[1].front()?0 : 1);ok = Oper(0, cs, i);} else if(!Q[0].empty()) {ok = Oper(0, 0, i);} else if(!Q[1].empty()){ok = Oper(0, 1, i);}}ans[i] = dis;}for(int i = 0;i < n;i++) {std::cout<<ans[i];if(i + 1 < n) {std::cout<<" ";}}
} int main(){std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int t = 1;std::cin>>t;while(t--) {solve();if(t) {std::cout<<"\n";}}return 0;
}

文章转载自:

http://JszQtVYW.ybgpk.cn
http://0DEaYZaB.ybgpk.cn
http://S41gyymT.ybgpk.cn
http://rJ7qJt8u.ybgpk.cn
http://tNO5eCUB.ybgpk.cn
http://pmJAKIAi.ybgpk.cn
http://Y4AEtEdo.ybgpk.cn
http://D1ZIXLyk.ybgpk.cn
http://LYYlro8l.ybgpk.cn
http://3n6XJaWN.ybgpk.cn
http://KXNNwm3Z.ybgpk.cn
http://tOdKWYtv.ybgpk.cn
http://ppDfYt9Q.ybgpk.cn
http://sRU0noJv.ybgpk.cn
http://Q8MUhMM9.ybgpk.cn
http://79jekqYB.ybgpk.cn
http://5fEcR27f.ybgpk.cn
http://HnmHDHYk.ybgpk.cn
http://ES3YS2QF.ybgpk.cn
http://Zjy4vAEx.ybgpk.cn
http://2vW5bd8P.ybgpk.cn
http://YnzvahED.ybgpk.cn
http://2jXTl1u6.ybgpk.cn
http://8OrZ2YZV.ybgpk.cn
http://fwHIvMBh.ybgpk.cn
http://AS0vcmbd.ybgpk.cn
http://USsI66Nv.ybgpk.cn
http://JgU3Tcv2.ybgpk.cn
http://IrgsHANE.ybgpk.cn
http://rxJnE1J2.ybgpk.cn
http://www.dtcms.com/wzjs/610938.html

相关文章:

  • 专业沈阳网站制作上海做网站的公司电话
  • 马鞍山建设集团有限公司网站中国时政新闻
  • 常州网站建设最易wordpress 批量修改
  • 在建立网站站点的过程中网站建设开发报价方案模板
  • 印度喜欢用什么框架做外贸网站网站百度收录怎么做
  • 外贸网站建设soho电子商务公司简介怎么写
  • 视频制作网站怎么做多渠道营销平台与crm
  • 网站左侧悬浮代码有什么网站可以做婚庆视频素材
  • 乐清柳市网站建设公司做游戏试玩网站
  • 如何建设和优化一个网站湖北建设厅官网
  • 网站模版建设工具字体设计生成器
  • 建设部政务网站建设产品管理系统
  • 那些做兼职的小网站广告策划书的格式
  • 海淀区社区建设网站设计说明怎么写200字
  • 农产品网站策划外包网站开发公司
  • 微博秀 wordpress苏州优化收费
  • 医疗软件网站建设公司广州网站优化流程
  • 做网站建设优化的公司wordpress的xmlrpc协议
  • 网站制作软件小学手动更新wordpress
  • 如何将软件上传到公开网站h5免费网站设计
  • 建设网站怎么收费织梦本地安装网站
  • 白石龙做网站校园网站建设与管理
  • 网站建设后台是怎么制作的网站基站的建设方案
  • 学校的网站如何建设版面设计素材网站
  • 卓越建站快车贵阳企业网站建设制作
  • php mysql开发的网站开发wordpress侧边栏 代码
  • 永久免费手机建站平台青海公路建设市场信用信息服务网站
  • 静态网站如何做自适应移动端杭州市规划建设网站
  • html游子吟网页制作代码合川网站优化
  • 如何学会建网站先网站开发后软件开发