2699: 二进制与、平方和

时间限制: 3 Sec  内存限制: 512 MB
提交: 58  解决: 10
[状态] [讨论版] [提交] [命题人:admin]

题目描述

请你维护一个长度为 n 的非负整数序列 a1,a2,…,an,支持以下两种操作:

  1. 第一种操作会将序列 al,al+1,…,ar 中的每个元素,修改为各自和 x 的"二进制与"(Bitwise binary AND)的值,其中 l,r,x 在每次操作时会给定;
  2. 第二种操作会询问序列 al,al+1,…,ar 中所有元素的平方和模 998244353的值,即 ∑i=lrai2 模 998244353,其中 l,r在每次操作时会给定。

总共有 q 次操作,请你在维护序列的过程中,输出第二种操作所询问的答案。注意需要取模。

输入

第一行,一个整数 n (1≤n≤3×105),表示序列的长度。
第二行,共 n 个整数 ai (0≤ai<224),表示序列。
第三行,一个整数 q (1≤q≤3×105),表示询问的数量。
接下来 q 行,每行表示一个操作,输入有两种格式:

  1. 第一种操作的格式为 "1 l r x",表示将序列中编号在区间  [l,r]  的所有元素,修改为和 x 二进制与操作后的值,其中  1≤l≤r≤n, 0≤x<224;
  2. 第二种操作的格式为 "2 l r",表示询问序列中编号在区间  [l,r]  的所有元素的平方和,模  998244353 的值,其中  1≤l≤r≤n。

数据保证至少有一个第二种操作,即保证至少询问一次答案。

输出

每当遇到第二种操作时,输出询问的答案。注意需要取模。

样例输入 Copy

3
13 31 28
4
2 1 3
1 3 3 25
1 1 2 18
2 2 3

样例输出 Copy

1914
900

提示

样例输入二
5
9 11 12 5 1
7
2 1 3
1 3 3 0
1 1 3 9
1 4 5 13
2 1 3
1 4 5 14
2 1 5

样例输出二
346
162
178

样例输入三
4
16777215 16777215 16777215 16777214
4
2 2 2
1 1 4 16777214
2 1 4
2 3 4

样例输出三
981185168
795789897
897017125

"二进制与"(Bitwise binary AND)结果的第 i 个二进制位为 1,当且仅当两个操作数的第 i 位都为 1。

思路:

开一颗线段树,然后维护每个区间各个位上的0跟1的个数,考虑对于每个位置最多被修改24次,因为一共

24位,如果当前为0后就不会再被修改了,如果当前位是1且与他AND的数字该位为1则也不需要修改。所以

直接暴力更新叶子节点,递归的时候判断当前区间有没有向下递归的意义了,没有直接return。有意义就是说

向下的子树中至少有一个点的值会被修改。不怎么写数据结构,此题时间复杂度不是很会证明。。

#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
typedef long long ll;
int a[N];
int c[4 * N];
int cnt[4 * N][24];
int lzy[4 * N];
#define ls ((x) << 1)
#define rs ((x) << 1 | 1)
#define mid ((L) + (R) >> 1)
void push_up(int x)
{c[x] = (c[ls] + c[rs]) % mod;for (int i = 0; i < 24; i++)cnt[x][i] = cnt[ls][i] + cnt[rs][i];
}
void build(int x, int L, int R)
{if (L == R){for (int i = 0; i < 24; i++)cnt[x][i] = ((a[L] >> i) & 1);c[x] = 1LL * a[L] * a[L] % mod;return;}build(ls, L, mid);build(rs, mid + 1, R);push_up(x);
}
void update(int x, int L, int R, int ql, int qr, int val)
{if (ql > qr)return;if (L == R){int sum = 0;for (int i = 0; i < 24; i++){if (((val >> i) & 1 == 1) && cnt[x][i])sum |= (1 << i);elsecnt[x][i] = 0;}c[x] = 1LL * sum * sum % mod;return;}if (ql <= L && qr >= R){int flag = 1;for (int i = 0; i < 24; i++){if (cnt[x][i] && ((val >> i) & 1) == 0){flag = 0;break;}}if (flag)return;}if (ql <= mid)update(ls, L, mid, ql, qr, val);if (qr > mid)update(rs, mid + 1, R, ql, qr, val);push_up(x);
}
int query(int x, int L, int R, int ql, int qr)
{if (ql <= L && qr >= R)return c[x];ll res = 0;if (ql <= mid)res += query(ls, L, mid, ql, qr), res %= mod;if (qr > mid)res += query(rs, mid + 1, R, ql, qr), res %= mod;return res;
}int main()
{
#ifdef LOCALfreopen("E:/input.txt", "r", stdin);
#endifint n;scanf("%d", &n);for (int i = 1; i <= n; i++)scanf("%d", &a[i]);build(1, 1, n);int q;scanf("%d", &q);while (q--){int op;scanf("%d", &op);if (op == 1){int L, R, x;scanf("%d%d%d", &L, &R, &x); update(1, 1, n, L, R, x);}else{int L, R;scanf("%d%d", &L, &R);printf("%d\n", query(1, 1, n, L, R));}}return 0;
}

