Codeforces12D--三维线段树

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include <iostream>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

typedef short int int16;///32767
typedef int int32;///2147483647
typedef long long int64;///9223372036854775807
const double PI=acos(-1.0);///3.141593
const long long MOD=(long long)1E9+7LL;///1000000007
int isdigit(int c);int islower(int c);int isupper(int c);
int tolower(int c);int toupper(int c);
template <class T> T Susake_pow(T a,T b)///pow
{T res;if(b==0) return 1;else while((b&1)==0){b>>=1;a*=a;}res=a;b>>=1;while(b!=0){a*=a;if((b&1)!=0)res*=a;b>>=1;}return res;}
template<class T> inline T gcd(T a,T b)///gcd
{if(a<0)return gcd(-a,b);if(b<0)return gcd(a,-b);return (b==0)?a:gcd(b,a%b);}
template<class T> inline T lcm(T a,T b)///lcm
{if(a<0)return lcm(-a,b);if(b<0)return lcm(a,-b);return a*(b/gcd(a,b));}
template<class T> inline char *Susake_nsystem(T n)///itoa(26)
{T t=0,i;char *s,*p;s=(char *)malloc(sizeof(char)*1000);p=(char *)malloc(sizeof(char)*1000);
while(n){s[t]=n%26+64;if(s[t]==64){s[t]+=26;n-=26;}t++;n/=26;}s[t]=‘\0‘;for(i = 0; i < t; i++)p[i]=s[t-1-i];p[i]=‘\0‘;free(s);return p;}
int Susake_system(char *s)///atoi(26)
{int len=strlen(s),i,sum=0;char p[1000];for(i=0;i<len;i++)p[i]=s[len-1-i]-64;for(i=0;i<len;i++)sum+=p[i]*Susake_pow(26,i);return sum;}
int fa[1];
template <class T> T union_find(T x)///union_find
{return fa[x] == x ? x : fa[x] = union_find(fa[x]);}

const int maxn = 500010;
const int inf = 1<<30;

struct node
{
    int b,i,l;
    bool operator<(const node &x) const
    {
        if(b==x.b)
        {
            if(i==x.i)
            {
                return l < x.l;
            }
            return i > x.i;
        }
        return b < x.b;
    }
}ji[maxn];

int main()
{
    int n;
    std::map<int,int> mp;
    std::map<int,int>::iterator it;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&ji[i].b);
    for(int i=1;i<=n;i++)
        scanf("%d",&ji[i].i);
    for(int i=1;i<=n;i++)
        scanf("%d",&ji[i].l);
    std::sort(ji+1,ji+n+1);
    mp[inf] = -inf;
    mp[-inf] = inf;
    int res = 0;
    for(int i=n;i>=1;i--)
    {
        it = mp.upper_bound(ji[i].i);
        if(ji[i].l<it->second)
            res++;
        else if(mp[ji[i].i]<ji[i].l)
        {
            mp[ji[i].i] = ji[i].l;
            for(it = --mp.lower_bound(ji[i].i);it->second<=ji[i].l;)
                mp.erase(it--);
        }
    }
    printf("%d\n",res);
    return 0;
}
时间: 2024-10-13 16:00:51

Codeforces12D--三维线段树的相关文章

【二维线段树】20150209测试 千石抚子的三维积木

3. 千石抚子的三维积木(nadeko.cpp/in/out)   3.5s  512MB  10*10=100分 p.s.本题含有一些(本人)黑历史,请自动过滤题目背景…= = 自从蛇切绳被搞掉之后,抚子认识到普通的蛇其实是很和谐的东西.于是她开始养蛇,有天在家无聊就开始用蛇堆积木.由于她是驯蛇高手所以它们都很听话堆上去之后就不会动,并且每条蛇可以被视为一块长方体(这个比喻有点..好吧,接下来都把蛇叫做积木了). 堆积木是在一块W*D的平地上进行的,每堆一个积木时会告诉你它的长宽高和放置的左上

树状数组和线段树的那些事

共同点:线段树,树状数组都是用来快速搜索. 线段树通过分支查找,树状数组通过用二进制快速查找,树状数组的查询和更新时间复杂度都是O(logN),通常来说,树状数组能做的线段树都能解决.线段树的范围更广. 但是树状数组的范围虽然小,但是执行效率却比线段树高了不少. 树状数组在处理二维,三维的搜索时就会很方便. 比如VJ树状数组专题的C和K题分别是二维和三维.但是代码区别都不大,基本就是套模板. 本人觉得树状数组在处理逆序数和逆序对,区间子集的问题方面树状数组更有优势(可能是我题目写少了...) 但

bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)

1513: [POI2006]Tet-Tetris 3D Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 540  Solved: 175[Submit][Status] Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一个以前落下的立方体或者落地即停止. 作者想改变一下游戏的目的使得它更大众化,在新游戏中你将

线段树题目总结

一.单点更新 1.hdu1166 敌兵布阵:有N个兵营,每个兵营都给出了人数ai(下标从1开始),有四种命令,(1)"Addij",表示第i个营地增加j人.(2)"Sub i j",表示第i个营地减少j人.(3)"Query ij",查询第i个营地到第j个营地的总人数.(4)"End",表示命令结束.解题报告Here. 2.hdu1754 I Hate It:给你N个数,M个操作,操作分两类.(1)"QAB"

【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树

[BZOJ1513][POI2006]Tet-Tetris 3D Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一个以前落下的立方体或者落地即停止. 作者想改变一下游戏的目的使得它更大众化,在新游戏中你将知道落下的立方体信息以及位置,你的任务就是回答所有立方体落下后最高的方块的高度.所有的立方体在下落过程中都是垂直的并且不会旋转.平板左下角坐标为原点,并且

BZOJ 1513 POI 2006 Tet-Tetris 3D 二维线段树

题目大意:三维俄罗斯方块,问最后摞了多高. 思路:二维线段树的裸题.但是要注意二维线段树不支持标记下穿.所以就不下传,每次更新答案的时候先看标记,然后用所有的跟标记比较大小之后返回. 具体看代码吧,不知道怎么说. CODE: #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define

POJ 2155 Matrix (二维线段树)

http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18143   Accepted: 6813 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. I

线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnlySuccess的博文“完全版线段树”里的大部分题目,其博文地址Here,然后也加入了自己做过的一些题目.整理时,更新了之前的代码风格,不过旧的代码仍然保留着. 同样分成四类,不好归到前四类的都分到了其他.树状数组能做,线段树都能做(如果是内存限制例外),所以也有些树状数组的题目,会标示出来,并且放

BZOJ3688折线统计 dp+线段树

Description 二 维平面上有n个点(xi, yi),现在这些点中取若干点构成一个集合S,对它们按照x坐标排序,顺次连接,将会构成一些连续上升.下降的折线,设其数量为f(S).如下图 中,1->2,2->3,3->5,5->6(数字为下图中从左到右的点编号),将折线分为了4部分,每部分连续上升.下降.   现给定k,求满足f(S) = k的S集合个数. Input 第一行两个整数n和k,以下n行每行两个数(xi, yi)表示第i个点的坐标.所有点的坐标值都在[1, 1000

Kuangbin 带你飞-线段树专题 题解

HDU 1166 敌兵布阵 单调更新区间查询和 #include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #inc