随笔 - 188  文章 - 0  评论 - 59  阅读 - 7707

CSP-S模拟11 回文 快速排序 混乱邪恶 校门外歪脖树上的鸽子

T1:给你n*m的字符串矩阵,求从(1,1)到(n,m)的路径数量,要求经过路径字符串组成回文。(n,m<=500)

从回文中心开始枚举,dp[i][j][x][y]表示(i,j)开始,(x,y)结束的回文路径数量,先预处理中心然后扔进队列BFS。每个节点最多入队一次,被更新4次,O(nm4)
注意空间的优化,因为确定3个点就可以确定唯一状态,所以第4个维度可以省略。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define _f(i,a,b) for(register int i=a;i<=b;++i)
#define f_(i,a,b) for(register int i=a;i>=b;--i)
#define chu printf
#define ll long long
#define rint register int
#define ull unsigned long long
inline ll re()
{
    ll x=0,h=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')h=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0')
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*h;
}
const int N=510;
const ll mod=993244853;
int dp[N][N][N],C[1000+100][1000+100];//走到(x1,y1)--(x2,y2)的合法回文路径数量
bool vis[N][N][N];
int n,m;
char s[510][510],ls[510<<1];
struct Node
{
	int a1,b1,a2,b2;
	Node(){}
	Node(int _a1,int _b1,int _a2,int _b2)
	{
		a1=_a1;b1=_b1;a2=_a2,b2=_b2;
	}
};
deque<Node>st;
// inline ll qpow(ll a,ll b)
// {
// 	ll nas=1;
// 	while(b)
// 	{
// 		if(b&1)nas=nas*a%mod;
// 		a=a*a%mod;
// 		b>>=1;
// 	}
// 	return  nas;
// }
inline void upd(int&x,int y)
{
	x=((ll)x+(ll)y)%mod;
}
inline bool Can(int x,int y,int xx,int yy)
{
	return (x>=1&&x<=n&&y>=1&&y<=m&&xx>=1&&xx<=n&&yy>=1&&yy<=m);
}
signed main()
{
  // freopen("1.in","r",stdin);
   //freopen("2.out","w",stdout);
   n=re(),m=re();
   _f(i,1,n)
   scanf("%s",s[i]+1);
   bool spe=1;
   _f(i,1,n)
   {
		_f(j,1,m)
		if(i>1&&j<m)
		{
			if(s[i][j]!=s[i-1][j+1])
			{
				spe=0;break;
			}
		}
		if(!spe)break;
   }
   if(s[1][1]!=s[n][m])
   {
	   chu("0");return 0;
   }
  // spe=0;
	if(spe)
	{
		//chu("in");
		int cnt=0;
		_f(i,1,m)ls[++cnt]=s[1][i];
		_f(i,2,n)ls[++cnt]=s[i][m];
		int mid=(n+m-1)/2;
		_f(i,1,mid)
		if(ls[i]!=ls[n+m-i])
		{
			chu("0");return 0;
		}
		//C[n+m-1][n-1]
		C[0][0]=1;
		_f(i,1,n+m-2)
		{
			C[i][0]=1;
			_f(j,1,i)
			upd(C[i][j],C[i-1][j-1]+C[i-1][j]);
		}
		chu("%d",C[n+m-2][n-1]);
		return 0;
	}
	int step=n+m-1;//回文串长度
	if(step&1)//如果长度是奇数,那么中间是谁都无所谓
	{
		int mid=step/2+1;int start,edn;
		if(mid<=m)start=1,edn=mid;
		else start=mid-m+1,edn=m;
		while(start<=n&&start>=1&&edn>=1&&edn<=m)
		{
			st.push_back(Node(start,edn,start,edn));
			dp[start][edn][start]=1;
            vis[start][edn][start]=1;
			start++,edn--;
		}
	}
	else
	{
		int mid=step/2,start,edn,_start,_edn;bool spea=0;
		//chu("mid:%d\n",mid);
		if(mid<=m)
		{
			//chu("in\n");
			start=1,edn=mid;
			if(mid<m)
			_start=1,_edn=mid+1;
			else _start=2,_edn=m;
		}
		else
		{
			start=mid-m+1,edn=m;
			_start=mid-m+2,_edn=m;
		}
        if(mid>=m)spea=1;
		while(start<=n&&_start<=n&&start>=1&&_start>=1&&edn<=m&&edn>=1&&_edn>=1&&_edn<=m)
		{
			
			if(s[start][edn]==s[_start][_edn])
			{
				//chu("has 2  %d %d %d %d\n",start,edn,_start,_edn);
				st.push_back(Node(start,edn,_start,_edn));
				dp[start][edn][_start]=1;
                vis[start][edn][_start]=1;
			}
           
            if(spea&&Can(_start,_edn,_start,_edn-1)&&s[_start][_edn]==s[_start][_edn-1])
            {
              //chu("check(%d,%d)-(%d,%d)\n",_start,_edn-1,_start,_edn);
                st.push_back(Node(_start,_edn-1,_start,_edn));
                dp[_start][_edn-1][_start]=1;
                vis[_start][_edn-1][_start]=1;
            }
            if(spea==0&&Can(start,edn,start+1,edn)&&s[start][edn]==s[start+1][edn])
            {
                st.push_back(Node(start,edn,start+1,edn));
                dp[start][edn][start+1]=1;
                vis[start][edn][start+1]=1;
            }
			start++,edn--;_start++,_edn--;
		}
	}
	//chu("%ld\n",st.size());
	Node ls;int cot=0;
	while(!st.empty())
	{
        ++cot;
	//	if(st.size()>250000)printf("st.size()\n",st.size());
		ls=st.front();st.pop_front();
		if(ls.a1==1&&ls.b1==1&&ls.a2==n&&ls.b2==m)
		break;//到了终点了
		//if(ls.a1==1&&ls.b1==9&&ls.a2==3)chu("update:(%d,%d,%d,%d)(%d)\n",ls.a1,ls.b1,ls.a2,ls.b2,dp[ls.a1][ls.b1][ls.a2]);
		if(Can(ls.a1,ls.b1-1,ls.a2,ls.b2+1)&&s[ls.a1][ls.b1-1]==s[ls.a2][ls.b2+1])
		{
			if(!vis[ls.a1][ls.b1-1][ls.a2])
			st.push_back(Node(ls.a1,ls.b1-1,ls.a2,ls.b2+1));
			vis[ls.a1][ls.b1-1][ls.a2]=1;//不可以多次放进去
			upd(dp[ls.a1][ls.b1-1][ls.a2],dp[ls.a1][ls.b1][ls.a2]);
           // if(ls.a1==2&&ls.b1-1==7&&ls.a2==3)
          //  chu("%d:(1)update from:%d %d %d %d\n",cot,ls.a1,ls.b1,ls.a2,ls.b2);
		}
		if(Can(ls.a1,ls.b1-1,ls.a2+1,ls.b2)&&s[ls.a1][ls.b1-1]==s[ls.a2+1][ls.b2])
		{
			if(!vis[ls.a1][ls.b1-1][ls.a2+1])
			st.push_back(Node(ls.a1,ls.b1-1,ls.a2+1,ls.b2));
			vis[ls.a1][ls.b1-1][ls.a2+1]=1;
			upd(dp[ls.a1][ls.b1-1][ls.a2+1],dp[ls.a1][ls.b1][ls.a2]);
           // if(ls.a1==2&&ls.b1-1==7&&ls.a2+1==3)
          // chu("%d (2)update from:%d %d %d %d\n",cot,ls.a1,ls.b1,ls.a2,ls.b2);
		}
		if(Can(ls.a1-1,ls.b1,ls.a2,ls.b2+1)&&s[ls.a1-1][ls.b1]==s[ls.a2][ls.b2+1])
		{
			if(!vis[ls.a1-1][ls.b1][ls.a2])
			st.push_back(Node(ls.a1-1,ls.b1,ls.a2,ls.b2+1));
			vis[ls.a1-1][ls.b1][ls.a2]=1;
			upd(dp[ls.a1-1][ls.b1][ls.a2],dp[ls.a1][ls.b1][ls.a2]);
           // if(ls.a1-1==2&&ls.b1==7&&ls.a2==3)
           // chu("%d (3)update from:%d %d %d %d\n",cot,ls.a1,ls.b1,ls.a2,ls.b2);
		}
		if(Can(ls.a1-1,ls.b1,ls.a2+1,ls.b2)&&s[ls.a1-1][ls.b1]==s[ls.a2+1][ls.b2])
		{
			if(!vis[ls.a1-1][ls.b1][ls.a2+1])
			st.push_back(Node(ls.a1-1,ls.b1,ls.a2+1,ls.b2));
			vis[ls.a1-1][ls.b1][ls.a2+1]=1;
			upd(dp[ls.a1-1][ls.b1][ls.a2+1],dp[ls.a1][ls.b1][ls.a2]);
          //   if(ls.a1-1==2&&ls.b1==7&&ls.a2+1==3)
          //  chu("%d (4)update from:%d %d %d %d\n",cot,ls.a1,ls.b1,ls.a2,ls.b2);
		}
	}
  //  _f(i,1,n)
  //  _f(j,1,m)
  //  _f(k,1,n)
  //  if(dp[i][j][k])chu("%d %d %d :%d\n",i,j,k,dp[i][j][k]);
	chu("%d",dp[1][1][n]);
    return 0;
}

