[cf 1239 B]The World Is Just a Programming Task (Hard Version)
时间:2019-10-22
本文章向大家介绍[cf 1239 B]The World Is Just a Programming Task (Hard Version),主要包括[cf 1239 B]The World Is Just a Programming Task (Hard Version)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意:
给你一个长度为n的括号序列,你可以交换其中的两个元素,需要使该序列的n个循环移位中合法的括号序列个数尽量多。
输出最大的答案以及交换哪两个元素能够取到这个答案。
$n\leq 3\times 10^5$
题解:
这位julao讲得很清楚。
(通过昨天的交流我明白了:很多时候博客写的详细程度与记住的程度成反比……)
这个题值得学习的地方就是把括号序列转化成平面直角坐标系上的折线再进行判断。
将 $)$ 视作-1, $($ 视作+1,$sum_{i}$为$1-i$的前缀和,那么一个括号序列合法当且仅当:
1.不存在$i$满足$sum_{i}<0$
2.$sum_{n}=0$
容易发现这样判断比用栈模拟适用性广而且扩展性强。
本题中转化序列后使用线段树即可,我使用了一种线性做法。
代码:
#include<bits/stdc++.h> #define maxn 300005 #define maxm 500005 #define inf 0x7fffffff #define ll long long using namespace std; int N,sum[maxn]; char str[maxn<<1]; inline int read(){ int x=0,f=1; char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f; } int main(){ N=read(),scanf("%s",str+1); int pos=0,mn=inf; for(int i=1;i<=N;i++) str[i+N]=str[i]; for(int i=1;i<=N;i++){ sum[i]=sum[i-1]+((str[i]==')')?-1:1); if(sum[i]<mn) mn=sum[i],pos=i; } for(int i=pos+1;i<=pos+N;i++) sum[i-pos]=sum[i-pos-1]+((str[i]==')')?-1:1); if(sum[N]!=0){printf("0\n1 1\n");return 0;} int ans=0,mxans=0,p1=1,p2=1; for(int i=1;i<=N;i++) if(sum[i]==0) ans++; for(int i=1;i<=N;){ int j=i; while(j<=N && sum[j+1]!=0) j++; j++; int n1=0,n2=0,t1=0,t2=0,mxn2=0,las1=i; for(int k=i;k<=j;k++){ if(sum[k]==1){ if(mxn2<n2) mxn2=n2,t1=las1+1,t2=k; n2=0,n1++,las1=k; } if(sum[k]==2) n2++; } if(mxn2<n2) mxn2=n2,t1=las1+1,t2=j; if(mxans<mxn2+ans) mxans=mxn2+ans,p1=t1,p2=t2; if(mxans<n1) mxans=n1,p1=i,p2=j; i=j+1; } //cout<<p1<<" "<<p2<<endl; printf("%d\n%d %d\n",mxans,(p1+pos-1)%N+1,(p2+pos-1)%N+1); return 0; }
原文地址:https://www.cnblogs.com/YSFAC/p/11719981.html
- 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle
- R语言抓包实战——知乎live二级页面获取
- 左手用R右手Python系列——面向对象编程基础
- 线性同余同余方程组解法(excrt)
- #19. 计数(容斥原理)
- 左手用R右手Python系列——多进程/线程数据抓取与网页请求
- #15. 钻石
- P1328 生活大爆炸版石头剪刀布
- ASP.NET MVC 5 Authentication Breakdown
- jquery easyui datagrid mvc server端分页排序筛选的实现
- 左手用R右手Python系列——使用多进程进行任务处理
- 2017.9.17校内noip模拟赛解题报告
- MySQL基础入门——MySQL与R语言、Python交互
- BizTalk Orchestration execute Flat file disassembler ReceivePipeline
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法