“卓见杯”2020年河南省第二届CCPC大学生程序设计竞赛 J.二进制与、平方和相关推荐

  1. 郑州大学计算机系王院长,我院成功承办河南省第十二届ACM大学生程序设计竞赛...

    5月6日至7日,由河南省计算机学会主办.我校承办的河南省第十二届ACM大学生程序设计竞赛在体育中心隆重举行.来自全省45所高校的231支参赛队近700名学生及200名带队教练参加了竞赛,参赛院校.参赛 ...

  2. 【算法题解】2022年第四届河南省CCPC大学生程序设计竞赛(喜提银牌)

    文章目录 A. Mocha 上小班啦 E. Serval 的俳句 F. 集合之和 G. Mocha 上大班啦 H. 旋转水管 比赛题目已上传到CF:2022 CCPC Henan Provincial ...

  3. 河南计算机程序大赛,我院成功举办河南省第十一届ACM大学生程序设计竞赛

    5月26-27日,由ACM/ICPC亚洲区竞赛组委会授权.河南省计算机学会主办.我校承办的河南省第十一届ACM大学生程序设计竞赛在我校举行.来自省内30余所本科院校的215支参赛队645名学生参加了竞 ...

  4. 河南省第十一届ACM大学生程序设计竞赛题目

    河南省第十一届ACM大学生程序设计竞赛题目 A.计划日 B.治安管理 C.山区修路 E.物流配送 F.Gene mutation G.Checkpoints H.Attack City Capture ...

  5. 2019河南省第十二届ACM大学生程序设计竞赛参赛感

    盼望着,盼望着,acm省赛终于来了.2019年5月6日,一大早我们三个队就从郑州出发前往驻马店市--黄淮学院,一首<写给黄淮>火起来的大学.第一次听说黄淮学院还是高三时候韩老师天天对我们的 ...

  6. 2022年第四届河南省CCPC大学生程序设计竞赛代码+简单思路(退役战了算是,还好金了)

    为了防止以后刷机把代码清空,贴一下赛时的代码和补题后的代码 省赛GYM地址 榜单 金牌,嘿嘿,金牌,嘿嘿

  7. 2020年第十二届全国大学生数学竞赛初赛(非数学)大题2-3题解析

    求解思路: 该题考的是极限的求解,求的是含数列的极限,因此我们首先要将该数列的通项公式求出来,代进去就能化为标准的极限式,就可以进行求解了. 对于该数列,我们先对其变形,再通过递推找到通项公式. 解法 ...

  8. 河南省第十届大学生程序设计竞赛 A,B,C,D,F,G,H 题解

    H: Intelligent Parking Building 时间限制: 1 Sec  内存限制: 128 MB 提交: 22  解决: 20 [提交][状态][讨论版] 题目描述 There is ...

  9. 河南省第六届大学生程序设计竞赛——外星人的供给站

    外星人的供给站 题目描述 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本形式的认识.比如,我们所知的任何生命都离不开液态水,并且都是基于化学 ...

最新文章

  1. NoClassDefFoundError: org/springframework/core/ErrorCoded 报错
  2. python 根据时间来生成唯一的字符串
  3. MySQL断开SpringBoot_数据库连接中断-spring-springBoot
  4. 配置ip地址四种方法,方便学习linux的朋友
  5. 哪个瞬间你对科研圈彻底失望了?
  6. TCL 中upvar 用法 (摘自http://www.cnblogs.com/kane1990/archive/2011/12/19/2293981.html)
  7. SAP S4 Finance6个支持企业实时财务管理的主要创新领域
  8. UIAlertController 类似相册拍照弹出框
  9. java.lang.StringIndexOutOfBoundsException: String index out of range: 0错误的原因
  10. java类Writer和类Reader小结
  11. 什么是CTI?呼叫中心系统CTI技术的应用
  12. 余世伟视频笔记----如何塑造管理者的性格魅力领袖根性之诚信和担当
  13. JN5169 基于 JN-AN-1217 组网点灯
  14. Micropython——看门狗定时器(WDT类)
  15. Python--第一天
  16. SCL3400-D01双轴高精度倾角计
  17. CTGNet GIA和CN2 GIA的区别
  18. Linux tar压缩和解压
  19. app逆向--某视频刷邀请
  20. 选项菜单OptionMenu

热门文章

  1. 浅析 AGS REST API
  2. 用户账号管理和组管理
  3. C语言 深度剖析数据在内存中的存储(2)
  4. 事务的概念以及事物的四大特性
  5. 动态网站要怎么通过CDN实现加速?
  6. 【Python实战】 ---- 爬虫 爬取LOL英雄皮肤图片
  7. Linux学习笔记_5_文件目录类指令日期,时间
  8. 吾父马达加斯加之旅-3
  9. 2018------书籍电影和音乐
  10. HBuilder的安装与试用