您的位置:首页 > 其它

zzulioj-1877 蛤玮打扫教室

2016-06-01 19:25 405 查看
区间覆盖,延迟操作

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#define maxn 100005
#define INF 1e9
typedef long long ll;

using namespace std;
int num[maxn<<2], add[maxn<<2];
int x[maxn], y[maxn];
void Pushdown(int n){

if(add
){
num[n<<1] += add
;
num[n<<1|1] += add
;
add[n<<1|1] += add
;
add[n<<1] += add
;
add
= 0;
}
}
void Update(int n, int l, int r, int L, int R){

if(l == L && R == r){

add
+= 1;
num
+= 1;
return ;
}
Pushdown(n);
int mid = (l + r) >> 1;
if(R <= mid)
Update(n<<1, l, mid, L, R);
else if(L > mid)
Update(n<<1|1, mid+1, r, L, R);
else{
Update(n<<1, l, mid, L, mid);
Update(n<<1|1, mid+1, r, mid+1, R);
}
num
= min(num[n<<1], num[n<<1|1]);
}
void Query(int n, int l, int r, int L, int R, int& s){

if(l == L && R == r){
s = min(s, num
);
return ;
}
Pushdown(n);
int mid = (l + r) >> 1;
if(R <= mid)
Query(n<<1, l, mid, L, R, s);
else if(L > mid)
Query(n<<1|1, mid+1, r, L, R, s);
else{
Query(n<<1, l, mid, L, mid, s);
Query(n<<1|1, mid+1, r, mid+1, R, s);
}
}
int main(){

//  freopen("in.txt", "r", stdin);
int t;

scanf("%d", &t);
while(t--){

vector<int> v;
memset(num, 0, sizeof(num));
memset(add, 0, sizeof(add));
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d%d", x+i, y+i);
Update(1, 1, n, x[i], y[i]);
}
for(int i = 1; i <= m; i++){
int s = 1000000000;
Query(1, 1, n, x[i], y[i], s);
if(s > 1){
v.push_back(i);
}
}
printf("%d\n", v.size());
if(v.size() > 0)
printf("%d", v[0]);
for(int i = 1; i < v.size(); i++)
printf(" %d", v[i]);
if(v.size() > 0)
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: