日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

hdu-4302-Holedox Eating-线段树-单点更新,有策略的单点查询

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu-4302-Holedox Eating-线段树-单点更新,有策略的单点查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一開始實在是不知道怎么做,后來經過指導,猛然發現,僅僅須要記錄某個區間內是否有值就可以。

flag[i]:代表i區間內,共同擁有的蛋糕數量。

放置蛋糕的時候非常好操作,單點更新。

ip:老鼠當前的位置

尋找吃哪一個蛋糕的時候:

1,要尋找0-ip這個區間內,位置最大的一個蛋糕的位置,記為ll。

2,要尋找ip-n這個區間內,位置最小的一個蛋糕的位置,記為rr。

找到ll,rr之后,就能夠依據ll,rr跟ip的關系來確定該吃ll還是rr了。

怎樣尋找ll呢?

假設在某個區間的右半邊區間找到了一個數,那么,這個區間的左半邊區間肯定就不用尋找了。

假設這個區間的大小為1,那么這個區間內須要的數就肯定是這個數了。

假設某個區間的flag為0,那么這個區間肯定不存在蛋糕。

假設某個區間不包括0-ip,那么這個區間也肯定找不到ll。

于是,我們寫出了尋找ll的函數:

int query(int ll,int rr,int l,int r,int rt)
{if(rr<l||ll>r)return -INF;if(flag[rt]==0)return -INF;if(l==r){if(flag[rt])return l;else return -INF;}int ans=-INF;ans=query(ll,rr,rson);if(ans==-INF)ans=query(ll,rr,lson);return ans;
}

尋找rr的原理與尋找ll的原理同樣。

整體代碼:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<stack>
using namespace std;
#define INF 99999999
#define lmin 0
#define rmax n
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
#define root lmin,rmax,1
#define maxn 110000
int flag[maxn*4];
void push_up(int rt)
{flag[rt]=flag[rt<<1]+flag[rt<<1|1];
}
void push_down(int rt)
{}
void creat(int l,int r,int rt)
{flag[rt]=0;if(l!=r){creat(lson);creat(rson);}
}
void update(int st,int x,int l,int r,int rt)
{if(r<st||l>st)return;if(l==r&&l==st){flag[rt]+=x;return;}update(st,x,lson);update(st,x,rson);push_up(rt);
}
int query(int ll,int rr,int l,int r,int rt)
{if(rr<l||ll>r)return -INF;if(flag[rt]==0)return -INF;if(l==r){if(flag[rt])return l;else return -INF;}int ans=-INF;ans=query(ll,rr,rson);if(ans==-INF)ans=query(ll,rr,lson);return ans;
}
int query1(int ll,int rr,int l,int r,int rt)
{// cout<<ll<<" "<<rr<<" "<<l<<" "<<r<<" "<<flag[rt]<<endl;if(rr<l||ll>r)return INF;if(flag[rt]==0)return INF;if(l==r){if(flag[rt])return l;else return INF;}int ans=INF;ans=query1(ll,rr,lson);if(ans==INF)ans=query1(ll,rr,rson);return ans;
}
int main()
{int cas,T;int n,m;int l,r,mid;int k,a,b,c;int m1,m2;scanf("%d",&T);cas=0;while(T--){cas++;int sum=0;scanf("%d%d",&n,&m);creat(root);int ip=0;int f=0;while(m--){scanf("%d",&k);if(k==1){int l=query(0,ip,root);int r=query1(ip,n,root);// cout<<l<<" "<<r<<endl;if(l>=0||r<=n){int ll=ip-l;int rr=r-ip;if(ll==rr&&f==1)mid=l;else if(ll==rr&&f==0)mid=r;else if(ll<rr){mid=l;f=1;}else if(ll>rr){mid=r;f=0;}int cha=mid-ip;if(cha<0)cha=-cha;sum+=cha;ip=mid;update(mid,-1,root);}}else{scanf("%d",&a);update(a,1,root);}}printf("Case %d: %d\n",cas,sum);}return 0;
}


轉載于:https://www.cnblogs.com/mengfanrong/p/3867793.html

總結

以上是生活随笔為你收集整理的hdu-4302-Holedox Eating-线段树-单点更新,有策略的单点查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。