Physical Education Lessons Codeforces - 915E

http://codeforces.com/problemset/problem/915/E

大概有几种思路:

1.动态开点线段树+标记下传

#1.1标记永久化:想了一会没想出来

1.2可以先扫一遍询问把所有需要的点建出来,然后pushdown就不管没建出来的点了,空间跟标记永久化一样

2.离散化+线段树

3.用splay维护区间(估计没人愿意去写)

4.用一个set<pair<int,int>>记所有非工作日(或工作日)区间,修改就暴力找到相关的区间去改

由于每一次操作最多多出O(1)个区间,因此尽管有时会一次删掉多个区间,但复杂度是对的

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<set>
 4 #define fi first
 5 #define se second
 6 using namespace std;
 7 typedef pair<int,int> P;
 8 set<P> s;
 9 set<P>::iterator it;
10 int ans,n,q;
11 int main()
12 {
13     int i,idx,l,r;P t;
14     scanf("%d%d",&n,&q);ans=n;s.insert(P(n,1));
15     while(q--)
16     {
17         scanf("%d%d%d",&l,&r,&idx);
18         it=s.lower_bound(P(l,0));
19         if(it!=s.end()&&it->se<=l)
20         {
21             t=*it;s.erase(it);
22             if(l!=t.se)    s.insert(P(l-1,t.se));
23             s.insert(P(t.fi,l));
24         }
25         it=s.lower_bound(P(r,0));
26         if(it!=s.end()&&it->se<=r)
27         {
28             t=*it;s.erase(it);
29             if(t.fi!=r)    s.insert(P(t.fi,r+1));
30             s.insert(P(r,t.se));
31         }
32         for(it=s.lower_bound(P(l,0));it!=s.end()&&it->fi<=r;it=s.lower_bound(P(l,0)))
33             ans-=it->fi-it->se+1,s.erase(it);
34         if(idx==2)    s.insert(P(r,l)),ans+=r-l+1;
35         printf("%d\n",ans);
36     }
37     return 0;
38 }

原文地址:https://www.cnblogs.com/hehe54321/p/9026138.html

时间: 2024-08-03 19:53:10

Physical Education Lessons Codeforces - 915E的相关文章

Physical Education Lessons CodeForces - 915E (动态开点线段树)

Physical Education Lessons CodeForces - 915E This year Alex has finished school, and now he is a first-year student of Berland State University. For him it was a total surprise that even though he studies programming, he still has to attend physical

[Educational Codeforces Round 36]E. Physical Education Lessons

[Educational Codeforces Round 36]E. Physical Education Lessons <题意概括> 给定一个长度为$N\left(1\leqslant N\leqslant10^{9}\right)$的区间 $Q\left(1\leqslant Q\leqslant3\cdot10^{5}\right)$次将区间$\left[L,R\right]$Set为0或1,每次Set后输出区间总和 <做法> $10_{9}$的范围显然不可能是朴素线段树

Codeforces 915 E Physical Education Lessons

题目描述 This year Alex has finished school, and now he is a first-year student of Berland State University. For him it was a total surprise that even though he studies programming, he still has to attend physical education lessons. The end of the term i

Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons(动态开点线段树)

链接: https://codeforces.com/problemset/problem/915/E 题意: This year Alex has finished school, and now he is a first-year student of Berland State University. For him it was a total surprise that even though he studies programming, he still has to atten

【CodeForces】915 E. Physical Education Lessons 线段树

[题目]E. Physical Education Lessons [题意]10^9范围的区间覆盖,至多3*10^5次区间询问. [算法]线段树 [题解]每次询问至多增加两段区间,提前括号分段后线段树. #include<cstdio> #include<cctype> #include<set> #include<algorithm> using namespace std; int read(){ char c;int s=0,t=1; while(!i

CF915E Physical Education Lessons

题意: Alex高中毕业了,他现在是大学新生.虽然他学习编程,但他还是要上体育课,这对他来说完全是一个意外.快要期末了,但是不幸的Alex的体育学分还是零蛋! Alex可不希望被开除,他想知道到期末还有多少天的工作日,这样他就能在这些日子里修体育学分.但是在这里计算工作日可不是件容易的事情: 从现在到学期结束还有 n 天(从 1 到 n 编号),他们一开始都是工作日.接下来学校的工作人员会依次发出 q 个指令,每个指令可以用三个参数 l,r,k 描述: 如果 k=1,那么从 l 到 r (包含端

CF915E Physical Education Lessons|动态开点线段树

动态开点线段树 题目暗示了区间修改,所以我们自然想到了用线段树来维护非工作日的天数. 然而我们再看一下数据范围,天数n的范围是\(1 \le n \le 10^9\),像普通线段树一样预处理显然会爆空间. 天无绝人之路,我们看一下修改个数,$1\le q \le 3 \cdot 10^5 $, 比天数少很多,这也意味着,我们预先处理好的线段树有些节点并没有用 能否优化呢?答案是肯定的,这就是动态开点线段树,顾名思义,我们只要到用某个节点的时候,才分配一个点给它,这样使得我们使用的空间大大减少.其

Codeforces 394D Physical Education and Buns 胡搞

题目链接:点击打开链接 题意:给定n个数的序列(能够排序) 操作一次能够使得某个数++或--. 问最少操作几次使得序列变成一个等差序列 输出: 第一行输出最少操作的次数 第二行输出等差数列里的最小项 和 公差的绝对值. 思路:枚举公差,公差范围一定是0到 2Max. 先排个序. 我们使得首项不变.形成一个等差数列. 然后让整个数列位移至 操作后的数组的差值 最小值 == 0.这样这个数列的操作次数= 最大的差值/2. done. #include <iostream> #include <

URAL 2052 Physical Education(数位dp)

 题意:给出一个自然数数列,按照每个数的所有数位之和作为第一关键字,每个数的大小作为第二关键字升序排序,位置不变的数的个数是多少. 思路:首先可以证明,对于数位和为i的所有数,最多只可能有一个位置不变,这个可以直观的猜想一下,因为如果有一个数字位置不变,那么对于排序后的序列,这个数后面的所有数的增长速度都大于自然数序列的增长速度,所以不可能再有第二个. 假设我们当前求出了数位和为i的区间为[l, r],令query(a, b)表示1到a这段区间内数位和为b的数的个数,用su[i-1]表示数位