T2:给你一段以a[1]为mid分割依据的快速排序代码,任意位置出现"nan"字符,则升序排序返回false。求Q个询问,若干段字符的排序结果。(len<=1e6)

s=t是赋值不是修改地址。
注意到如果第一个位置是nan,那么直接让他是最前面的。否则让后面的数中所有严格<它的排在它前面(按照升序,因为nan一定返回false所以会留在后面,数字排序和正茬一样)。
离散化数据,cnt记录每个值出现次数,last记录上次删除到的最大值,因为每次删除的数一定是不严格升序的连续序列,所以last~nowMax的位置就是当前nowMax位置可以使得被删除的一段数字,直接输出删除就行。
可以单调队列,也可以数组直接扫。

点击查看代码

<details>
<summary>点击查看代码</summary>

include<bits/stdc++.h>

using namespace std;

define _f(i,a,b) for(register int i=a;i<=b;++i)

define f_(i,a,b) for(register int i=a;i>=b;--i)

define chu printf

define ll long long

define rint register int

define ull unsigned long long

inline ll re()
{
ll x=0,h=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch'-')h=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*h;
}
const int N=5e5+100;
int n,T;
int a[N];//-1代表nan
int cnt[N],mp[N],mpct;
char ss[13];
inline void Deal()
{
n=re();//mp.clear();
_f(i,1,n)
{
scanf("%s",ss+1);
if(ss[1]
'n')a[i]=-1;
else
{
int x=0;int len=strlen(ss+1);int nw=1;
while(nw<=len)
{
x=(x<<1)+(x<<3)+(ss[nw]-'0');
++nw;
}
a[i]=x;
mp[++mpct]=x;
}
}
sort(mp+1,mp+1+mpct);
mpct=unique(mp+1,mp+1+mpct)-mp-1;
_f(i,1,n)
if(a[i]!=-1)a[i]=lower_bound(mp+1,mp+1+mpct,a[i])-mp,cnt[a[i]]++;
//cnt记录每个值出现次数
int Mx=0;
_f(i,1,n)
{
if(a[i]-1)chu("nan ");
else if(cnt[a[i]]
0)continue;
else
{
_f(j,Mx,a[i]-1)//j是值
{
while(cnt[j])
{
chu("%d ",mp[j]);
cnt[j]--;
}
}
Mx=max(Mx,a[i]);
chu("%d ",mp[a[i]]);cnt[a[i]]--;
}
}
mpct=0;
chu("\n");
}
int main()
{
//freopen("qsort3.in","r",stdin);
//freopen("1.out","w",stdout);
T=re();
while(T--)
{
Deal();
}
return 0;
}
/*
2
7
nan 2 4 nan 1 nan 3
22
1 nan 1 nan 4 nan nan nan nan 5 nan nan nan nan nan 1 nan 4 nan nan nan nan

1 2 3 4
nan 1 2 3 4 nan nan
1 nan 1 nan 1 4 nan nan nan nan 4 5 nan nan nan nan nan nan nan nan nan nan

*/

