D2. Two Hundred Twenty One (hard version)
题目
思路
预处理前缀和数组pre[N],然后l ~ r 的和就是pre[r] - pre[l - 1](当然可能和实际的l ~ r 的和是相反数,受到l的位置影响,不过不影响你让l ~ r 的和变为 0)
令 x = pre[r] - pre[l-1];
①x是奇数
那么你只要把 前缀和为 pre[l-1] + x/2 + ’1‘(注意这个1是和x同符号),并且位置在 l ~ r 的那个位置的杆子移除就行。
假设这个位置是p ,l ~ p - 1的贡献是 x/2,
因为移除了p,所以p + 1 ~ r 的贡献就会取反也就是 -x/2(因为p + 1 ~ r的每个‘+’,‘-’位置变化了 1,实际求和相当于翻转了),所以这么操作l ~ p - 1和p + 1 ~ r 的的贡献和就是 0 了
② x 是偶数 且不是 0(至少移除2个,不管你先移除哪一个都剩下奇数的贡献)
先移除掉位置r,这样贡献和就变成奇数,且不影响前面位置的贡献,这个时候,要考虑 r的贡献是 +1还是-1,这样移除r后,贡献和就变成了x=x-1,或x=x+1了,然后继续按奇数的情况把 前缀和为 pre[l-1] + x/2 + ‘1’,并且位置在 l ~ r 的那个位置的杆子移除就行.
代码
#include<bits/stdc++.h>
#define IOS std::ios_base::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);// 快读using namespace std;
struct ty{int p,s;ty(){}ty(int a,int b):p(a),s(b){}bool operator < (const ty &y) const {if(s == y.s)return p < y.p;return s > y.s;}
};const int N = 1e6 + 10;
vector<ty> a;
int pre[N];
string s;int main(){IOS//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout); int T; cin >> T;for (int d = 1; d <= T; ++d){a.clear();int n,q; cin >> n >> q >> s;for(int i = 0; i < n; ++i){ty x;x.p = i + 1;x.s = s[i] == '+' ? pow(-1,i%2):pow(-1,i%2 + 1);x.s += pre[i];pre[i + 1] = x.s;a.push_back(x);}sort(a.begin(), a.end()); while(q--){int l,r; cin >> l >> r;int x = pre[r] - pre[l - 1];int f; if(x > 0) f = 1; else f = -1;if(!x){cout << 0 << '\n';}else if(abs(x)&1){x = x/2 + f;//加上与x同号的一个贡献auto it = lower_bound(a.begin(),a.end(),ty{l,pre[l - 1] + x});cout << 1 << '\n' << it->p <<'\n';}else{int y = s[r-1] == '+' ? pow(-1,r%2 + 1):pow(-1,r%2);if(y*x > 0) x = x/2;//x - y的贡献else x = x/2 - y; //x + y的贡献auto it = lower_bound(a.begin(),a.end(),ty{l,pre[l - 1] + x});cout << 2 << '\n' << it->p << ' ' << r << '\n';}}}return 0;
}
//-++-
D2. Two Hundred Twenty One (hard version)相关推荐
- Codeforces Round #741 (Div. 2) D2. Two Hundred Twenty One (hard version) 前缀和 + 分段模型
传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串,+++代表111,−-−代表−1-1−1,让后有qqq个询问,每次询问[l,r][l,r][l,r]区间,将这段区间的数拿出来,设为 ...
- 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= ...
- cf1562D Two Hundred Twenty One
cf1562D Two Hundred Twenty One 题意: 定义一个前缀和公式:a1−a2+a3−a4+..=∑i=1n(−1)i−1∗aia_{1}-a_{2}+a_{3}-a_{4}+. ...
- Codeforces Round #730 (Div. 2) D2. RPD and Rap Sheet (Hard Version) 交互 + k进制的转换
传送门 文章目录 题意: 思路: 题意: 定义a⊕kba\oplus_k ba⊕kb为a,ba,ba,b在kkk进制下的不进位加法.系统会随机生成一个数xxx,你猜这个数,假设当前猜的数为yyy,如 ...
- Trainmaster One Hundred Twenty
他是美国最伟大的探险家及创业家之一,但与贝尔(Bell),商务防水男表爱迪生(Edison),古德伊尔(Goodyear),及莱特兄弟(Wright brothers)等不同,他杰出的非凡成就其实并未 ...
- Codeforces Round #741 (Div. 2)
Codeforces Round #741 (Div. 2) 题号 题目 知识点 A The Miracle and the Sleeper B Scenes From a Memory C Ring ...
- CodeForces - 1543D2 RPD and Rap Sheet (Hard Version)(交互+模拟)
题目链接:点击查看 题目大意:交互题猜密码,设原密码为 xxx,猜的密码为 yyy,如果没猜到,密码会自适应变成 zzz,满足 x⊕z=yx \oplus z=yx⊕z=y ,最多猜 nnn 次,对于 ...
- Endianness
Endianness(本文章转载于维基百科) From Wikipedia, the free encyclopedia (Redirected from Endianess) The terms e ...
- 决战秋招 -- 经典面试题集锦
更新中- 文章目录 一.Sort 1. Bubble Sort 2. Quick Sort 3. Heap Sort 二.Tree 1. Traversal 2. 前序中序 --> 构建树/求后 ...
最新文章
- 利用棋盘格重新校正摄像头,求取Apriltag取向
- Science Advances文章揭示长时记忆的神经动态表征机制
- 汇编第二章节检测2-1
- 几张图可以理解GC JVM调优的内容
- #define typedef 区别
- 【Docker】Docker 一个偶现的错误 bash命令突然找不到
- android 两个视频合并,手机如何合并视频片段 安卓手机多个视频合并成一个的方法...
- arcgis地理配准_【更新70篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
- PNP型三极管是不是要发射极接正电压,基极和集电极接地才能工作?能给张图不?
- 2020最新版python基础入门学习视频教程
- html/CSS 字体样式表 font-family:中文字体的英文名称
- 风电远程监控系统解决方案,双碳战略下新能源运维市场正当红
- 车牌识别之二:字符分割
- 第四章 账号权限管理
- 成为智者的四个敌人——唐望
- oracle rac部署示意图,Oracle 11g RAC部署手册 For Linux PDF
- Windows下载安装包格式说明
- 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第二十一集
- 微信小程序支付 php后台对接完整代码
- 基于vue-cli快速构建
热门文章
- SQL数据库查询语句
- 使用计算机用眼卫生,长期用电脑致眼睛干涩 注意用眼卫生
- 传奇世界最好的版本:
- Error creating bean with name ‘sqlSessionFactory‘ defined in class path reso
- springboot整合rabbitmq的发布确认,消费者手动返回ack,设置备用队列,以及面试题:rabbitmq确保消息不丢失
- 简单三步解除Word文档保护密码(转)
- Python爬虫实战示例-51job和豆瓣电影
- 小米昨天发布的新机,简直太TM牛了……
- 《程序员脱发指南》--饮食篇
- 细说——sqlmap