4364: [IOI2014]wall砖墙

4364: [IOI2014]wall砖墙

链接

 

分析:

  线段树,维护一个最大值,一个最小值。

 

代码:

 1 #include<bits/stdc++.h>
 2 
 3 char buf[100000],*p1 = buf,*p2 = buf;
 4 #define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2) ? EOF :*p1++)
 5 inline int read() {
 6     int x=0,f=1;char ch=nc();for(;!isdigit(ch);ch=nc())if(ch=='-')f=-1;
 7     for (;isdigit(ch);ch=nc())x=x*10+ch-'0';return x*f;
 8 }
 9 
10 const int N = 2001000;
11 int mn[N<<2],mx[N<<2];
12 
13 #define max(a,b) a>b?a:b
14 #define min(a,b) a>b?b:a
15 #define Root 1,n,1
16 #define lson l,mid,rt<<1
17 #define rson mid+1,r,rt<<1|1
18 
19 inline void pushup(int rt) {
20     mn[rt] = min(mn[rt<<1],mn[rt<<1|1]);
21     mx[rt] = max(mx[rt<<1],mx[rt<<1|1]);
22 }
23 inline void pushdown(int rt) { // 使左右儿子的最小最大值 也在 根节点的最小最大值之间。 
24     if (mn[rt] > mx[rt<<1]) mn[rt<<1] = mx[rt<<1] = mn[rt]; 
25     else if (mn[rt] > mn[rt<<1]) mn[rt<<1] = mn[rt];
26     if (mn[rt] > mx[rt<<1|1]) mn[rt<<1|1] = mx[rt<<1|1] = mn[rt];
27     else if (mn[rt] > mn[rt<<1|1]) mn[rt<<1|1] = mn[rt];
28     
29     if (mx[rt] < mn[rt<<1]) mn[rt<<1] = mx[rt<<1] = mx[rt];
30     else if (mx[rt] < mx[rt<<1]) mx[rt<<1] = mx[rt];
31     if (mx[rt] < mn[rt<<1|1]) mn[rt<<1|1] = mx[rt<<1|1] = mx[rt];
32     else if (mx[rt] < mx[rt<<1|1]) mx[rt<<1|1] = mx[rt];    
33 }
34 void update1(int l,int r,int rt,int L,int R,int h) { // 提高 
35     if (L <= l && r <= R) {
36         mn[rt] = max(mn[rt],h); // 取max:高于h的不更新 
37         mx[rt] = max(mx[rt],h);
38         return ;
39     }
40     pushdown(rt);
41     int mid = (l + r) >> 1;
42     if (L <= mid) update1(lson,L,R,h);
43     if (R > mid)  update1(rson,L,R,h);
44     pushup(rt);
45 }
46 void update2(int l,int r,int rt,int L,int R,int h) { // 降低 
47     if (L <= l && r <= R) {
48         mn[rt] = min(mn[rt],h); // 取min:低于h的不更新 
49         mx[rt] = min(mx[rt],h);  
50         return ;
51     }
52     pushdown(rt);
53     int mid = (l + r) >> 1;
54     if (L <= mid) update2(lson,L,R,h); // -- update1
55     if (R > mid)  update2(rson,L,R,h);
56     pushup(rt);
57 }
58 void print(int l,int r,int rt) {
59     if (l == r) {
60         printf("%d\n",mn[rt]);
61         return; 
62     }
63     int mid = (l + r) >> 1;
64     pushdown(rt);
65     print(lson);print(rson);
66 }
67 int main() {
68     int n = read(),m = read();
69     while (m--) {
70         int opt = read(),l = read() + 1,r = read() + 1,h = read();
71         if (opt==1) update1(Root,l,r,h);
72         else update2(Root,l,r,h);
73     }
74     print(Root);
75     return 0; 
76 }

 

转载于:https://www.cnblogs.com/mjtcn/p/9247154.html

Stkcd [股票代码] ShortName [股票简称] Accper [统计截止日期] Typrep [报表类型编码] Indcd [行业代码] Indnme [行业名称] Source [公告来源] F060101B [净利润现金净含量] F060101C [净利润现金净含量TTM] F060201B [营业收入现金含量] F060201C [营业收入现金含量TTM] F060301B [营业收入现金净含量] F060301C [营业收入现金净含量TTM] F060401B [营业利润现金净含量] F060401C [营业利润现金净含量TTM] F060901B [筹资活动债权人现金净流量] F060901C [筹资活动债权人现金净流量TTM] F061001B [筹资活动股东现金净流量] F061001C [筹资活动股东现金净流量TTM] F061201B [折旧摊销] F061201C [折旧摊销TTM] F061301B [公司现金流1] F061302B [公司现金流2] F061301C [公司现金流TTM1] F061302C [公司现金流TTM2] F061401B [股权现金流1] F061402B [股权现金流2] F061401C [股权现金流TTM1] F061402C [股权现金流TTM2] F061501B [公司自由现金流(原有)] F061601B [股权自由现金流(原有)] F061701B [全部现金回收率] F061801B [营运指数] F061901B [资本支出与折旧摊销比] F062001B [现金适合比率] F062101B [现金再投资比率] F062201B [现金满足投资比率] F062301B [股权自由现金流] F062401B [企业自由现金流] Indcd1 [行业代码1] Indnme1 [行业名称1] 季度数据,所有沪深北上市公司的 分别包含excel、dta数据文件格式及其说明,便于不同软件工具对数据的分析应用 数据来源:基于上市公司年报及公告数据整理,或相关证券交易所、各部委、省、市数据 数据范围:基于沪深北证上市公司 A股(主板、中小企业板、创业板、科创板等)数据整理计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值