</details>

T3:【贪心/构造】给出n个数,值域在[1,m]之间,满足2/3m<=n<=m,求把n个数分成sum相同的2组的一组方案。(n<=1e6)

构造,假设n是偶数。(奇数+0)di=a(2i)-a(2i-1)。可以证明sigma(di)<=m-n/2<n
(1)第一个<=:把di理解成在数轴上的2个a之间的(]的距离,那么]有n/2个也即是]的数量是实际存在的1,空格也会占值,一共有m个格子可以被占领,那么距离可以分的只有<=m-n/2的份数
(2)第二个<:tip1:由(1)推出,直接提过去
尝试构造出sigma(diei)=0
ei=-1/1
在sigma(di)<=2
n(1<=i<=n),和值是偶数前提下一定有解。(偶数是原题目保证,减去不会改变奇偶性)
n=1,sigma=0;
di=1
一定可以。
对于di>1,挑出Maxdi,和Mindi,Maxdi-Mindi代替2个值放进去。delta>=2MIndi
2
n-2=2*(n-1)子问题。n-1规模求解。
from sandom

点击查看代码


#define sandom signed
#define fre(x, y) freopen(#x ".in", "r", stdin), freopen(#y ".out", "w", stdout);
#include <bits/stdc++.h>
#define re register int
using namespace std; int wrt[20], TP;
const int Z = 5e6 + 10;
inline int read() { int x = 0, f = 0; char c = getchar(); while (!isdigit(c)) f = c == '-', c = getchar(); while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48), c = getchar(); return f ? -x : x; }
inline void write(int x) { TP = 0; if (x < 0) putchar('-'), x = -x; while (x >= 10) wrt[++TP] = x % 10, x /= 10; wrt[++TP] = x; while (TP) putchar(wrt[TP--] | 48); putchar(' '); }

