http://acm.hdu.edu.cn/showproblem.php?pid=5283

今天的互测题,又爆零了qwq

考虑每个点对答案的贡献。

对每个点能产生贡献的时间线上的左右端点整体二分。

最后扫一遍即可,\(O(n\log^2n)\)。

拍了好长时间,结果暴力标算都写错了,我不滚粗谁滚粗?

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 100003; struct node {int op, l, r, d;} Q[N];
struct data {int x, y, lx, rx, ly, ry;} P[N];
int n, x1, y1, x2, y2, m, bits[N]; struct gagaga {int id, rest, ans;} B[N], A[N]; void add(int x, int num) {
for (; x <= n; x += (x & (-x)))
bits[x] += num;
} int query(int x) {
int ret = 0; if (x < 0) return 0;
for (; x; x -= (x & (-x)))
ret += bits[x];
return ret;
} void solve(int l, int r, int L, int R, int flag) {
if (L > R) return;
if (l == r) {
for (int i = L; i <= R; ++i)
B[i].ans = l;
return;
}
int mid = (l + r) >> 1;
for (int i = l; i <= mid; ++i)
if (Q[i].op == flag) {
add(Q[i].l, Q[i].d);
add(Q[i].r + 1, -Q[i].d);
} int tmp1 = L, tmp2 = R, t;
for (int i = L; i <= R; ++i)
if ((t = query(B[i].id)) >= B[i].rest)
A[tmp1++] = B[i];
else {
B[i].rest -= t;
A[tmp2--] = B[i];
}
for (int i = L; i <= R; ++i) B[i] = A[i]; for (int i = l; i <= mid; ++i)
if (Q[i].op == flag) {
add(Q[i].l, -Q[i].d);
add(Q[i].r + 1, Q[i].d);
} solve(l, mid, L, tmp2, flag);
solve(mid + 1, r, tmp1, R, flag);
} void add_m(int x, int num) {
for (; x <= m + 1; x += (x & (-x)))
bits[x] += num;
} struct hahaha {
int type, l, r, pos, delta;
bool operator < (const hahaha &A) const {
return pos == A.pos ? type < A.type : pos < A.pos;
}
} H[N << 2]; int main() {
int T; scanf("%d", &T);
while (T--) {
scanf("%d%d%d%d%d", &n, &x1, &y1, &x2, &y2);
for (int i = 1; i <= n; ++i) scanf("%d%d", &P[i].x, &P[i].y);
scanf("%d", &m);
for (int i = 1; i <= m; ++i) {
scanf("%d%d%d", &Q[i].op, &Q[i].l, &Q[i].r);
if (Q[i].op != 3) scanf("%d", &Q[i].d);
} for (int i = 1; i <= n; ++i) B[i] = (gagaga) {i, x1 - P[i].x, 0};
solve(1, m + 1, 1, n, 1);
for (int i = 1; i <= n; ++i) P[B[i].id].lx = B[i].ans; for (int i = 1; i <= n; ++i) B[i] = (gagaga) {i, x2 + 1 - P[i].x, m + 1};
solve(1, m + 1, 1, n, 1);
for (int i = 1; i <= n; ++i) P[B[i].id].rx = B[i].ans; for (int i = 1; i <= n; ++i) B[i] = (gagaga) {i, y1 - P[i].y, 0};
solve(1, m + 1, 1, n, 2);
for (int i = 1; i <= n; ++i) P[B[i].id].ly = B[i].ans; for (int i = 1; i <= n; ++i) B[i] = (gagaga) {i, y2 + 1 - P[i].y, m + 1};
solve(1, m + 1, 1, n, 2);
for (int i = 1; i <= n; ++i) P[B[i].id].ry = B[i].ans; int cnt = 0;
for (int i = 1; i <= n; ++i) {
P[i].lx = max(P[i].lx, P[i].ly);
P[i].rx = min(P[i].rx, P[i].ry);
if (P[i].lx >= P[i].rx) continue;
H[++cnt] = (hahaha) {1, i, 0, P[i].lx, 1};
H[++cnt] = (hahaha) {1, i, 0, P[i].rx, -1};
}
for (int i = 1; i <= m; ++i)
if (Q[i].op == 3)
H[++cnt] = (hahaha) {2, Q[i].l, Q[i].r, i, 0}; stable_sort(H + 1, H + cnt + 1); for (int i = 1; i <= cnt; ++i)
if (H[i].type == 1) add(H[i].l, H[i].delta);
else printf("%d\n", query(H[i].r) - query(H[i].l - 1));
}
return 0;
}

【HDU 5283】Senior's Fish的更多相关文章

  1. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  2. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  3. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  4. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  5. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  6. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  7. 【hdu 1043】Eight

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...

  8. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  9. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

随机推荐

  1. 【poj3522-苗条树】最大边与最小边差值最小的生成树,并查集

    题意:求最大边与最小边差值最小的生成树.n<=100,m<=n*(n-1)/2,没有重边和自环. 题解: m^2的做法就不说了. 时间复杂度O(n*m)的做法: 按边排序,枚举当前最大的边 ...

  2. 【BZOJ2815】【ZJOI2012】灾难 [LCA]

    灾难 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 阿米巴是小强的好朋友.  阿米巴和小强 ...

  3. 【BZOJ】1578: [Usaco2009 Feb]Stock Market 股票市场

    [题意]给定s个股票和d天,给出价格矩阵s*d,每天可以买入或卖出整数倍股票,初始资金m,求最大利益.m<=200000,s<=50,d<=10. [算法]完全背包 [题解]关键在于 ...

  4. vue手势解决方案

    1.需求 因为项目中要做一个可以移动.旋转和放缩具有合成图片的功能,例如: 剑可以随意移动,然后把位移.旋转角度和放缩值传给后台进行合成. 2.解决方案 网上搜到手势插件AlloyFinger,htt ...

  5. @EnableEurekaClient源码分析

    @EnableEurekaClient注解,从源码的角度分析是如何work的 NetFlix Eureka client Eureka client 负责与Eureka Server 配合向外提供注册 ...

  6. Ubuntu 14.04 安装gstreamer0.10-ffmpeg

    sudo apt-add-repository ppa:mc3man/trusty-media sudo apt-get update sudo apt-get install -y gstreame ...

  7. sicily 1020. Big Integer

    Description Long long ago, there was a super computer that could deal with VeryLongIntegers(no VeryL ...

  8. c++设计模式系列----单例模式(Singleton模式

    单例模式是为了解决唯一对象实例问题而提出来的,许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单 ...

  9. C后端设计开发 - 第7章-真气-遗失的网络IO

    正文 第7章-真气-遗失的网络IO 后记 如果有错误, 欢迎指正. 有好的补充, 和疑问欢迎交流, 一块提高. 在此谢谢大家了. ボクらの冒険 : http://music.163.com/#/m/s ...

  10. [New learn]SDWebImage框架的基本使用

    代码:https://github.com/xufeng79x/SDWebImage 1.简介 SDWebImage是一个第三方框架,它能够帮助我们有效管理应用图片下载,沙盒保存和内存保存的任务.通过 ...