首页 > 其他分享 >CF915E Physical Education Lessons

CF915E Physical Education Lessons

时间:2022-10-08 11:44:31浏览次数:33  
标签:Lessons val rs ll ty mid CF915E Education ls

题意

Alex高中毕业了,他现在是大学新生。虽然他学习编程,但他还是要上体育课,这对他来说完全是一个意外。快要期末了,但是不幸的Alex的体育学分还是零蛋!

Alex可不希望被开除,他想知道到期末还有多少天的工作日,这样他就能在这些日子里修体育学分。但是在这里计算工作日可不是件容易的事情:

从现在到学期结束还有 \(n\) 天(从 \(1\) 到 \(n\) 编号),他们一开始都是工作日。接下来学校的工作人员会依次发出 \(q\) 个指令,每个指令可以用三个参数 \(l,r,k\) 描述:

  • 如果 \(k=1\),那么从 \(l\) 到 \(r\) (包含端点)的所有日子都变成工作日。

  • 如果 \(k=2\),那么从 \(l\) 到 \(r\) (包含端点)的所有日子都变成工作日

帮助Alex统计每个指令下发后,剩余的工作日天数。

\(1\le n\le 10^9,\;1\le q\le 3\cdot 10^5\)

Translated by 小粉兔

思路

\(n \le 1e9\),大受震撼。

正解是珂朵莉树,然而为什么不选择会蹦会跳的小动态开点线段树呢?

直接整一个动态开点线段树维护区间赋值就完事了

……吗?

本题中动态开点的空间复杂度大约为 \(O(q\log n)\),如果使用指针的动态开点方式将当场去世。因为一个指针和一个 long long 是等长的。压都压不动。

所以只能屈辱地选择数组式动态开点,搭配各类奇技淫巧卡常。

代码

寄在 #18 MLE 的指针代码。一路走好。

#define mid ((l+r)>>1)
struct node{
	node *ls,*rs;
	ll val;
	bool g;
	node(){
		ls=0,rs=0;
		val=0,g=0;
	}
	void upd(){
		val=ls->val+rs->val;
	}
	void push_down(ll l,ll r){
		ls->g=1;
		ls->val=(val?1:0)*(mid-l+1);
		rs->g=1;
		rs->val=(val?1:0)*(r-mid);
		g=0;
	}
};
node *rt;
void modify(node *x,ll l,ll r,ll ls,ll rs,ll ty){
	if(ls<=l&&r<=rs){
		x->val=ty*(r-l+1);
		x->g=1;
		return ;
	}
	if(!x->ls)x->ls=new node;
	if(!x->rs)x->rs=new node;
	if(x->g)x->push_down(l,r);
	if(ls<=mid)modify(x->ls,l,mid,ls,rs,ty);
	if(rs>mid)modify(x->rs,mid+1,r,ls,rs,ty);
	x->upd();
}
ll n,m;
signed main(){
	scanf("%d%d",&n,&m);
	rt=new node;
	ll l,r,ty;
	while(m--){
		scanf("%d%d%d",&l,&r,&ty);
		ty&=1;
		modify(rt,1,n,l,r,ty);
		printf("%d\n",n-rt->val);
	}
	return 0;
}

AC 代码:

const ll maxn=1.5e7+10;
ll t[maxn],ls[maxn],rs[maxn];
bool g[maxn];
ll tot=1;
ll n,m;
#define mid ((l+r)>>1)
void upd(ll x){
	t[x]=t[ls[x]]+t[rs[x]];
}
void push_down(ll x,ll l,ll r){
	g[ls[x]]=g[rs[x]]=1;
	t[ls[x]]=t[x]?(mid-l+1):0;
	t[rs[x]]=t[x]?(r-mid):0;
	g[x]=0;
}
void modify(ll x,ll l,ll r,ll L,ll R,ll ty){
	if(L<=l&&r<=R){
		t[x]=ty?(r-l+1):0;
		g[x]=1;
		return ;
	}
	if(!ls[x])ls[x]=++tot;
	if(!rs[x])rs[x]=++tot;
	if(g[x])push_down(x,l,r);
	if(L<=mid)modify(ls[x],l,mid,L,R,ty);
	if(R>mid)modify(rs[x],mid+1,r,L,R,ty);
	upd(x);
}
signed main(){
	scanf("%d%d",&n,&m);
	ll l,r,ty;
	while(m--){
		scanf("%d%d%d",&l,&r,&ty);
		ty&=1;
		modify(1,1,n,l,r,ty);
		printf("%d\n",n-t[1]);
	}
	return 0;
}

