cf1562D Two Hundred Twenty One

题意:

定义一个前缀和公式:a1−a2+a3−a4+..=∑i=1n(−1)i−1∗aia_{1}-a_{2}+a_{3}-a_{4}+..=\sum_{i=1}^{n}(-1)^{i-1}*a_{i}a1​−a2​+a3​−a4​+..=∑i=1n​(−1)i−1∗ai​
然后给你一个长度为n的序列,只包含{-1,1}。
然后q次询问,每次询问一个区间,问最少删除区间内多少个数字可以使得区间[l,r]的区间和等于0

题解:

先看简单版本,只输出删除个数。
我们用sum[i]表示题目所给公式的前缀和,通过样例可以猜出一个结论(具体证明详见官方题解)

  1. 如果区间[l,r]的区间和等于0,删除个数为0
  2. 如果区间和不为0,区间长度为奇数,答案为1
  3. 如果区间和不为0,区间长度为偶数,答案为2(可以先删除第l个,然后区间长度变成奇数,就是第二个情况)

对于区间长度为奇数的,一定存在某个位置pos,l<=pos<=r,使得删除第pos位后,剩下的区间和为0,pos的前半部分等于后半部分,也就是满足:
sum[r]-sum[pos]=sum[pos-1]-sum[l-1]
移项:
sum[r]+sum[l-1]=sum[pos]+sum[pos-1]
根据sum[r]+sum[l-1]的值去二分找sum[pos]+sum[pos-1]
存下sum[r]+sum[l-1]所对应的所有sum[pos]+sum[pos-1],方便二分去找

代码:

// 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
// Data:2021-09-03 17:12:18
// By Jozky#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{#ifdef LOCALstartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{#ifdef LOCALendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn= 3e6 + 8;
int sum[maxn];
vector<int> vec[maxn];
int len, q;
int pos(int l, int r)
{int Sum= sum[r] + sum[l - 1] + 2 * len;int Pos= lower_bound(vec[Sum].begin(), vec[Sum].end(), l) - vec[Sum].begin();return vec[Sum][Pos];
}
int main()
{//rd_test();int t;read(t);while (t--) {read(len, q);string s;cin >> s;for (int i= 0; i < s.length(); i++) {if ((i + 1) % 2 == 0)sum[i + 1]= sum[i] + (s[i] == '+' ? -1 : 1);elsesum[i + 1]= sum[i] + (s[i] == '+' ? 1 : -1);}for (int i= 1; i <= len; i++) {int Sum= sum[i] + sum[i - 1];vec[Sum + 2 * len].push_back(i); //2*len是偏移量}while (q--) {int l, r;read(l, r);if (sum[r] - sum[l - 1] == 0)printf("0\n");else if ((r - l + 1) % 2 == 1) {printf("1\n");printf("%d\n", pos(l, r));}else {printf("2\n");printf("%d %d\n", l, pos(l + 1, r));}}for (int i= 1; i <= len; i++) {int Sum= sum[i] + sum[i - 1];vec[Sum + 2 * len].clear();}}return 0;//Time_test();
}

cf1562D Two Hundred Twenty One相关推荐

  1. CodeForces - 1562D2 Two Hundred Twenty One (hard version)(二分)

    题目链接:点击查看 题目大意:定义一个前缀和公式 a1−a2+a3−a4+-=∑i=1n(−1)i−1⋅aia_1 - a_2 + a_3 - a_4 + \ldots=\sum\limits_{i= ...

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

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串,+++代表111,−-−代表−1-1−1,让后有qqq个询问,每次询问[l,r][l,r][l,r]区间,将这段区间的数拿出来,设为 ...

  3. Trainmaster One Hundred Twenty

    他是美国最伟大的探险家及创业家之一,但与贝尔(Bell),商务防水男表爱迪生(Edison),古德伊尔(Goodyear),及莱特兄弟(Wright brothers)等不同,他杰出的非凡成就其实并未 ...

  4. D2. Two Hundred Twenty One (hard version)

    题目 思路 预处理前缀和数组pre[N],然后l ~ r 的和就是pre[r] - pre[l - 1](当然可能和实际的l ~ r 的和是相反数,受到l的位置影响,不过不影响你让l ~ r 的和变为 ...

  5. 273 Integer to English Words 整数转换英文表示

    将非负整数转换为其对应的英文表示,给定的输入是保证小于 231 - 1 的. 示例: 123 -> "One Hundred Twenty Three" 12345 -> ...

  6. LeetCode第一刷--leetcode提交格式介绍与273. Integer to English Words

    第一次玩Leetcode,对代码提交格式不了解,提交了一上午,略尴尬 leetcode确实有很多有意思的地方,不像以前做各个高校ACM练习,leetcode会给出错误信息(哪个数据的错了),也会提供测 ...

  7. SQLite相关知识

    例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行 sqlite3_exec(db, "insert into name values 'lxkxf', '24'; " ...

  8. 273. 整数转换英文表示(模拟)

    将非负整数转换为其对应的英文表示.可以保证给定输入小于 231 - 1 . 示例 1: 输入: 123 输出: "One Hundred Twenty Three" 示例 2: 输 ...

  9. Codeforces Round #741 (Div. 2)

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

最新文章

  1. 怎样在swift中创建CocoaPods
  2. EXCEL-XML 代码相对行列转换绝对
  3. Linux系统中创建虚拟环境详解
  4. Tensorflow 变量的共享
  5. 从入门到进阶|如何基于WebRTC搭建一个视频会议
  6. 反转字符串中的元音字符_C程序消除字符串中的所有元音
  7. 前端学习(2526):Vuex成果和展示
  8. 架构设计之「 微服务入门 」
  9. 华锋e路航x10升级工具_万商云集:疫情下火爆的电子合同,背后是企业数字化升级的必然...
  10. gitlab hook触发jenkins自动构建
  11. Fedora16 下更改多系统、多内核的默认启动项
  12. 华为举办HDC.Cloud媒体预沟通会,为开发者提供ICT“黑土地”
  13. oracle 混合分区表,Oracle 19C Hybrid partitioned tables混合分区表
  14. 装箱拆箱的意义 java_Java中的装箱和拆箱深入理解
  15. 基于jquery的ajax分页效果
  16. xwt100编程器使用方法与xtw100没有找到编程器解决办法
  17. 矩阵求逆(伴随阵法C++)
  18. 7-15 福到了 c语言,福到啦L1-6 福到了(15 分) “
  19. 北部湾及涠洲岛海域潮汐和海平面特征
  20. 如何修复 M1 Mac 外接显示器屏幕闪烁、白噪声、黑屏等问题?

热门文章

  1. 一个娃娃竟然拍出50万......
  2. 泰国小哥又双叒叕整活,奇怪的美少女出现了......
  3. 你为什么不爱发朋友圈了?
  4. 《SAS编程与数据挖掘商业案例》学习笔记之十
  5. goahead如何使用cgi服务_QQ如何设置使用代理服务器?
  6. ugui unity 取消选择_UGUI中几种不规则按钮的实现方式
  7. java buffalo_随你怎么玩!Buffalo 网络硬盘新潮流
  8. php mysql 云虚拟机_虚拟机+apache+php+mysql 环境安装配置
  9. oracle symonym_Oracle的同义词(synonyms)
  10. python数据抓取课程_Python爬虫入门教程 21-100 网易云课堂课程数据抓取