2019.10.13 星期日
今天效率还行,自己早上8点多起来,10点学到下午三点,比完厨艺大赛又4点,继续到现在。今天ac了一道题,线段树,自己本来要打的codeforces,然而发现并没有时间去打了,那个时候我在考试,下一周吧,div2不急嘛。
最近明显感觉力不从心了,简单题刷完了,自己现在正在向最硬核的内容发起攻击,坚持住。不过自己还是想早一点放假啊,自己现在就剩这么一个念头了,其他根本提不起兴趣,再接再厉吧咱,一口气把事情干完,感恩节回来开心地玩不好么?我这个人一累就喜欢买吃的,就算不吃,自己看着也非常开心,宿舍里现在各类饮料和小食品堆积成山,估计我的哈密瓜味维他豆奶到散学典礼前是喝不完了5555,加油吧小田!对了,控制体重啊,别一吃起来就没完,到北京回去再吃,好吧? 我不想假期减肥啊。
今天这个线段树和二分,讲真,这么长时间脑子愚钝了,真没往二分上去想,后来看到区间有序,才开始考虑是不是,真的不应该啊,好吧就到这里了,我回去了。
题目: HDU4614 Vases and Flowers(传送门)
代码:
#include <bits/stdc++.h>
using namespace std;
#define limit 1000000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
typedef long long ll;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快读
struct Node{
int L, R, inc, sum;
int mid(){
return L + (R - L) / 2;
}
}tree[limit];
void pushdown(int root){
if(tree[root].inc != -1) {
tree[root * 2 + 1].inc = tree[root].inc;
tree[root * 2 + 2].inc = tree[root].inc;
tree[root * 2 + 1].sum = (tree[root * 2 + 1].R - tree[root * 2 + 1].L + 1) * tree[root * 2 + 1].inc;
tree[root * 2 + 2].sum = (tree[root * 2 + 2].R - tree[root * 2 + 2].L + 1) * tree[root * 2 + 2].inc;
tree[root].inc = -1;//主要是为了兼容正数增量和负数增量
}
}
void build(int root ,int L, int R){
tree[root].L = L;
tree[root].R = R;
tree[root].inc = -1;
tree[root].sum = R - L + 1;//区间空花瓶
int mid = tree[root].mid();
if(L != R){
build(root * 2 + 1, L ,mid);
build(root * 2 + 2, mid + 1, R);
}
}
void update(int root ,int vs ,int ve ,int val){
if(tree[root].L == vs && tree[root].R == ve){
tree[root].inc = val;
tree[root].sum = (ve - vs + 1) * val;
return;//结束,向上归回去
}
int mid = tree[root].mid();
pushdown(root);
if(ve <= mid){
update(root * 2 + 1, vs ,ve ,val);//递归更新
}else if(vs > mid){
update(root * 2 + 2, vs ,ve ,val);
}else{
update(root * 2 + 1, vs ,mid ,val);
update(root * 2 + 2, mid + 1, ve , val);
}
tree[root].sum = tree[root * 2 + 1].sum + tree[root * 2 + 2].sum;
}
int query(int root ,int vs, int ve){
if(tree[root].L == vs && tree[root].R == ve){
return tree[root].sum;
}
pushdown(root);
int mid = tree[root].mid();
int ans;
if(ve <= mid){
ans = query(root * 2 + 1, vs ,ve);
}else if(vs > mid){
ans = query(root * 2 + 2, vs ,ve);
}else{
ans = query(root * 2 + 1, vs ,mid) + query(root * 2 + 2, mid + 1, ve);
}
tree[root].sum = tree[root * 2 + 1].sum + tree[root * 2 + 2].sum;
return ans;
}
int kase, m;
int n;
int search(int index, int num){
int L = index, R = n - 1;
int pos;
while(L <= R){
int mid = L + (R - L) / 2;
if(query(0 ,index, mid) >= num){
pos = mid, R = mid - 1;
}else{
L = mid + 1;
}
}
return pos;
}
int main(){
const int root = 0;
//freopen("C:\\Users\\administrator01\\CLionProjects\\untitled13\\data.txt", "rt" , stdin);
scanf("%d" , &kase);
while(kase--) {
scanf("%d%d", &n, &m);
build(root, 0, n - 1);
int cmd;
for (int i = 0; i < m; ++i) {
scanf("%d", &cmd);
if (cmd == 1) {
int from, val;
scanf("%d%d", &from, &val);
int res = query(root, from, n - 1);//区间总共还剩下的花瓶
if (res == 0) {
puts("Can not put any one.");
} else {
int first = search(from, 1);
int second = search(from, min(res, val));
printf("%d %d\n", first, second);
update(root, first , second, 0);
}
} else {
//清空花瓶s
int from, to;
scanf("%d%d", &from, &to);
int ans = query(root, from, to);
//printf("The number of empty bottle in %d to %d is %d\n", from, to, ans);
printf("%d\n", (to - from + 1) - ans);
update(root, from, to, 1);
}
}
puts("");
}
return 0;
}