传送门

文章目录

  • 题意:
  • 思路:

题意:

给你一个长度为nnn的串,+++代表111,−-−代表−1-1−1,让后有qqq个询问,每次询问[l,r][l,r][l,r]区间,将这段区间的数拿出来,设为a[1,r−l+1]a[1,r-l+1]a[1,r−l+1],算a1−a2+a3−...=xa_1-a_2+a_3-...=xa1​−a2​+a3​−...=x,问最少删去多少个数才能使得xxx为000,输出删的数的位置。

n,q≤3e5n,q\le3e5n,q≤3e5

思路:

首先考虑简单版本,就是不要求输出删的位置,只考虑删多少。

每次询问拿出来的区间,奇偶位置符号分别乘1,−11,-11,−1,不难发现我们将−1,1-1,1−1,1倒过来也是没有影响的,也就是偶奇分别乘1,−11,-11,−1。

那么既然拿出来的区间对位置奇偶没影响,那么我们考虑一开始就处理一个a[i]a[i]a[i]表示第iii个位置的数,再维护个前缀和sum[i]sum[i]sum[i],我们现在能得到[l,r][l,r][l,r]的和了,考虑如何计算答案。

(1)(1)(1)如果当前区间和是000,那么答案显然为000。

(2)(2)(2)如果当前区间和为奇数,那么一定可以找到一个位置,去掉当前位置后区间和为000。

(3)(3)(3)如果当前区间和为偶数,那么我们可以把lll的位置删掉,这样区间和一定变为奇数,让后再按照(2)(2)(2)来找一个位置去掉即可。

所以如果是easyeasyeasy版本的话,分以上三种讨论即可。

考虑如果要求输出位置怎么办。

对于(1)(1)(1),直接输出000即可。

对于(2)(2)(2),由于其一定存在一个位置去掉后区间和为000,考虑什么位置去掉是合法的呢?假设我们去掉的位置是pospospos,那么[l,pos−1],[pos+1,r][l,pos-1],[pos+1,r][l,pos−1],[pos+1,r]两个区间的和原本是相同的,也就是sum[l,pos−1]=sum[pos+1,r]sum_{[l,pos-1]}=sum_{[pos+1,r]}sum[l,pos−1]​=sum[pos+1,r]​,那么我们去掉pospospos位之后,前面的不变,后面的值全部取反,也就是sum[l,pos−1]=−sum[pos+1,r]sum_{[l,pos-1]}=-sum_{[pos+1,r]}sum[l,pos−1]​=−sum[pos+1,r]​,也就是说我们找到这样的一个合法位置即可。

考虑怎么找呢?显然可以二分来找,二分位置,有点小繁琐,我们考虑一种更加妙的方式。

我们给每个sum[i]+sum[i−1]sum[i]+sum[i-1]sum[i]+sum[i−1]开一个桶,存下来iii这个位置,考虑当前询问区间为[l,r][l,r][l,r]。你那么我们找到sum[l−1]+sum[r]sum[l-1]+sum[r]sum[l−1]+sum[r]对应的桶里的某个位置xxx,那么现在有sum[r]+sum[l−1]=sum[x]+sum[x−1]sum[r]+sum[l-1]=sum[x]+sum[x-1]sum[r]+sum[l−1]=sum[x]+sum[x−1],移项得sum[r]−sum[x]=sum[x−1]−sum[l−1]sum[r]-sum[x]=sum[x-1]-sum[l-1]sum[r]−sum[x]=sum[x−1]−sum[l−1],不难发现,如果我们将xxx这个位置去掉后,那么前后两个区间的和就为000了,所以我们只需要在sum[i]+sum[i−1]sum[i]+sum[i-1]sum[i]+sum[i−1]的桶内二分一个位置即可,由于保证一定有解,所以一定存在这样的一个位置。

对于(3)(3)(3),删掉lll位置,将其变为奇数,让后进行(2)(2)(2)即可。

// Problem: D1. Two Hundred Twenty One (easy version)
// Contest: Codeforces - Codeforces Round #741 (Div. 2)
// URL: https://codeforces.com/contest/1562/problem/D1
// Memory Limit: 512 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=2000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,q;
int a[N],sum[N];
vector<int>v[N];
char s[N];int get(int l,int r) {int now=sum[l]+sum[r]+2*n;int pos=lower_bound(v[now].begin(),v[now].end(),l+1)-v[now].begin();return v[now][pos];
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);int _; scanf("%d",&_);while(_--) {scanf("%d%d%s",&n,&q,s+1);for(int i=1;i<=n;i++) {if(s[i]=='-') {if(i%2==1) sum[i]=sum[i-1]-1;else sum[i]=sum[i-1]+1;}else {if(i%2==1) sum[i]=sum[i-1]+1;else sum[i]=sum[i-1]-1;}}for(int i=1;i<=n;i++) v[sum[i]+sum[i-1]+2*n].pb(i);while(q--) {int l,r; scanf("%d%d",&l,&r);int now=abs(sum[r]-sum[l-1]);if(now==0) puts("0");else if((r-l+1)%2==1) {    puts("1");printf("%d\n",get(l-1,r));} else {puts("2");printf("%d %d\n",l,get(l,r));}}for(int i=1;i<=n;i++) v[sum[i]+sum[i-1]+2*n].clear();}return 0;
}
/*
1
14 3
+--++---+++---
1 14
6 12  ---+++- -1 1 -1 -1 1 -1 -1
3 102
1 5
1
12
0*/

