首页 > 其他分享 >Codeforces Round 921 (Div. 2) 赛后总结

Codeforces Round 921 (Div. 2) 赛后总结

时间:2024-01-28 14:11:56浏览次数:21  
标签:va sum Codeforces long ne 921 300005 Round he

  • 搜索替换int->long long 是一个好习惯
  • 赛后5分钟就改对E题了,好可惜。不过1个小时都没能做出来,也说明自己不太熟练吧
  • 线段树善于维护满足区间可加性的一类信息,这与本题中的代价和相契合。特殊之处在于其修改方式。
  • 每个区间会在线段树上被划分为\(O(log_{2}n)\)个小区间
  • 即使是最朴素的区间修改,也不是逐一更新每个节点的信息的
  • 于是我们考虑对线段树的每个区间额外记录它左侧和右侧两个港口的编号,这样就可以计算出这段区间的代价和
  • 利用链表容易执行“删除”操作的特性,倒序处理
  • 有延迟标记才需要下传
点击查看代码
#include <bits/stdc++.h>
using namespace std;
long long x[300005];
long long v[300005],he[300005],ne[300005],ans[300005],L[300005],R[300005];
long long read1()
{
	char cc=getchar();
	while(!(cc>=48&&cc<=57))
	{
		if(cc=='-')
		{
			break;
		}
		cc=getchar();
	}
	bool f=false;
	int s=0;
	if(cc=='-')
	{
		f=true;
	}
	else
	{
		s=cc-48;
	}
	while(1)
	{
		cc=getchar();
		if(cc>=48&&cc<=57)
		{
			s=s*10+cc-48;
		}
		else
		{
			break;
		}
	}
	if(f==true)
	{
		s=-s;
	}
	return s;
}
struct t1
{
	int u,v,l,r;
	long long sum;
	int tu,tv;
}t[1200005];
struct q1
{
	long long id,u,v;
}q[300005];
long long S(long long x,long long l)
{
	return (x+x+l-1)*l/2;
}
void spread(long long p)
{
	if(t[p].l!=t[p].r)
	{
		if(t[p].tu!=0)
		{
			t[p*2].tu=t[p*2+1].tu=t[p].tu;
			t[p*2].u=t[p*2].tu;
			t[p*2+1].u=t[p*2+1].tu;
		} 
		if(t[p].tv!=0)
		{
			t[p*2].tv=t[p*2+1].tv=t[p].tv;
			t[p*2].v=t[p*2].tv;
			t[p*2+1].v=t[p*2+1].tv;
		}
		if(t[p*2].u!=0&&t[p*2].v!=0) t[p*2].sum=v[t[p*2].u]*S(t[p*2].v-t[p*2].r,t[p*2].r-t[p*2].l+1);
		if(t[p*2+1].u!=0&&t[p*2+1].v!=0) t[p*2+1].sum=v[t[p*2+1].u]*S(t[p*2+1].v-t[p*2+1].r,t[p*2+1].r-t[p*2+1].l+1);
	}
	t[p].tu=t[p].tv=0;
}
void build(long long p,long long l,long long r)
{
	t[p].l=l;
	t[p].r=r;
	if(l==r)
	{
		t[p].u=L[l];
		t[p].v=R[l];
		t[p].sum=(R[l]-l)*v[t[p].u];
		return;
	}
	long long mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
}
long long ask(long long p,long long l,long long r)
{
	if(l<=t[p].l&&r>=t[p].r)
	{
		return t[p].sum;
	}
	spread(p);
	long long ans=0;
	long long mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)
	{
		ans=ans+ask(p*2,l,r);
	}
	if(r>mid)
	{
		ans=ans+ask(p*2+1,l,r);
	}
	return ans;
}
void changeL(long long p,long long l,long long r,long long va)
{
	spread(p);
	if(l<=t[p].l&&r>=t[p].r)
	{
		t[p].u=va;
		t[p].tu=va;
		if(t[p].u!=0&&t[p].v!=0) t[p].sum=v[t[p].u]*S(t[p].v-t[p].r,t[p].r-t[p].l+1);
		return;
	}
	long long mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)
	{
		changeL(p*2,l,r,va);
	}
	if(r>mid)
	{
		changeL(p*2+1,l,r,va);
	}
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
}
void changeR(long long p,long long l,long long r,long long va)
{
	spread(p);
	if(l<=t[p].l&&r>=t[p].r)
	{
		t[p].v=va;
		t[p].tv=va;
		if(t[p].u!=0&&t[p].v!=0) t[p].sum=v[t[p].u]*S(t[p].v-t[p].r,t[p].r-t[p].l+1);
		return;
	}
	long long mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)
	{
		changeR(p*2,l,r,va);
	}
	if(r>mid)
	{
		changeR(p*2+1,l,r,va);
	}
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
}
void del(long long x)
{
	changeL(1,he[x]+1,ne[x]-1,he[x]);
	changeR(1,he[x]+1,ne[x]-1,ne[x]);
	ne[he[x]]=ne[x];
	he[ne[x]]=he[x];
}
int main()
{
	long long n,m,Q;
	cin>>n>>m>>Q;
	for(long long i=1;i<=m;i++)
	{
		x[i]=read1();
	}
	for(long long i=1;i<=m;i++)
	{
		long long va=read1();
		v[x[i]]=va;
	}
	for(long long i=1;i<=Q;i++)
	{
		q[i].id=read1();
		q[i].u=read1();
		q[i].v=read1();
		if(q[i].id==1)
		{
			v[q[i].u]=q[i].v;
		}
	}
	long long p=1;
	L[1]=1;
	for(long long i=2;i<=n;i++)
	{
		if(v[i]>0)
		{
			he[i]=p;
			p=i;
		}
		L[i]=p;
	}
	p=n;
	R[n]=n;
	for(long long i=n-1;i>=1;i--)
	{
		if(v[i]>0)
		{
			ne[i]=p;
			p=i;
		}
		R[i]=p;
	}
	build(1,1,n);
	for(long long i=Q;i>=1;i--)
	{
		if(q[i].id==1)
		{
			del(q[i].u);
		}
		else
		{
			ans[i]=ask(1,q[i].u,q[i].v);
		}
	}
	for(long long i=1;i<=Q;i++)
	{
		if(q[i].id==2)
		{
			printf("%lld\n",ans[i]);
		}
	}
	return 0;
}
/*
8 3 1
1 3 8
3 24 10
2 2 5
*/

