提供两种思路
一种线段树区间更新
另一种用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. 洛谷 [P2764]最小路径覆盖问题

    二分图应用模版 #include <iostream> #include <cstdio> #include <algorithm> #include <cs ...

  2. BZOJ 3684: 大朋友和多叉树 [拉格朗日反演 多项式k次幂 生成函数]

    3684: 大朋友和多叉树 题意: 求有n个叶子结点,非叶节点的孩子数量\(\in S, a \notin S\)的有根树个数,无标号,孩子有序. 鏼鏼鏼! 树的OGF:\(T(x) = \sum_{ ...

  3. POJ1269 Intersecting Lines[线段相交 交点]

    Intersecting Lines Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15145   Accepted: 66 ...

  4. mysql 5.7 支持json格式

    1.JSON格式的支持:mysql> create table user ( uid int auto_increment,      -> data json,primary key(u ...

  5. 安装gitlab8.0在reconfigure报错

    现象: https://gitlab.com/gitlab-org/omnibus-gitlab/issues/303 参考方法: https://forum.gitlab.com/t/gitlab- ...

  6. PHP两个日期之间的所有日期

    我想得到两个日期之间的所有日期, 例如:输入两个日期,把这两个日期之间的所有日期取出来     如果是:2005-02-01至2005-02-05(同为一个月)     则为:2005-02-01,2 ...

  7. 低版本IE内核浏览器兼容placeholder属性解决办法

    最简便的一个方法,通过js实现. <input type="text" name="username" id="username" v ...

  8. Taurus.MVC 2.2.3.4 :WebAPI 实现权限控制认证(及功能增强说明)

    前言: 前两天,当我还在老家收拾行旅,准备回广州,为IT连的创业再战365天时, 有网友扣上问:Taurus.MVC中如何实现认证和权限控制,最好能做个小例子. 我一不小心回了句:等回广州我再写篇文章 ...

  9. [原创]CentOS7安装远程工具teamviewer12

    系统环境:CentOS 7.0.1 1.下载安装# wget https://dl.tvcdn.de/download/version_12x/teamviewer_12.0.85001.i686.r ...

  10. Shell脚本的基本流程控制

    if else read -p '请输入分数:' score if [ $score -lt 60 ]; then echo '60分以下' elif  [ $score -lt 70 ]; then ...