AC日记——妖梦斩木棒 洛谷 P3797

妖梦斩木棒

思路:

  略坑爹;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
#define maxm maxn<<2
int n,m,L[maxm],R[maxm],mid[maxm],dis[maxm];
bool xx[maxm],ll[maxm],rr[maxm];
struct AnsType {
    int dis;
    bool l,r,x;
};
inline void in(int &now)
{
    char Cget=getchar();now=0;
    while(Cget>‘9‘||Cget<‘0‘)Cget=getchar();
    while(Cget>=‘0‘&&Cget<=‘9‘)
    {
        now=now*10+Cget-‘0‘;
        Cget=getchar();
    }
}
void updata(int now)
{
    xx[now]=xx[now<<1]&xx[now<<1|1];
    dis[now]=dis[now<<1]+dis[now<<1|1];
    if(rr[now<<1]&&ll[now<<1|1]&&!xx[now<<1]&&!xx[now<<1|1]) dis[now]++;
    ll[now]=xx[now<<1]?ll[now<<1|1]:ll[now<<1];
    rr[now]=xx[now<<1|1]?rr[now<<1]:rr[now<<1|1];
}
struct AnsType node(AnsType a,AnsType b)
{
    AnsType res;
    res.x=a.x&b.x;
    res.l=a.x?b.l:a.l;
    res.r=b.x?a.r:b.r;
    res.dis=a.dis+b.dis;
    if(a.r&&b.l&&!a.x&&!b.x) res.dis++;
    return res;
}
void build(int now,int l,int r)
{
    L[now]=l,R[now]=r;
    if(l==r)
    {
        if(l==1) rr[now]=1;
        else if(r==n) ll[now]=1;
        else xx[now]=1,ll[now]=1,rr[now]=1;
        return;
    }
    mid[now]=l+r>>1;
    build(now<<1,l,mid[now]);
    build(now<<1|1,mid[now]+1,r);
    updata(now);
}
void updata(int now,int to,int t)
{
    if(L[now]==R[now])
    {
        ll[now]=rr[now]=xx[now]=0;
        if(t==0) xx[now]=1,ll[now]=1,rr[now]=1;
        if(t==1) ll[now]=1;
        if(t==2) rr[now]=1;
        return ;
    }
    if(to<=mid[now]) updata(now<<1,to,t);
    else updata(now<<1|1,to,t);
    updata(now);
}
AnsType query(int now,int l,int r)
{
    if(L[now]==l&&R[now]==r) return (AnsType){dis[now],ll[now],rr[now],xx[now]};
    if(r<=mid[now]) return query(now<<1,l,r);
    else if(l>mid[now]) return query(now<<1|1,l,r);
    else return node(query(now<<1,l,mid[now]),query(now<<1|1,mid[now]+1,r));
}
int main()
{
    in(n),in(m),build(1,1,n);
    int op,l,r,x;char ch[4];
    while(m--)
    {
        in(op);
        if(op==1)
        {
            in(x),scanf("%s",ch);
            if(ch[0]==‘X‘) ch[0]=0;
            else if(ch[0]==‘)‘) ch[0]=1;
            else ch[0]=2;
            updata(1,x,ch[0]);
        }
        else
        {
            in(l),in(r);
            AnsType res=query(1,l,r);
            printf("%d\n",res.dis);
        }
    }
    return 0;
}
时间: 2024-08-24 09:38:18

AC日记——妖梦斩木棒 洛谷 P3797的相关文章

洛谷P3797 妖梦斩木棒

P3797 妖梦斩木棒 题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都是左右都被切断的断头,我们记做’X’,最左边的一段和最右边的一段各有一个圆头,记做’(‘和’)’.幽幽子吃饱后闲来无事,决定戏弄一下妖梦.她拿来了许多这样的三种小段木棒,来替换掉妖梦切下来的n段中的一部分,然后问妖梦一些问题.这些操作可以这样描述: 1 x C 将第

洛谷 P3797 妖梦斩木棒

妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都是左右都被切断的断头,我们记做’X’,最左边的一段和最右边的一段各有一个圆头,记做’(‘和’)’.幽幽子吃饱后闲来无事,决定戏弄一下妖梦.她拿来了许多这样的三种小段木棒,来替换掉妖梦切下来的n段中的一部分,然后问妖梦一些问题.这些操作可以这样描述: 1 x C 将第x个小段的木棒替换成C型,C只会是

妖梦斩木棒

题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都是左右都被切断的断头,我们记做'X',最左边的一段和最右边的一段各有一个圆头,记做'('和')'.幽幽子吃饱后闲来无事,决定戏弄一下妖梦.她拿来了许多这样的三种小段木棒,来替换掉妖梦切下来的n段中的一部分,然后问妖梦一些问题.这些操作可以这样描述: 1 x C 将第x个小段的木棒替换成C型

[luogu P3797] 妖梦斩木棒 [线段树]

题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都是左右都被切断的断头,我们记做’X’,最左边的一段和最右边的一段各有一个圆头,记做’(‘和’)’.幽幽子吃饱后闲来无事,决定戏弄一下妖梦.她拿来了许多这样的三种小段木棒,来替换掉妖梦切下来的n段中的一部分,然后问妖梦一些问题.这些操作可以这样描述: 1 x C 将第x个小段的木棒替换成C型

AC日记——小A的糖果 洛谷七月月赛

小A的糖果 思路: for循环贪心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define ll long long ll ai[maxn],n,m,ans; inline void in(ll &now) { char Cget=getchar();now=0; while(Cget>'9'||Cget<'0')Cget=getchar(); while(Cget>

AC日记——无线网络发射器选址 洛谷 P2038

题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 1 .东西向街道从北到南依次编号为0,1,2…128 , 南北向街道从西到东依次编号为0,1,2…128 . 东西向街道和南北向街道相交形成路口,规定编号为x 的南北向街道和编号为y 的东西向街道形成的路口的坐标是(x , y ). 在 某 些 路口存在一定数量的公共

AC日记——红色的幻想乡 洛谷 P3801

红色的幻想乡 思路: 线段树+容斥原理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxm maxn<<2 #define ll long long class TreeType { private: int L[maxm],R[maxm],mid[maxm],dis[maxm]; public: void build(int now,int l,int r) { L

AC日记——矩阵取数游戏 洛谷 P1005

矩阵取数游戏 思路: dp+高精: 代码: #include <bits/stdc++.h> using namespace std; #define ll long long struct Int { int len; char ai[300]; Int() { len=1,ai[0]=0; } void Count(int pos) { len++; if(pos/10) Count(pos/10); } void operator=(int pos_) { int pos=pos_; l

洛谷P3799 妖梦拼木棒

题目背景 上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来. 题目描述 有n根木棒,现在从中选4根,想要组成一个正三角形,问有几种选法? 输入输出格式 输入格式: 第一行一个整数n 第二行n个整数,a1,a2,……an(0<ai<=5000),代表每根木棒的长度. 输出格式: 一行一个整数,对1e9+7取模 输入输出样例 输入样例#1: 复制 4 1 1 2 2 输出样例#1: 复制 1 说明 对于30%的数据 N<=5000 对于100%的数据 N<=100000 by-sz