题意:给一个如图坐标系,每个方形都放在下面两个中间,已知一个木块湿了那么他下面所有的都会湿,显然,不能湿两次。问,每次给出一个坐标,把他弄湿,有几个木块从干变成湿了。

思路:我们把坐标系拉直,就变成了如图,显然我们弄湿 a(0,5),那么红色部分变湿,看一眼应该已经找到计算面积的方法了。所以我们每次得到一个坐标,我们就能直接算出面积。然后我们判断,是否已经有顶点所产生的面积包含了我的顶点,是的话我湿的面积为0。没有的话我就遍历一遍所有顶点,删掉所有的已经湿了的面积,剩下的就是新湿的面积了。

然后我们看一下,如果两个面积不相交,那么必有下图这样,我们可以简单的算出,红色最右边的x应该为a.x + a.y,那么不相交的条件为a.x + a.y < b.x。

相含的时候,被包含的那个面积必然是从包含的面积内部一点为顶点,而红色内部所有的点都有一个性质x + y <= a.x + a.y && x >= a.x,所以以此判断包含关系。

然后计算交集:显然交集为蓝色减去它内部小红色的面积。那么我们先判断是否有内含,有的话就是被含的面积;否则我们找出红色小面积的顶点,因为我们知道y的长度就可以算出面积,那么Y = a.x + a.y - b.x。

但是我们直接减去相交面积显然不行,因为可能有很多重复的面积被我减掉了。那怎么办?直接计算每次多减的加回去,多算的面积是两两之间的交集,一直加到最后一块和我相交的(也就是x >= a.x且不内含的第一块)。

代码:

#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 10;
const int M = maxn * 30;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
const int MOD = 1e4 + 7;
struct Tri{
ll x, y;
bool operator < (const Tri a) const{
return x < a.x;
}
};
set<Tri> s;
ll getAera(Tri a){
return (1LL + a.y) * (a.y + 2LL) / 2LL;
}
bool contain(Tri a, Tri b){ //a包含b
return a.x + a.y >= b.x + b.y && a.x <= b.x;
}
ll intersect(Tri a, Tri b){ //a b交集
if(contain(a, b)) return getAera(b);
else if(contain(b, a)) return getAera(a);
else{
ll y = -1;
if(a.x <= b.x) y = max(y, a.x + a.y - b.x);
else y = max(y, b.x + b.y - a.x);
return getAera(Tri{1, y});
}
}
int main(){
int n;
scanf("%d", &n);
s.clear();
while(n--){
Tri a;
scanf("%lld%lld", &a.x, &a.y);
auto it = s.upper_bound(a);
if(it != s.begin()) it--; //第一个x小于等于a.x的位置
if(s.begin() != s.end() && contain(*it, a)){ //a被包含
printf("0\n");
continue;
}
ll ret = getAera(a);
for(auto i = it; i != s.end();){
ret -= intersect(a, *i);
if(!contain(a, *i) && (*i).x >= a.x) break;
auto pre = i++;
if(i == s.end()) break;
ret += intersect(*i, *pre);
}
for(auto i = it; i != s.end();){
if(contain(a, *i)) s.erase(i++);
else i++;
}
s.insert(a);
printf("%lld\n", ret);
}
return 0;
}

