zoukankan      html  css  js  c++  java
  • P2787 语文1(chin1)- 理理思维

    题目链接:

    排序直接桶排序就行了

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define re register
    #define pb push_back
    #define fi first
    #define se second
    const int N=3e6+10;
    const int mod=998244353;
    void read(int &a)
    {
        a=0;int d=1;char ch;
        while(ch=getchar(),ch>'9'||ch<'0')
            if(ch=='-')
                d=-1;
        a=ch^48;
        while(ch=getchar(),ch>='0'&&ch<='9')
            a=(a<<3)+(a<<1)+(ch^48);
        a*=d;
    }
    int vis[30];
    struct note
    {
        int l,r;
        mutable char v;
        note(int L,int R=-1,char V=' '){l=L,r=R,v=V;}
        bool operator < (const note &x) const
        {
            return l<x.l;
        }
    };
    set <note> s;
    set <note> :: iterator split(int pos)
    {
        auto it=s.lower_bound(note(pos));
        if(it!=s.end()&&it->l==pos) return it;
        it--;
        if(it->r<pos) return s.end();
        int L=it->l,R=it->r;
        char V=it->v;
        s.erase(it);
        s.insert(note(L,pos-1,V));
        return s.insert(note(pos,R,V)).fi;
    }
    void modify(int l,int r,char v)
    {
        auto it2=split(r+1),it1=split(l);
        s.erase(it1,it2);
        s.insert(note(l,r,v));
    }
    int query(int l,int r,char v)
    {
        int ans=0;
        auto it2=split(r+1),it1=split(l);
        for(;it1!=it2;it1++) it1->v==v?ans+=it1->r-it1->l+1:0;
        return ans;
    }
    void sorted(int l,int r)
    {
        memset(vis,0,sizeof(vis));
        auto it2=split(r+1),it1=split(l),it=it1;
        for(;it1!=it2;it1++) vis[it1->v-'A']+=it1->r-it1->l+1;
        s.erase(it,it2);
        int x=l;
        for(re int i=0;i<26;i++)
        {
            if(vis[i])
            {
                s.insert(note(x,x+vis[i]-1,i+'A'));
                x=x+vis[i];
            }
        }
    }
    int main()
    {
        int n,m;
        read(n),read(m);
        char ch;
        for(re int i=1;i<=n;i++) scanf(" %c",&ch),ch=toupper(ch),s.insert(note(i,i,ch));
        for(re int i=1,op,x,y;i<=m;i++)
        {
            read(op),read(x),read(y);
            if(op==1) scanf(" %c",&ch),ch=toupper(ch),printf("%d
    ",query(x,y,ch));
            else if(op==2) scanf(" %c",&ch),ch=toupper(ch),modify(x,y,ch);
            else sorted(x,y);
        }
        return 0;
    }
  • 相关阅读:
    【ASP.Net MVC3 】使用Unity 实现依赖注入
    小菜学习设计模式(五)—控制反转(Ioc)
    ASP.NET MVC中使用Unity Ioc Container
    Unity依赖注入使用详解
    单例模式实现
    Oracle书籍资料链接——更新ing
    eclipse设置控制台字体大小
    eclipse——反编译插件
    java.lang.String里面的trim()方法——删除首尾空格
    java关键词整理——思维导图
  • 原文地址:https://www.cnblogs.com/acm1ruoji/p/11885089.html
Copyright © 2011-2022 走看看