int n, m, k, ans;
int a[Z], c[Z], p[Z];
struct moj
{
    int id, val;
    pair <int, int> frm;
    friend bool operator <(moj A, moj B) { return A.val < B.val; }
}; moj nod[Z];
multiset <moj> s;
void solve(int n)
{
    if (n == 1) return;//边界条件,此时和一定为0
    auto t1 = s.begin(), t2 = --s.end();
    moj Min = *t1, Max = *t2;//把最大值与最小值做差
    s.erase(t1), s.erase(t2);
    nod[m] = {m, Max.val - Min.val, make_pair(Max.id, Min.id)};
    s.insert(nod[m++]);//新条件
    solve(n - 1);//继续递归
}
void dfs(int rt, int num)
{
    if (nod[rt].frm.first <= n)//到底了,给出答案
    {
        c[nod[rt].frm.first] = num ? -1 : 1;
        c[nod[rt].frm.second] = num ? 1 : -1;
        return;
    }
    dfs(nod[rt].frm.first, num);
    dfs(nod[rt].frm.second, num ^ 1);//因为做了减法,需要取反
}

sandom main()
{
    n = read(), m = read() + 1;
    for (re i = 1; i <= n; i++) a[i] = read();
    if (n & 1) a[++n] = 0;
    for (re i = 1; i <= n; i++) p[a[i]] = i;
    sort(a + 1, a + 1 + n);
    for (re i = 2; i <= n; i += 2)
    {
        nod[m] = {m, a[i] - a[i - 1], make_pair(p[a[i]], p[a[i - 1]])};
        s.insert(nod[m++]);
    }
    solve(n / 2); dfs(m - 1, 0);
    puts("NP-Hard solved");
    if (a[1] == 0) for (re i = 1; i < n; i++) write(c[i]);
    else for (re i = 1; i <= n; i++) write(c[i]);
    return 0;
}

或者贪心,每次拿出最大的,如果<goal,goal减去。
多尝试几次,从不同起点开始。(大的先放,小的凑)

点击查看代码

<details>
<summary>点击查看代码</summary>

include<bits/stdc++.h>

using namespace std;

define _f(i,a,b) for(register int i=a;i<=b;++i)

define f_(i,a,b) for(register int i=a;i>=b;--i)

define chu printf

define ll long long

define rint register int

define ull unsigned long long

