首页 技术 正文
技术 2022年11月21日
0 收藏 493 点赞 3,359 浏览 3017 个字

提供两种思路
一种线段树区间更新
另一种用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|1int 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|1int 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;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,985
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,501
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,345
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,128
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,763
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,839