A 01 Sequence
Given a binary cyclic sequence S of length n, whose elements are either 0 or 1, you can do the following operation any number of times.
- Operation: if the length of S is greater than or equal to 3, choose a position i (1≤i≤n) such that Si=1, remove the element on position i and both its adjacent elements (remove 3 elements in total), and do not change the relative order of the other elements. Note that elements in the first and last positions are considered adjacent.
A binary cyclic sequence S is called good if you can make S empty using the operation above.
And the beauty of a binary cyclic sequence S, f(S), is defined as the minimum number of modifications needed to make S good. In a single modification you can flip an arbitrary element in S, that is, 0 becomes 1 and 1 becomes 0.
Given are a binary string a of length n and q queries. For the i-th query you are given two integers li and ri, and you should answer f(ali..ri) (where we consider the substring ali..ri as a cyclic sequence).
输入格式:
The first line contains two integers n and q (3≤n≤10^6, 1≤q≤10^6) — the length of string a and the number of queries, respectively.
The second line contains the string a1a2⋯an, where each ai is either 0 or 1.
Each of the following q lines contains two integers li and ri (1≤li≤ri≤n, (ri−li+1)≡0mod3) describing the i-th query.
输出格式
Output q lines, where the i-th line contains a single integer — the answer for the i-th query.
输入样例:
7 7 1000011 1 3 2 4 3 5 4 6 5 7 1 6 2 7
12 1 110110110000 1 12
20 10 00001000100000010000 18 20 14 16 7 12 2 10 16 18 6 20 8 10 13 15 1 6 1 12输出样例:
0 1 1 0 0 1 11
1 0 1 1 0 3 0 1 1 2代码长度限制
16 KB
时间限制
2000 ms
内存限制
512 MB
只要字符串中,不相邻的1的个数大于等于区间长度 / 3的话,就可以完全删除了.
- #include<bits/stdc++.h>
- using namespace std;
- const int N=1e6+10;
- int f[N];
- int pre[N],last[N];
- int n,m;
- void solve()
- {
- cin>>n>>m;
- string s;
- cin >>s;
- s="?"+s;
- int cnt=0;
- for (int i=1;i<=n;i++)
- {
- if (s[i]=='1') cnt++;
- else cnt=0;
- f[i]=f[i-cnt-1]+cnt/2+cnt%2;
- pre[i]=cnt;
- }
- cnt=0;
- for(int i=n;i;i--)
- {
- if (s[i]=='1') cnt++;
- else cnt=0;
- last[i]=cnt;
- }
- while (m--)
- {
- int tmp = 0;
- int l, r;
- cin>>l>>r;
- tmp=pre[r]+last[l];
- int st=f[r-pre[r]]-f[l+last[l]]+tmp/2+tmp%2;
- if ((r-l+1)/3<=st) cout<<0<<"\n";
- else cout<<(r-l+1)/3-st<<"\n";
- }
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- solve();
-
- return 0;
- }