inline ll re()
{
ll x=0,h=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch'-')h=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*h;
}
const int N=1e6+100;//证明了一定有解
int n,m,c[N];
struct Node
{
int val,id;
bool operator<(const Node&U)const
{
return val>U.val;//按照值排序
}
}e[N];
int main()
{
//freopen("chaoticevil2.in","r",stdin);
// freopen("1.out","w",stdout);
// chu("dfs\n");
n=re(),m=re();
// chu("n:%d m:%d\n",n,m);
_f(i,1,n)
e[i].val=re(),e[i].id=i;
// chu("caonima\n");
sort(e+1,e+1+n);
// chu("out\n");
ll sum=0;
_f(i,1,n)sum+=e[i].val;
ll hf=sum>>1;
_f(i,1,n)
{
if(e[i].val<=hf)
{
hf-=e[i].val;
c[e[i].id]=1;
}
else c[e[i].id]=-1;
}
// chu("out?\n");
if(hf
0)
{
chu("NP-Hard solved\n");
_f(i,1,n)chu("%d ",c[i]);
return 0;
}
_f(lg,2,5)
{
hf=sum>>1;
_f(i,lg,n+lg-1)
{
int ps=i%n;
if(ps==0)ps=n;
if(e[ps].val<=hf)
{
hf-=e[ps].val;
c[e[ps].id]=1;
}
else c[e[ps].id]=-1;
}
if(!hf)
{
chu("NP-Hard solved\n");
_f(i,1,n)chu("%d ",c[i]);
return 0;
}
}
//chu("fail\n");
return 0;
}
/*
6 8
1 6 2 5 4 8
*/

</details>

T4:给你一个满二叉树,叶子的值向上构成伪线段树(可能很不均匀),支持区间加值,区间查询和值。(n,m<=2e5)

发现神奇的性质,如果你要查询的区间是[L,R]那么-->(L-1,R+1),从L-1和R+1的lca为分割线,lson、rson向上跳,对于lson,经过lson加上rson的贡献,对于rson,经过rson加上lson贡献,如果没有直接跳,那么刚好就是要找的值!
树连剖分维护连续一条链的rson的对应兄弟的sum值,线段树区间修改区间查询。

点击查看代码