标签:va,sum,Codeforces,long,ne,921,300005,Round,he
From: https://www.cnblogs.com/watersail/p/17992832

相关文章

  • Codeforces Round 921 (Div. 2)
    CodeforcesRound921(Div.2)比赛地址A.WeGotEverythingCovered!思路这个就是一个简单的拼接,这里很容易的发现我们最后最优的方法就是将所要拼写的字母按顺序拼接成n份就好了,但是这里需要主义一下简单的优化Code#include<bits/stdc++.h>usingnamespacestd;#define......
  • CodeForces 1924C Fractal Origami
    洛谷传送门CF传送门对这种题一点办法都没有。。。可以手动折叠发现\(n=3\)时\(M=2+2\sqrt{2},V=2+4\sqrt{2}\)。于是大胆猜结论,第二次折叠开始,每次产生的山谷和山峰的长度相等。为什么呢?考虑从第二次折叠开始,设当前纸的层数为\(k\)(事实上若当前是第\(i\)......
  • CF Round 921 (Div. 2)
    linkA一种可行的方案是将前\(k\)个字母重复\(n\)次,对于每个要找的字符串,从\(n\)段中分别选取一个字符就可以得到。B如果\(x\)是答案的话,它一定满足\(x|n,\frac{x}{n}\leqm\),直接枚举答案,时间复杂度\(O(\sqrtn)\)。C沿着A的思路继续思考,如果能将\(s\)分成至......
  • CodeForces 1924B Space Harbour
    洛谷传送门CF传送门不知道为什么好像大家在这题上花了挺久的。发现对于一对相邻的港口\((x_i,x_{i+1})\),\(x\in(x_i,x_{i+1})\)的花费是\(y_i(x_{i+1}-x)\)。拆开得\(y_ix_{i+1}-y_ix\)。考虑用set维护所有港口,这样可以知道一个港口左边和右边的港......
  • CodeForces 1924D Balanced Subsequences
    洛谷传送门CF传送门发现去掉匹配的\(2k\)个括号后,剩下的串一定形如\())\ldots)((\ldots(\),其中右括号数量为\(a=m-k\),左括号数量为\(b=n-k\)。考虑把剩下的串像\())\ldots)\mid((\ldots(\)一样分成两半。枚举左半边加入了\(\frac{i}{2}\)对匹配,则......
  • hey_left 18 Codeforces Round 920 (Div. 3)
    题目链接A.根据正方形4个角的特性,可以把它们排序处理,得到长和高,相乘得面积#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;boolcmp(pair<int,int>x,pair<int,int>y){if(x.first==y.first)returnx.second<y.second;e......
  • CF1433E Two Round Dances 题解
    题目传送门前置知识圆排列解法\(\dfrac{Q_{n}^{\frac{n}{2}}Q_{\frac{n}{2}}^{\frac{n}{2}}}{A_{2}^{2}}\)即为所求。同时因为\(n\le20\)和没有模数,所以不需要处理逆元,暴力算即可。代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineu......
  • Codeforces Educational Round
    CodeforcesEducationalRoundEducationalCodeforcesRound160(RatedforDiv.2)(A-D)https://www.cnblogs.com/ComistryMo/articles/17920495.htmlEducationalCodeforcesRound161(RatedforDiv.2)(A-E)https://www.cnblogs.com/ComistryMo/articles/17983580......
  • Educational Codeforces Round 65 (Rated for Div. 2)C. News Distribution(模拟,计算的
    这道题目明显和出现4次的数和出现2次的数的个数有关系,只需要在每次更新之后维护这两个信息即可,我们在算出现2次的数的个数时其实会把出现4次的数的个数会把出现2次的数的个数+2,在判断时需要考虑这一点。也就是\(cnt2>=4\&\&cnt4>=1\)时才有解#include<bits/stdc++.h>#definer......
  • CodeForces 995F Cowmpany Cowmpensation
    洛谷传送门CF传送门考虑一个显然的树形dp,设\(f_{u,i}\)为\(u\)结点染颜色\(i\)的方案数,有\(f_{u,i}=\prod\limits_{v\inson_u}\sum\limits_{j=1}^if_{v,j}\)。前缀和后可得\(f_{u,i}=f_{u,i-1}+\prod\limits_{v\inson_u}f_{v,i}\)。发现\(f_......