HDU - 6183 Color it 2017广西邀请赛(线段树)
生活随笔
收集整理的這篇文章主要介紹了
HDU - 6183 Color it 2017广西邀请赛(线段树)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接
題意:
有四種操作
0操作 清空所有點(diǎn)
1操作 在(x,y)處插入一個帶顏色的點(diǎn)
2 操作統(tǒng)計(1~x)(y1~y2)這個范圍的不同的顏色數(shù)
3 結(jié)束
思路:
顏色數(shù)只有51個
我們可以建51顆線段樹 因為每次查詢都是1~x范圍的 所以我們對于每個顏色的線段樹
維護(hù)y軸的區(qū)間 節(jié)點(diǎn)的值維護(hù)區(qū)間最小的x?
對于每次查詢 我們就只需要查詢 每種顏色是否有<=x的點(diǎn)即可
關(guān)于剪枝:
?TLE
7784MS
5584MS
#include<bits/stdc++.h> using namespace std; #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define inf 0x3f3f3f3f const int maxn = 1000000+5; int cnt,x,fg; int ls[maxn*4],rs[maxn*4],Min[maxn*4],root[60]; inline void init(){memset(root,0,sizeof(root));ls[0]=0;rs[0]=0;Min[0]=inf;cnt=0; } inline void push_up(int rt){Min[rt]=min(Min[ls[rt]],Min[rs[rt]]); } inline void update(int &rt,int l,int r,int L,int val){if(!rt){rt=++cnt;ls[rt]=0;rs[rt]=0;Min[rt]=val;}if(l==r){Min[rt]=min(Min[rt],val);return ;}int m=(l+r)>>1;if(L<=m) update(ls[rt],l,m,L,val);else update(rs[rt],m+1,r,L,val);push_up(rt); } inline void query(int rt,int l,int r,int L,int R){if(fg||!rt) return ;if(L<=l&&r<=R) {if(Min[rt]<=x) fg=1;return ;}int m=(l+r)>>1;if(L<=m) query(ls[rt],l,m,L,R);if(R>m) query(rs[rt],m+1,r,L,R); } int main(){int op,y,c,l,r;int n=maxn;while(~scanf("%d",&op)){if(op==3) break;if(op==0){init();}else if(op==1){scanf("%d %d %d",&x,&y,&c);update(root[c],1,n,y,x);}else {scanf("%d %d %d",&x,&l,&r);int ans=0;for(int i=0;i<=50;i++){fg=0;query(root[i],1,n,l,r);ans+=fg;}printf("%d\n",ans);}}return 0; } View Code?
?
距離省賽越來越近 又要被暴打了(大霧)?
?
轉(zhuǎn)載于:https://www.cnblogs.com/MengX/p/11291321.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的HDU - 6183 Color it 2017广西邀请赛(线段树)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode题解
- 下一篇: Tomcat配置解析