Codeforces Round #741 (Div. 2) D2. Two Hundred Twenty One (hard version) 前缀和 + 分段模型相关推荐

  1. Codeforces Round #730 (Div. 2) D2. RPD and Rap Sheet (Hard Version) 交互 + k进制的转换

    传送门 文章目录 题意: 思路: 题意: 定义a⊕kba\oplus_k ba⊕k​b为a,ba,ba,b在kkk进制下的不进位加法.系统会随机生成一个数xxx,你猜这个数,假设当前猜的数为yyy,如 ...

  2. Codeforces Round #741 (Div. 2)

    Codeforces Round #741 (Div. 2) 题号 题目 知识点 A The Miracle and the Sleeper B Scenes From a Memory C Ring ...

  3. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  4. Codeforces Round #741 (Div. 2) E. Rescue Niwen! 字符串 + dp

    传送门 文章目录 题意: 思路: 题意: 给你一个串sss,定义其扩张串为s1,s1s2,...,s1s2..sn,s2,s2s3,...,sns_1,s_1s_2,...,s_1s_2..s_n,s ...

  5. Codeforces Round #602 (Div. 2) D2. Optimal Subsequences stl 黑科技

    传送门 文章目录 题意: 思路: 题意: 思路: 比较明显的是我们需要将序列从大到小排序,让后取前kkk个数,再从中选择第pospospos小的位置输出当前位置的数即可. 一开始想用setsetset ...

  6. Codeforces Round #740 (Div. 2) D2. Up the Strip dp + 分块优化 + 逆向思维

    传送门 文章目录 题意: 思路 题意: 有nnn个细胞,你初始在第nnn细胞上,假设你当前在xxx处,你每次可以进行如下两个操作: (1)(1)(1)选择[1,x−1][1,x-1][1,x−1]内一 ...

  7. Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) 思维 + 质因子

    传送门 文章目录 题意: 思路: 题意: 大体题意跟easyeasyeasy版本差不多,就是hardhardhard版本的aaa范围更大.见这里Codeforces Round #601 (Div. ...

  8. Codeforces Round #574 (Div. 2) D2. Submarine in the Rybinsk Sea (hard edition)

    题目链接:http://codeforces.com/contest/1195/problem/D2 解题心得:其实就是一个算贡献,只需要看每个数字放在不同位置能为最后的答案提供多少数值就行了,复杂度 ...

  9. Codeforces Round #801 (Div. 2) D2(思维/dfs)

    传送门 题意:给你一颗树,问最少取几点并且得知其与未知点x的距离可以确定树中任意x是哪个节点. 思考:观察可知,对于叶子节点,其兄弟节点到父节点所在的路径上都有点被取到时,不用取它也可以知道具体是哪个 ...

最新文章

  1. opencart导入导出export/import功能插件
  2. d3 力导向图 force graph
  3. 【❤️算法系列之顺序二叉树的实现(前序遍历、中序遍历、后序遍历)❤️】
  4. 十字链表计算矩阵乘积 c语言,求用十字链表实现矩阵相加算法(C语言)急!!!...
  5. 关于iOS里的做动画方法的差别与注意事项
  6. iPhone比小米贵3000,贵在哪里?
  7. 如何用python写html的插件,使用python开发vim插件及心得分享
  8. H3C交换机 汇聚接口上应用策略路由
  9. outlook 2007 自动答复邮件
  10. 临沂经济技术开发区 智慧让城市建设更美好
  11. 华为下一代机皇曝光:全新麒麟985+55W超级快充
  12. IDEA 隐藏编辑器顶部 Tab 栏
  13. CISA:很多受害者和 SolarWinds 之间并不直接相关
  14. python3.8.5-Python 3.8.5下载
  15. 天正电气图例_天正电气设计施工图中常用线路敷设方式
  16. empty是什么意思 php,empty是什么意思中文翻译
  17. 3ds max基础材质初学者必读(27)——使用Arch Design材质
  18. Python str()函数
  19. JDK14打包工具jpackage的使用
  20. python求导并作图_科学网—python-符号运算(求导等) - 夏江江的博文

热门文章

  1. 移动端 登陆 模板 html_聚会邀请函请柬模板 免费设计制作生成
  2. 男生的哪个“不要”是真的不要?
  3. 出这样的题,出题人的良心确定不会痛吗?
  4. 听说这是和女朋友住一起后的现象之一
  5. 自律的程度,决定你人生的高度
  6. linux+4.4+android,Ubuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法
  7. java 中时间计算_java中关于时间的计算
  8. Android 页面布局xd,Adobe XD强大的布局系列工具 助你事半功倍
  9. C语言计算一个数的平方根立方根,怎样快速计算出一个数的平方根立方根?
  10. c语言实现容器,C语言三种容器:list vector和deque的区别