关闭

[LibreOJ β Round]ZQC的手办

212人阅读 评论(0) 收藏 举报
分类:

题目大意

区间对一个数取max。
区间求最小的x个比k小的数。

线段树

第一个操作很好搞。
第二个操作有个很显然的常数大做法。
实际上可以用堆把这个区间的笛卡尔树按优先级广搜。

#include<cstdio>
#include<algorithm>
#include<queue>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=500000+10,inf=1000000000;
struct dong{
    int x,y;
    friend bool operator <(dong a,dong b){
        return a.x<b.x||a.x==b.x&&a.y<b.y;
    }
    friend dong operator +(dong a,dong b){
        if (a<b) return a;else return b;
    }
} tmp;
struct suan{
    int l,r,p,v;
    friend bool operator <(suan a,suan b){
        return a.v>b.v||a.v==b.v&&a.p<b.p;
    }
} zlt;
priority_queue<suan> dl;
dong tree[maxn*4];
int mx[maxn*4],a[maxn],ans[maxn],sta[80];
bool bz[maxn*4];
int i,j,k,l,r,p,t,n,m,tot,top;
int read(){
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9'){
        if (ch=='-') f=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
void build(int p,int l,int r){
    if (l==r){
        tree[p].x=a[l];
        tree[p].y=l;
        return;
    }
    int mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    tree[p]=tree[p*2]+tree[p*2+1];
}
void mark(int p,int v){
    bz[p]=1;
    mx[p]=max(mx[p],v);
    if (tree[p].x<v) tree[p].x=v;
}
void down(int p){
    if (bz[p]){
        mark(p*2,mx[p]);
        mark(p*2+1,mx[p]);
        bz[p]=0;
    }
}
void change(int p,int l,int r,int a,int b,int v){
    if (l==a&&r==b){
        mark(p,v);
        return;
    }
    down(p);
    int mid=(l+r)/2;
    if (b<=mid) change(p*2,l,mid,a,b,v);
    else if (a>mid) change(p*2+1,mid+1,r,a,b,v);
    else change(p*2,l,mid,a,mid,v),change(p*2+1,mid+1,r,mid+1,b,v);
    tree[p]=tree[p*2]+tree[p*2+1];
}
void query(int p,int l,int r,int a,int b){
    if (l==a&&r==b){
        tmp=tmp+tree[p];
        return;
    }
    down(p);
    int mid=(l+r)/2;
    if (b<=mid) query(p*2,l,mid,a,b);
    else if (a>mid) query(p*2+1,mid+1,r,a,b);
    else query(p*2,l,mid,a,mid),query(p*2+1,mid+1,r,mid+1,b);
}
int main(){
    n=read();
    fo(i,1,n) a[i]=read();
    build(1,1,n);
    m=read();
    fo(i,1,m){
        t=read();
        if (t==1){
            l=read();r=read();k=read();
            change(1,1,n,l,r,k);
        }
        else{
            l=read();r=read();k=read();j=read();
            if (r-l+1<j){
                printf("-1\n");
                continue;
            }
            while (!dl.empty()) dl.pop();
            zlt.l=l;zlt.r=r;
            tmp.x=inf;
            query(1,1,n,l,r);
            zlt.p=tmp.y;zlt.v=tmp.x;
            dl.push(zlt);
            tot=0;
            while (j--){
                zlt=dl.top();
                dl.pop();
                if (zlt.v>=k) break;
                ans[++tot]=zlt.v;
                l=zlt.l;r=zlt.r;p=zlt.p;
                if (l<p){
                    zlt.l=l;
                    zlt.r=p-1;
                    tmp.x=inf;
                    query(1,1,n,l,p-1);
                    zlt.p=tmp.y;zlt.v=tmp.x;
                    dl.push(zlt);
                }
                if (p<r){
                    zlt.l=p+1;
                    zlt.r=r;
                    tmp.x=inf;
                    query(1,1,n,p+1,r);
                    zlt.p=tmp.y;zlt.v=tmp.x;
                    dl.push(zlt);
                }
            }
            if (j>=0) printf("-1\n");
            else{
                fo(j,1,tot) printf("%d ",ans[j]);
                printf("\n");
            }
        }
    }
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

「LibreOJ β Round #2」贪心只能过样例 [bitset]【STL】

题目链接:https://loj.ac/problem/515 ——————————————————————————————————515. 「LibreOJ β Round #2」贪心只能过样例内...
  • qq_33184171
  • qq_33184171
  • 2017-07-03 14:51
  • 386

LibreOJ β Round #2 A. 模拟只会猜题意【前缀和】

A. 模拟只会猜题意 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 转到题库提交记录返回比赛 ...
  • mengxiang000000
  • mengxiang000000
  • 2017-07-03 17:56
  • 453

LibreOJ β Round F. ZQC 的游戏【思维建图+最大流】

F. ZQC 的游戏 内存限制: 256 MiB时间限制: 1000 ms 标准输入输出 转到题库提交记录返回比赛 题目描述 Agar.io 是一款流行的游戏,每个玩家在二维...
  • mengxiang000000
  • mengxiang000000
  • 2017-06-17 11:57
  • 387

LibreOJ504 - ZQC 的手办 - 线段树、堆

ZQC 的手办 题目链接 分类:线段树、堆 1.题目描述 给你一个序列a[1…n],有两种操作: 1 l r k1\ l\ r\ k:表示把区间[l,r][l,r]中小于kk的数都改成...
  • dragon60066
  • dragon60066
  • 2017-07-06 13:00
  • 108

「LibreOJ β Round #2」DP 一般看规律

set,map,启发式合并
  • KikiDMW
  • KikiDMW
  • 2017-07-04 17:39
  • 179

2017 浙工业院赛预赛 E 小米买东西【二分+贪心】

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 小咪是一个土豪手办狂魔,这次他去了...
  • Irish_Moonshine
  • Irish_Moonshine
  • 2017-12-19 00:00
  • 220

php中的round函数的bug

php内部函数round有问题
  • cvksbaizhi
  • cvksbaizhi
  • 2015-01-26 13:35
  • 1058

LibreOJ β Round #2 B.贪心只能过样例【Dp+bitset优化】

B. 贪心只能过样例 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 转到题库提交记录返回比赛 ...
  • mengxiang000000
  • mengxiang000000
  • 2017-07-03 17:53
  • 345

[数论] LOJ #508. 「LibreOJ NOI Round #1」失控的未来交通工具

这种非简单路 一般转化成任意一条路加上若干环 这里大概是任意一条路加上若干环长的gcd 任意一条路 可以弄出任意一颗生成树? 但是这里实际上只需要一个带权并查集 详见官方题解#include #...
  • u014609452
  • u014609452
  • 2017-07-23 13:26
  • 227

516. 「LibreOJ β Round #2」DP 一般看规律 [set/SPLAY] 【STL/数据结构】

题目链接:https://loj.ac/problem/516 —————————————————————————————————————————— 516. 「LibreOJ β Round #...
  • qq_33184171
  • qq_33184171
  • 2017-07-04 21:01
  • 166
    个人资料
    • 访问:327182次
    • 积分:11634
    • 等级:
    • 排名:第1512名
    • 原创:814篇
    • 转载:4篇
    • 译文:0篇
    • 评论:201条
    最新评论
    文章分类