BZOJ 4236 JOIOJI
来源:互联网 发布:xy苹果助手for mac 编辑:程序博客网 时间:2024/05/16 11:57
推出个公式就成了大水题了,关键这个公式对于蒟蒻来说太难想了。
sum为前缀中各个字母个数,假设一段区间[j,i]满足条件,则有:
sumO[i]−sumO[j−1]=sumI[i]−sumI[j−1]=sumJ[i]−sumJ[j−1]
等价于:
{sumO[i]−sumI[i]=sumO[j−1]−sumI[j−1]sumO[i]−sumJ[i]=sumO[j−1]−sumJ[j−1]
看到这个,有一点像斜率优化整理时的思想,将关于当前状态的放在一侧,之前状态的放在另一侧,于是维护一下第一次出现二元组相等的最小时间就好了。
#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<set>#include<algorithm>using namespace std;const int maxn=200005;struct node{ int pos,x,y; bool operator == (const node &tmp)const { return x==tmp.x&&y==tmp.y; } bool operator < (const node &tmp)const { return x<tmp.x||(x==tmp.x&&y<tmp.y)||(x==tmp.x&&y==tmp.y&&pos<tmp.pos); }};int n,ans;int sumi[maxn],sumj[maxn],sumo[maxn];set<node>q;int main(){ scanf("%d\n",&n); for(int i=1,ch;i<=n;i++) { ch=getchar(); sumj[i]=sumj[i-1]; sumo[i]=sumo[i-1]; sumi[i]=sumi[i-1]; if(ch=='J')sumj[i]++; else if(ch=='O')sumo[i]++; else sumi[i]++; } set<node>::iterator it; q.insert((node){0,0,0}); for(int i=1;i<=n;i++) { node now=(node){0,sumj[i]-sumo[i],sumo[i]-sumi[i]}; it=q.lower_bound(now); if(*it==now)ans=max(ans,i-(*it).pos); now.pos=i; q.insert(now); } cout<<ans; return 0;}
阅读全文
0 0
- [Hash] BZOJ 4236 JOIOJI
- bzoj 4236: JOIOJI
- BZOJ 4236 JOIOJI
- 【BZOJ】4236 JOIOJI
- BZOJ 4236 JOIOJI
- BZOJ 4236 JOIOJI
- BZOJ 4236: JOIOJI
- BZOJ 4236: JOIOJI
- BZOJ 4236 JOIOJI
- bzoj 4236: JOIOJI 排序&扫描
- bzoj 4236: JOIOJI map+乱搞
- BZOJ 4236 JOIOJI 排序+线扫
- bzoj 4236: JOIOJI(map+pair)
- 4236: JOIOJI
- JOIOJI
- 4236: JOIOJI 思路题 map
- [BZOJ4236] JOIOJI
- 【BZOJ4236】JOIOJI
- String.substr()和String.substring()
- 写给人类的机器学习 2.2 监督学习 II
- 通过一段代码发现 emu8086 和 DOSBox 的一点区别
- 字母排序(最长递增子串)
- hdu-154-Tunnel Warfare(线段树,区间)
- BZOJ 4236 JOIOJI
- <并查集+脑洞>codevs 1995 黑魔法师之门
- 复变函数ch3.复变函数的积分
- PTA:一元多项式的加乘运算
- 新的启程------加油
- Linux 磁盘原理与管理 (分区 挂载)
- 移动 Ubuntu16.04 桌面左侧的启动器到屏幕底部
- 又来了,麦枫版通达OA/office anywhere2017.10.8.171010无限用户破解可定制名称
- 爬虫笔记2(转)BS4库的解析器