Gym 100796B Wet Boxes(思维)题解的更多相关文章

  1. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

  2. Gym 101128A Promotions(思维 + dfs)题解

    题意:给一有向图,如果A指向B,则A是B的上级.一直i要升职那么他的上级必须都升职.现在给你一个升职人数的区间[a, b],问你升职a人时几个人必被升职,b时几个人必升职,b时几个人没有可能被升职. ...

  3. Gym 102028C - Supreme Command - [思维题][2018-2019 ACM-ICPC Asia Jiaozuo Regional Contest Problem C]

    题目链接:https://codeforces.com/gym/102028/problem/C Lewis likes playing chess. Now he has n rooks on th ...

  4. Gym 101775C - Traffic Light - [思维题]

    题目链接:http://codeforces.com/gym/101775/problem/C 题意: 给出 $N$ 个红绿灯,又给出 $N+1$ 个距离 $S_i = S_0,S_1, \cdots ...

  5. C. Okabe and Boxes 思维 模拟 or 线段树

    C. Okabe and Boxes 这个题目是一个有点思维的模拟,当时没有想到, 思维就是这个栈的排序这里,因为每次直接排序肯定会t的,所以不可以这么写,那怎么表示排序呢? 就是直接把栈清空,如果栈 ...

  6. Gym 100801E Easy Arithmetic (思维题)

    题目:传送门.(需要下载PDF) 题意:给定一个长度不超过1000的字符串表达式,向该表达式中加入'+'或'-',使得表达式的值最大,输出该表达式. 题解:比如300-456就改成300-4+56,遇 ...

  7. A - Arcade Game Gym - 100814A (概率思维题)

    题目链接:https://cn.vjudge.net/contest/285964#problem/A 题目大意:每一次给你你一个数,然后对于每一次操作,可以将当前的数的每一位互换,如果互换后的数小于 ...

  8. G - WiFi Password Gym - 101608G (异或思维题+曲尺)

    题目链接:https://cn.vjudge.net/contest/285962#problem/G 题目大意:给你n和m,n代表有n个数,然后让你找出一个最长的区间,使得这个区间内的所有的数的‘’ ...

  9. L - Looking for Taste Gym - 101991L 二进制枚举/思维

    方法一:因为最多是10的六次方,所以可以直接枚举二进制上的每一位来得到最优结果. AC代码: #include<iostream> #include<stack> #inclu ...

随机推荐

  1. Development desciptor

    概述与作用: 部署描述符是用于描述Web应用程序的元数据,并为Java EE Web应用程序服务器部署和运行Web应用程序提供指令.从传统上来说,所有元数据都来自于部署描述符文件/WEB-INF/we ...

  2. mysqldumpslow基本使用

    参数解释 -s, 是表示按照何种方式排序 c: 访问计数 l: 锁定时间 r: 返回记录 t: 查询时间 al:平均锁定时间 ar:平均返回记录数 at:平均查询时间 -t, 是top n的意思,即为 ...

  3. 开源AwaitableCompletionSource,用于取代TaskCompletionSource

    1 TaskCompletionSource介绍 TaskCompletionSource提供创建未绑定到委托的任务,任务的状态由TaskCompletionSource上的方法显式控制,以支持未来的 ...

  4. proxy_http_version 1.0 | 1.1

    Module ngx_http_proxy_module http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_ver ...

  5. Building a Robust Live Reloader with WebSockets and Go — Brandur Leach https://brandur.org/live-reload

    Building a Robust Live Reloader with WebSockets and Go - Brandur Leach https://brandur.org/live-relo ...

  6. 任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行

    任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行 多线程 - 廖雪峰的官方网站 https://www.liaoxuefeng ...

  7. C段错误等调试

    本文参考 http://stackoverflow.com/questions/2179403/how-do-you-read-a-segfault-kernel-log-message和http:/ ...

  8. POJ2029 二维线段树

    Get Many Persimmon Trees POJ - 2029 Seiji Hayashi had been a professor of the Nisshinkan Samurai Sch ...

  9. 七:SpringBoot-集成Redis数据库,实现缓存管理

    SpringBoot-集成Redis数据库,实现缓存管理 1.SpringBoot集成Redis 1.1 核心依赖 1.2 配置文件 1.3 简单测试案例 1.4 自定义序列化配置 1.5 序列化测试 ...

  10. Javascript 基础知识整理

    Javascript的作用 表单验证,减轻服务器压力 添加页面动画效果 动态更改页面内容 Ajax网络请求(异步加载数据) -它属于前端的核心,主要用来控制和重新调整DOM,通过修改DOM结构,从而达 ...