UVA 11402 – Ahoy, Pirates!(段树)

UVA 11402 – Ahoy, Pirates!(段树)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

UVA 11402 – Ahoy, Pirates!

题目链接

题意:总的来说意思就是给一个01串,然后有3种操作
1、把一个区间变成1
2、把一个区间变成0
3、把一个区间翻转(0变1,1变0)

思路:线段树搞,开一个延迟标记当前操作就可以,注意几种状态间的转变方式就可以

代码:

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define lson(x) ((x<<1)+1)#define rson(x) ((x<<1)+2)const int N = 1100005;int t, s[N], n, sn;char str[55];struct Node {    int l, r, b, flag;    Node() {}    Node(int l, int r) {	this->l = l; this->r = r;	b = flag = 0;    }    int len() {	return r - l + 1;    }} node[4 * N];void pushup(int x) {    node[x].b = node[lson(x)].b + node[rson(x)].b;}void build(int l, int r, int x = 0) {    node[x] = Node(l, r);    if (l == r) {	node[x].b = s[l];	return;    }    int mid = (node[x].l + node[x].r) / 2;    build(l, mid, lson(x));    build(mid + 1, r, rson(x));    pushup(x);}void init() {    scanf("%d", &n);    sn = 0;    while (n--) {	int num;	scanf("%d", &num);	scanf("%s", str);	int len = strlen(str);	while (num--) {	    for (int i = 0; i < len; i++)		s[sn++] = str[i] - '0';	}    }    build(0, sn - 1);}//0不变,1黑。2白。3翻转int getS(int a, int b) {    if (a == 3 && b == 3) return 0;    if (a == 3 && b == 1) return 2;    if (a == 3 && b == 2) return 1;    if (a == 3 && b == 0) return 3;    if (a == 2) return 2;    if (a == 1) return 1;    return 0;}void pushdown(int x) {    if (node[x].flag) {	int ls = getS(node[x].flag, node[lson(x)].flag);	node[lson(x)].flag = ls;	if (node[x].flag == 2) node[lson(x)].b = 0;	if (node[x].flag == 1) node[lson(x)].b = node[lson(x)].len();	if (node[x].flag == 3) node[lson(x)].b = node[lson(x)].len() - node[lson(x)].b;	int rs = getS(node[x].flag, node[rson(x)].flag);	node[rson(x)].flag = rs;	if (node[x].flag == 2) node[rson(x)].b = 0;	if (node[x].flag == 1) node[rson(x)].b = node[rson(x)].len();	if (node[x].flag == 3) node[rson(x)].b = node[rson(x)].len() - node[rson(x)].b;	node[x].flag = 0;    }}void set(int l, int r, int v, int x = 0) {    if (node[x].l >= l && node[x].r <= r) {	int ts = getS(v, node[x].flag);	if (v == 1)	    node[x].b = node[x].len();	else if (v == 2)	    node[x].b = 0;	else	    node[x].b = node[x].len() - node[x].b;	node[x].flag = ts;	return;    }    pushdown(x);    int mid = (node[x].l + node[x].r) / 2;    if (l <= mid) set(l, r, v, lson(x));    if (r > mid) set(l, r, v, rson(x));    pushup(x);}int S(int l, int r, int x = 0) {    if (node[x].l >= l && node[x].r <= r)	return node[x].b;    int mid = (node[x].l + node[x].r) / 2;    int ans = 0;    pushdown(x);    if (l <= mid) ans += S(l, r, lson(x));    if (r > mid) ans += S(l, r, rson(x));    pushup(x);    return ans;}int main() {    int cas = 0;    scanf("%d", &t);    while (t--) {	init();	int q;	scanf("%d", &q);	char Q[5]; int a, b;	printf("Case %d:\n", ++cas);	int Qcas = 0;	while (q--) {	    scanf("%s%d%d", Q, &a, &b);	    if (Q[0] == 'F') set(a, b, 1);	    if (Q[0] == 'E') set(a, b, 2);	    if (Q[0] == 'I') set(a, b, 3);	    if (Q[0] == 'S') printf("Q%d: %d\n", ++Qcas, S(a, b));	}    }    return 0;}

版权声明:本文博主原创文章。博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116957.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月12日 下午9:00
下一篇 2022年1月12日 下午10:00


相关推荐

  • Mysql 日期类型比较 TIMESTAMPDIFF

    Mysql 日期类型比较 TIMESTAMPDIFF  在数据库查询中,经常遇到计算2个日期相差值,SQL提供一个非常有用的函数:TIMESTAMPDIFFT。  基本语法:TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)    其中,interval的取值可以为:SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTERorYEAR   …

    2022年5月18日
    92
  • Mac下homebrew安装

    Mac下homebrew安装需要替换国内镜像 usr bin ruby e curl fsSLhttps cdn jsdelivr net gh ineo6 homebrew install install 该脚本用了中科大镜像加速访问 仅修改仓库地址部分 不会产生安全隐患 关于中科大所提供的 Homebrew 镜像服务 https lug ustc edu cn wiki mirrors help brew git 以下是中科大的 Homebrew 安装帮助 Homebrew

    2025年8月5日
    8
  • fastJson 解析json字符串

    fastJson 解析json字符串packagecom zhw project domain importcom alibaba fastjson JSON importcom alibaba fastjson JSONArray importcom alibaba fastjson JSONObject importjava util ArrayList importjava util List 正常防疫对象 antiepidemic normal authorruoyi

    2026年3月19日
    2
  • 什么叫单模光纤_单模光纤和多模光纤的区别是什么

    什么叫单模光纤_单模光纤和多模光纤的区别是什么单模光纤和多模光纤有什么区别呢 折射率的不同 单模光纤多采用阶跃折射率分布 多模光纤可以采用阶跃折射率分布 也可以采用渐变折射率分布 因此 石英光纤大体上也可以采用多模阶跃折射率光纤 多模渐变折射率光纤和单模阶跃折射率光纤三种 传输模式的不同 单模光纤对给定的工作波长只能传输一个模式 多模光纤可以传输若干个模式 光这种电磁波在光纤中的传播属于介质圆波导 光线在介质的界面发生全反射时 电磁波被限制在

    2026年3月26日
    2
  • 奉劝那些刚参加工作的学弟学妹们:要想学好并发编程,这些并发容器的坑是你必须要注意的!!(建议收藏)「建议收藏」

    奉劝那些刚参加工作的学弟学妹们:要想学好并发编程,这些并发容器的坑是你必须要注意的!!(建议收藏)「建议收藏」冰河总结了在高并发、大流量场景下使用JDK中并发容器的坑,要想学好并发编程,这些坑是你一定要注意的,冰河强烈建议收藏!!

    2022年8月22日
    9
  • OpenGrok安装

    OpenGrok安装windows安装OpenGrok安装需要的几个工具1.JDK2.tomcat3.opengrk4.ctags1.软件安装1.1安装JDK下载地址:http://www.Oracle.com/technetwork/Java/javase/downloads/index.html从以上下载地址下载并安装。配置环境变量,我安装在H盘的,如下:J

    2022年5月1日
    87

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号