• codeforces 558E A Simple Task 线段树


    题目链接

    题意较为简单。

    思路:

    由于仅仅有26个字母,所以用26棵线段树维护就好了,比較easy。

    #include <iostream>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <cstdio>
    #include <map>
    #include <queue>
    #include <algorithm>
    #include <stack>
    #include <cstring>
    #include <cmath>
    #include <set>
    #include <vector>
    using namespace std;
    template <class T>
    inline bool rd(T &ret) {
    	char c; int sgn;
    	if (c = getchar(), c == EOF) return 0;
    	while (c != '-' && (c<'0' || c>'9')) c = getchar();
    	sgn = (c == '-') ? -1 : 1;
    	ret = (c == '-') ? 0 : (c - '0');
    	while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
    	ret *= sgn;
    	return 1;
    }
    template <class T>
    inline void pt(T x) {
    	if (x <0) {
    		putchar('-');
    		x = -x;
    	}
    	if (x>9) pt(x / 10);
    	putchar(x % 10 + '0');
    }
    typedef long long ll;
    typedef pair<ll, ll> pii;
    const int N = 1e5 + 100;
    #define lson (id<<1)
    #define rson (id<<1|1)
    #define L(x) tree[x].l
    #define R(x) tree[x].r
    #define Hav(x) tree[x].hav
    #define Siz(x) tree[x].siz
    #define Lazy(x) tree[x].lazy
    struct Tree {
    	struct Node {
    		int l, r, siz;//siz表示区间长度
    		int hav;//hav表示这个区间的和 
    		int lazy;//lazy为2表示清空区间 lazy为1表示把区间都变为1
    	}tree[N << 2];
    	void build(int l, int r, int id) {
    		L(id) = l; R(id) = r; Siz(id) = r - l + 1;
    		Hav(id) = Lazy(id) = 0;
    		if (l == r)return;
    		int mid = (l + r) >> 1;
    		build(l, mid, lson); build(mid + 1, r, rson);
    	}
    	void Down(int id) {
    		if (Lazy(id) == 1) {
    			Lazy(id) = 0;
    			Hav(lson) = Siz(lson); Hav(rson) = Siz(rson);
    			Lazy(lson) = Lazy(rson) = 1;
    		}
    		else if (Lazy(id) == 2) {
    			Lazy(id) = 0;
    			Hav(lson) = Hav(rson) = 0;
    			Lazy(lson) = Lazy(rson) = 2;
    		}
    	}
    	void Up(int id) {
    		Hav(id) = Hav(lson) + Hav(rson);
    	}
    	void updata(int l, int r, int val, int id) {
    		if (l == L(id) && R(id) == r) {
    			if (val == 1) 
    				Hav(id) = Siz(id);
    			else Hav(id) = 0;
    			Lazy(id) = val;
    			return;
    		}
    		Down(id);
    		int mid = (L(id) + R(id)) >> 1;
    		if (r <= mid)updata(l, r, val, lson);
    		else if (mid < l)updata(l, r, val, rson);
    		else {
    			updata(l, mid, val, lson);
    			updata(mid + 1, r, val, rson);
    		}
    		Up(id);
    	}
    	int query(int l, int r, int id) {
    		if (l == L(id) && R(id) == r) {
    			return Hav(id);
    		}
    		Down(id);
    		int mid = (L(id) + R(id)) >> 1, ans = 0;
    		if (r <= mid)ans = query(l, r, lson);
    		else if (mid < l)ans = query(l, r, rson);
    		else {
    			ans = query(l, mid, lson) + query(mid + 1, r, rson);
    		}
    		Up(id);
    		return ans;
    	}
    };
    Tree alph[26];
    int n, q;
    char s[N];
    int sum[26];
    int main() {
    	rd(n); rd(q);
    	for (int i = 0; i < 26; i++)alph[i].build(1, n, 1);
    	scanf("%s", s + 1);
    	for (int i = 1; i <= n; i++) {
    		alph[s[i] - 'a'].updata(i, i, 1, 1);
    	}
    	while (q--) {
    		int l, r, in;
    		rd(l); rd(r); rd(in);
    		memset(sum, 0, sizeof sum);
    		for (int i = 0; i < 26; i++)
    		{
    			sum[i] += alph[i].query(l, r, 1);
    			alph[i].updata(l, r, 2, 1);
    		}
    		int tim = 26, i;
    		if (in)i = 0; else i = 25, in = -1;
    		for (;tim--; i += in) {
    			if (sum[i] == 0)continue;
    			alph[i].updata(l, l + sum[i] - 1, 1, 1);
    			l += sum[i];
    		}
    	}
    	for (int i = 1; i <= n; i++)
    	{
    		for (int j = 0; j < 26; j++)
    			if (alph[j].query(i, i, 1))
    			{
    				putchar(j + 'a'); break;
    			}
    	}
    	return 0;
    }


  • 相关阅读:
    如何通过WallpaperManager(壁纸管理器)设置与修改壁纸?
    Android 4.0 Launcher2源码分析——主布局文件(转)
    android 国际化 横屏(land) 竖屏(port)margin外边距和padding内边距
    轻量数据库SQLiteDataBase的相关操作方法
    Gradle sync failed: Could not find method android() for arguments 错误的解决办法
    本地Gradle配置方法,免去长时间的更新同步等待
    Android Studio and Gradle安装心得
    Error:CreateProcess error=216的错误,JDK版本不匹配问题。
    Docker部署nginx+springboot-web项目
    使用python完成对excel的操作
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6938260.html
Copyright © 2020-2023  润新知