标签:Lessons,val,rs,ll,ty,mid,CF915E,Education,ls
From: https://www.cnblogs.com/rnfmabj/p/cf915e.html

相关文章

  • Educational Codeforces Round 100 (Rated for Div. 2) B. Find The Array(思维)
    https://codeforces.com/contest/1463/problem/B题目大意:给定n个数字的数组a,让我们凑出数组b;满足b[i]要么可以整除b[i+1],要么可以被b[i+1]整除,同时2*求和abs(a[i]-b[......
  • Educational Round 30 题解
    ContestLink虽然是unrated,不过秉持着EducationalRound的传统,题还是挺不错的。A.ChoresProblemLink评价:善用STL。由于\(a\)已经排好序了,且\(x\le\min_{i=1......
  • Educational Codeforces Round 32 G Xor tree Boruvka算法
    求一个n个点的完全图每条边的权值为两点之间的异或值求最小生成树。在完全图上做最小生成树一般都是Boruvka算法即每次每个点都找一个离自己最近的点合并这样最多合并lo......
  • Codeforces Educational Codeforces Round 136 C D
    C一开始没有读懂题意,以为是轮流游戏,看别人翻译才发现先手在下一轮会变为反手,导致搞了半天过不了样例。可以知道如果\(n\)这张牌在Alice手中,则Alice先手打出这张牌必胜。......
  • Educational Codeforces Round 136 C. Card Game
    题意:有1-n的一个排列,其中n是偶数,A和B两个人拿这副牌玩游戏,两个人绝顶聪明。A拿一半牌,B拿一半牌。规则很简单,A先手出牌,如果B有比他大的牌,那出一张比他大的牌,这一轮结束,下一......
  • Educational Codeforces Round 136 (Rated for Div. 2) E. Cleaning Robot
    EducationalCodeforcesRound136(RatedforDiv.2) E.CleaningRobotProblem-E-Codeforces题意:有一个二行n列的网格,有一些网格是脏的,扫地机器人起点在(1,1)......
  • Educational Codeforces Round 136 C-D
    D.ResetKEdges显然对于每个k每个答案具有单调性我们考虑二分一个能保留的最大长度x然后我们自上至下肯定不好操作我们考虑自下而上对于每次到达了我们最大长度x......
  • Educational Codeforces Round 135 (Rated for Div. 2) - E. Red-Black Pepper
    exgcdProblem-E-Codeforces题意给\(n\;(n<=3*10^5)\)个菜,每个菜可以加红辣椒或黑辣椒,分别可以获得\(c[i],d[i]\)分;有\(m\;(m<=3*10^5)\)个商店,第i个商店包......
  • Educational Codeforces Round 119 E
    E.ReplacetheNumbers开始想到了一个二分的做法好像是O(nlog)的后来才想了一下可以在两个数组之间反复横跳那我是不是像记忆化搜索一样记录一个路径即可我们记录f[i]......
  • Educational Codeforces Round 40 (Rated for Div. 2) 补题
    E.WaterTaps题意:每个水龙头有一个流量限制\(a_i\),温度\(t_i\),现在让你控制每个水龙头的出水量\(x_i\),使得最终的水温为\(T\),水温的公式为$\frac{\sum\limits_{i=1}^{......