#include<bits/stdc++.h>
using namespace std;
#define _f(i,a,b) for(register int i=a;i<=b;++i)
#define f_(i,a,b) for(register int i=a;i>=b;--i)
#define chu printf
#define ll long long
#define rint register int
#define ull unsigned long long
inline ll re()
{
    ll x=0,h=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')h=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0')
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*h;
}
const int N=4e5+100;
struct Segment_Tree
{
    #define lson (rt<<1)
    #define rson (rt<<1|1)
    ll sum[N<<2];int siz[N<<2]; ll tag[N<<2];
    int V[N];
    inline void change(int rt,ll vl)
    {
        tag[rt]+=vl;
        sum[rt]+=siz[rt]*vl;
    }
    inline void pushup(int rt)
    {
        sum[rt]=sum[lson]+sum[rson];
        siz[rt]=siz[lson]+siz[rson];
    }
    inline void pushdown(int rt)
    {
        if(!tag[rt])return;
        change(lson,tag[rt]);
        change(rson,tag[rt]);
        tag[rt]=0;
    }
    inline void build(int rt,int l,int r)
    {
        if(l==r){siz[rt]=V[l];sum[rt]=0;return;}//没有sum吧?还没操作呢
        int mid=(l+r)>>1;
        build(lson,l,mid);build(rson,mid+1,r);
        pushup(rt);
    }
    inline ll query(int rt,int l,int r,int L,int R)
    {
        if(L<=l&&r<=R)
        return sum[rt];
        int mid=(l+r)>>1;
        pushdown(rt);
        ll nas=0;
        if(L<=mid)nas+=query(lson,l,mid,L,R);
        if(R>mid)nas+=query(rson,mid+1,r,L,R);
        return nas;
    }
    inline void insert(int rt,int l,int r,int L,int R,ll er)
    {
        if(L<=l&&r<=R)
        {change(rt,er);return;}
        int mid=(l+r)>>1;
        pushdown(rt);
        if(L<=mid)insert(lson,l,mid,L,R,er);
        if(R>mid)insert(rson,mid+1,r,L,R,er);
        pushup(rt);
    }
}lef,rig;
int siz[N],son[N],ls[N],rs[N],dep[N],dfn[N],tim,top[N],vis[N],fa[N];
int n,m,root;
inline void dfs(int x,int f)
{
    fa[x]=f;
    if(!ls[x]&&!rs[x])
    {
        siz[x]=1;dep[x]=dep[f]+1;return;
    }
    dep[x]=dep[f]+1;
    if(ls[x])dfs(ls[x],x),siz[x]+=siz[ls[x]];
    if(rs[x])dfs(rs[x],x),siz[x]+=siz[rs[x]];
    if(siz[ls[x]]>siz[rs[x]])son[x]=ls[x];
    else son[x]=rs[x];
}
inline void slpf(int x,int belong)
{
    dfn[x]=++tim;
    top[x]=belong;
    if(!son[x])return;
    slpf(son[x],belong);

    if(son[x]==ls[x])
    slpf(rs[x],rs[x]);
    else 
    slpf(ls[x],ls[x]);
    lef.V[dfn[ls[x]]]=siz[rs[x]];
    rig.V[dfn[rs[x]]]=siz[ls[x]];
}
inline void Motify(int l,int r,ll ker)
{
    l--,r++;
    if(l==0)l=2*n;
    if(r==n+1)r=2*n+2;
    int lastl=l,lastr=r;
    while(top[l]!=top[r])
    {
        if(dep[top[l]]>dep[top[r]])//跳左
        {
            lef.insert(1,1,tim,dfn[top[l]],dfn[l],ker);
            lastl=top[l];
            l=fa[top[l]];
        }
        else
        {
            rig.insert(1,1,tim,dfn[top[r]],dfn[r],ker);
            lastr=top[r];
            r=fa[top[r]];
        }
    }
    if(dep[l]>dep[r])
    {
        rig.insert(1,1,tim,dfn[lastr],dfn[lastr],-ker);
        lef.insert(1,1,tim,dfn[r]+2,dfn[l],ker);
    }
    else
    {
        lef.insert(1,1,tim,dfn[lastl],dfn[lastl],-ker);
        rig.insert(1,1,tim,dfn[l]+2,dfn[r],ker);
    } 
}
inline ll Query(int l,int r)
{
    l--,r++;
    if(l==0)l=2*n;
    if(r==n+1)r=2*n+2;
    int lastl=l,lastr=r;
    ll ans=0;
    while(top[l]!=top[r])
    {
        if(dep[top[l]]>dep[top[r]])//跳左
        {
            ans+=lef.query(1,1,tim,dfn[top[l]],dfn[l]);
            lastl=top[l];
            l=fa[top[l]];
        }
        else
        {
            ans+=rig.query(1,1,tim,dfn[top[r]],dfn[r]);
            lastr=top[r];
            r=fa[top[r]];
        }
    }
    if(dep[l]>dep[r])
    {
        ans-=rig.query(1,1,tim,dfn[lastr],dfn[lastr]);
        ans+=lef.query(1,1,tim,dfn[r]+2,dfn[l]);
    }
    else
    {
        ans-=lef.query(1,1,tim,dfn[lastl],dfn[lastl]);
        ans+=rig.query(1,1,tim,dfn[l]+2,dfn[r]);
    } 
    return ans;
}
int main()
{
 // freopen("pigeons4.in","r",stdin);
  //freopen("1.out","w",stdout);
  n=re(),m=re();
  _f(i,n+1,2*n-1)
  {
      ls[i]=re(),rs[i]=re();
      vis[ls[i]]=vis[rs[i]]=1;
  }
    _f(i,n+1,2*n-1)
    if(!vis[i]){root=i;break;}
  //  chu("root:%d\n",root);
    ls[2*n+3]=2*n+1;
    rs[2*n+3]=2*n+2;
    ls[2*n+1]=2*n;
    rs[2*n+1]=root;
    root=2*n+3;
    //chu("yes\n");//return 0;
    dfs(root,0);
  // chu("yes\n");
    slpf(root,root);
  //  chu("yes\n");
  //   _f(i,1,2*n-1)chu("top[%d]:%d\n",i,top[i]);
    lef.build(1,1,tim);
    rig.build(1,1,tim);
  //  chu("yes\n");
    _f(i,1,m)
    {
        int x=re(),l=re(),r=re();
        if(x==1)
        {
            int vl=re();
            Motify(l,r,vl);
        }
        else
        {
            chu("%lld\n",Query(l,r));
        }
    }
    return 0;
}
/*
5 6
4 5
3 6
1 2
8 7
1 1 5 1
2 2 3
2 1 5
1 2 5 3
2 2 4
2 3 5

0
5
3
9
*/
posted on   HZOI-曹蓉  阅读(118)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示