提供两种思路
一种线段树区间更新
另一种用map维护连续的区间,也是题解的思路
第二种很难写(我太渣,看了别人的代码,发现自己写的太烦了)

#include<iostream>
#include<map>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 6e5+5;
#define MS(x,y) memset(x,y,sizeof(x))
#define MP(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1 int main() {
int n, q;
while(~scanf("%d %d", &n, &q)) {
map<int, int> mp;
mp[-1] = -1;
mp[1] = n;
mp[n+1] = INF; int ans = n;
while(q --) {
int l, r, k; scanf("%d %d %d", &l, &r, &k);
int tt = r;
if(k == 2 && r != n) tt = r+1; auto it = mp.upper_bound(l);
auto it2 = mp.upper_bound(tt);
it --; it2 --; int head1 = it -> first; int len1 = it -> second;
int head2 = it2 -> first; int len2 = it2 -> second; while(1){
int flag = 0;
if(it == it2) flag = 1;
ans -= it->second;
auto tmp = it;
// if(it->first == n+1) while(1);
it ++;
// printf("erase: %d\n", tmp->first);
mp.erase(tmp);
if(flag) break;
}
//for(auto i = mp.begin(); i != mp.end(); ++i) printf("%d:%d ", i->first, i->second); printf("\n");
// printf("%d %d %d %d %d %d\n", head1, len1, head2, len2, l, r); if(k == 1) {
if(head1 + len1 - 1 >= l && l!=head1) {
mp[head1] = l - head1;
ans += l - head1;
} else if(l != head1){
mp[head1] = len1;
ans += len1;
} if(head2 + len2 - 1 > r) {
mp[r+1] = head2 + len2 - 1 - r;
ans += head2 + len2 - 1 - r;
}
} else {
int L = l; int R = max(r, head2 + len2 -1);
if(head1 + len1 < l) {
mp[head1] = len1;
ans += len1;
}else L = head1; mp[L] = R-L+1;
ans += R-L+1;
} // for(auto i = mp.begin(); i != mp.end(); ++i) printf("%d:%d ", i->first, i->second); printf("\n"); printf("%d\n", ans);
}
}
return 0;
}
#include<iostream>
#include<map>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 6e5+5;
#define MS(x,y) memset(x,y,sizeof(x))
#define MP(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1 int Q[N][3];
int has[N * 2]; int cnt; int sum[N << 2];
int lazy[N << 2]; void build(int l, int r, int rt) {
lazy[rt] = 0;
sum[rt] = has[r] - has[l-1];
if(l == r) {
return;
}
int m = (l + r) >> 1;
build(lson); build(rson);
}
void update(int ty, int L, int R, int l, int r, int rt) {
//printf("%d %d\n", l, r);
if(L <= has[l-1]+1 && has[r] <= R) {
lazy[rt] = ty == 1? -1 : 1;
sum[rt] = ty == 1? 0 : has[r] - has[l-1];
return;
} int m = (l + r) >> 1; if(lazy[rt] == 1) {
lazy[rt<<1] = 1; sum[rt<<1] = has[m] - has[l-1];
lazy[rt<<1|1] = 1; sum[rt<<1|1] = has[r] - has[m];
lazy[rt] = 0;
} else if(lazy[rt] == -1){
lazy[rt<<1] = -1; sum[rt<<1] = 0;
lazy[rt<<1|1] = -1; sum[rt<<1|1] = 0;
lazy[rt] = 0;
} if(L <= has[m-1]+1) update(ty, L, R, lson);
if(R > has[m]) update(ty, L, R, rson);
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void debug(int l, int r, int rt) {
printf("%d %d %d\n", l, r, sum[rt]);
if(l == r) return;
int m = (l + r) >> 1;
debug(lson);
debug(rson);
}
int main() {
int n;
while(~scanf("%d", &n)) {
cnt = 0; int q; scanf("%d", &q);
for(int i = 0; i < q; ++i) {
scanf("%d %d %d", &Q[i][0], &Q[i][1], &Q[i][2]);
has[cnt ++] = Q[i][0] - 1;
has[cnt ++] = Q[i][1];
}
has[cnt ++] = 0;
has[cnt ++] = n; sort(has, has+cnt);
cnt = unique(has, has + cnt) - has;
// for(int i = 0; i < cnt; ++i) printf("%d ", has[i]); printf("\n"); build(1, cnt-1, 1);
//` debug(1, cnt-1, 1);
for(int i = 0; i < q; ++i) {
update(Q[i][2], Q[i][0], Q[i][1], 1, cnt-1, 1);
printf("%d\n", sum[1]);
// debug(1, cnt-1, 1);
} }
return 0;
}

Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons的更多相关文章

  1. Educational Codeforces Round 36 (Rated for Div. 2)

    A. Garden time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  2. Educational Codeforces Round 36 (Rated for Div. 2) G. Coprime Arrays

    求a_i 在 [1,k]范围内,gcd(a_1,a_2...,a_n) = 1的a的数组个数. F(x)表示gcd(a_1,a_2,...,a_n) = i的a的个数 f(x)表示gcd(a_1,a_ ...

  3. Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题

    Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题 [Problem Description] ​ 总共两次询 ...

  4. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  5. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  6. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  7. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

  8. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  9. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...

随机推荐

  1. UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库

    在应用中使用 SQLite 数据库来存储数据是相当常见的.在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLit ...

  2. 怎么理解np.random.seed()?

    在使用numpy时,难免会用到随机数生成器.我一直对np.random.seed(),随机数种子搞不懂.很多博客也就粗略的说,利用随机数种子,每次生成的随机数相同. 我有两个疑惑:1, 利用随机数种子 ...

  3. 使用echarts水球图

    使用echarts水球图 官方实例中没有水球图样式,当我们需要用到水球图的时候需要下载echarts-liquidfill.js. 使用 在echarts之后引入 echarts-liquidfill ...

  4. Python自动化--语言基础8--接口请求及封装

    基于http协议,最常用的是GET和POST两种方法. 接口文档需要包含哪些信息: 接口名称接口功能接口地址支持格式 json/xml请求方式请求示例请求参数(是否必填.数据类型.传递参数格式)返回参 ...

  5. python并发编程之多进程(一):进程开启方式&多进程

    一,进程的开启方式 利用模块开启进程 from multiprocessing import Process import time,random import os def piao(name): ...

  6. MyISAM 和InnoDB 讲解

    1.InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定. 2.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持. ...

  7. Java经典编程题50道之三十

    有一个已经排好序的数组.现输入一个数,要求按原来的规律将它插入数组中. public class Example30 {    public static void main(String[] arg ...

  8. dubbox系列【三】——简单的dubbox提供者+消费者示例

    1.dubbox-provider示例 在eclipse中建立maven project,名为provider-parent,包含两个maven medule:provider-api 和 provi ...

  9. Python接口自动化测试 HTTP协议

    一.HTTP协议简述 二.URL 三.请求 四.响应 五.消息报头 六.常见问题

  10. Linux shell的问题

    1.uptime命令可以查看当前系统的启动时间: w命令显示当前登录者top命令显示当前任务ps命令显示所有进程信息 uptime命令可以查看系统启动时间   2.使用shell时,默认的环境变量放在 ...