<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      P11453 [USACO24DEC] Deforestation S

      閑聊:多測一定要清空!!!

      以及,聽說本題有九倍經驗,主要針對差分約束。


      題目傳送門

      我的博客-歡迎光臨

      本題的做法很多,最主要的一個是差分約束。這里我們介紹另一種做法——并查集+樹狀數組。(雖然這個做法有點……難評,但我認為它最大的優勢是快,我現在是896ms,第二面榜)

      首先本題值域太大了,我們要先對位置進行離散化(查詢的區間和樹的位置都離散化)。接著我們可以對原來的 \(n\) 棵樹的位置排序(雖然這沒必要)。最后我們把原問題轉化為最少保留多少棵樹。

      然后我們就得到了一坨形似 CSP-S 2024 T2 的東西。我們按右端點從小到大排序,然后分別處理每個區間。

      這里就體現本題的貪心標簽了:對于一個區間而言,如果當前它的限制還未被滿足,盡量往右邊選擇保留的樹一定是不劣的,因為它的上一個區間已經選樹完成了不用管,但是下一個區間沒考慮完,越往右選樹,越有可能使這棵樹貢獻到下面的區間。

      或者說,如果你該區間的選樹方案里存在一個靠右的樹未被選擇,顯然你把它選上,并去掉最靠左邊的樹,這樣既能滿足該區間的約束,下面的區間要選的樹也有可能減少,何樂而不為呢?

      這樣我們的大體思路就有了:離散化+區間排序+枚舉區間求貢獻。

      但是如果從右往左直接掃的話,經過構造有可能會T飛(本人沒試過,如有不對還請斧正)。這時我就想起來了一個套路:用并查集維護最靠右的未被選樹的位置。具體來說,我們用 \(fa_i\) 表示 \(i\) 左側最靠近 \(i\) 的沒被選樹的位置。初始時 \(fa_i=i\)

      這個套路還蠻常見的,但總之當 \(i\) 位置選上樹后,我們令 \(fa_i=i-1\),查找某個點前一個未被選樹的位置時,直接跑正常的路徑壓縮即可。

      至于樹狀數組,這個主要是用來判斷該區間是否已經滿足限制用的。當我們加入一個位置的全部樹時,就讓當前這個離散化位置在樹狀數組上加上該位置樹的個數,進入下一個區間時直接正常區間查詢即可。

      由于我們最多會種 \(n\) 棵樹,最多有 \(m\) 個約束區間,樹狀數組的修改和查找是 \(O(\log n)\) 的,所以總時間復雜度 \(O(Tn \log n)\)

      其他問題請看代碼。

      代碼:

      P11453
      #include<cstdio>
      #include<algorithm>
      using namespace std;
      
      inline int read(){
      	int x=0,f=1;char c=getchar();
      	while(c<48){
      		if(c=='-') f=-1;
      		c=getchar();
      	}
      	while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();
      	return x*f;
      }
      
      const int N=1e5+5;
      int T,n,m,pos[N],b[N],fa[N],tr[N],num[N];
      struct Nahida{
      	int l,r,num;
      }q[N];
      
      inline void INIT(){
      	for(int i=1;i<=n;i++){
      		fa[i]=i,tr[i]=0,num[i]=0;
      	}
      }
      
      inline int lowbit(int x){
      	return x&(-x);
      }
      
      inline bool cmp(Nahida x,Nahida y){
      	return (x.r!=y.r?x.r<y.r:x.l<y.l);
      }
      
      inline void add(int x,int k){
      	while(x<=n){
      		tr[x]+=k;
      		x+=lowbit(x);
      	}
      }
      
      inline int query(int x){
      	int ans=0;
      	while(x){
      		ans+=tr[x];
      		x-=lowbit(x);
      	}
      	return ans;
      }
      
      inline int FIND(int x){
      	return (x==fa[x]?x:fa[x]=FIND(fa[x]));
      }
      
      signed main(){
      	T=read();
      	while(T--){
      		n=read(),m=read();
      		INIT();//多測一定要檢查你該清空的數組是否全部清空
      		//多測記得清空!!! 
      		for(int i=1;i<=n;i++){
      			pos[i]=read();
      			b[i]=pos[i];
      		}
      		for(int i=1;i<=m;i++){
      			q[i].l=read(),q[i].r=read(),q[i].num=read();
      		}
      		//離散化 
      		sort(b+1,b+n+1);sort(pos+1,pos+n+1);
      		int len=unique(b+1,b+n+1)-b-1;
      		for(int i=1;i<=n;i++){
      			pos[i]=lower_bound(b+1,b+len+1,pos[i])-b;
      			num[pos[i]]++;
      			//剛才題解里沒講到一個問題,就是一些樹的位置可能會重復,所以我們開個桶數組,記錄某個位置的樹有多少棵 
      		}
      		for(int i=1;i<=m;i++){
      			q[i].l=lower_bound(b+1,b+len+1,q[i].l)-b;
      			q[i].r=upper_bound(b+1,b+len+1,q[i].r)-b-1;
      			/*
      			我離散化的時候沒有選擇把查詢端點也一起扔進去離散化,而是在找第一個大于等于左端點的樹的位置
      			和最后一個小于右端點的樹的位置,這樣我們相當于是把兩側沒有樹的無用區間忽略掉了
      			在此同時進行了一個離散化 
      			*/
      		}
      		sort(q+1,q+m+1,cmp);//根據右端點從小到大排序 
      		int ans=0;
      		for(int i=1;i<=m;i++){
      			int l=q[i].l,r=q[i].r;
      			int dq=query(r)-query(l-1);
      			//dq:當前區間已經有了多少棵樹 
      			if(dq>=q[i].num){//當前區間已經種夠了,就不用種了 
      				continue;
      			}
      			ans+=q[i].num-dq;
      			//否則就要種這么多棵樹 
      			while(dq<q[i].num){
      				//nxt:更具體地說,指的是還沒有選樹的最靠右的某個位置,這個位置上可以有多棵樹 
      				int nxt=FIND(r);
      				add(nxt,num[nxt]);//注意這里可能有多棵樹 
      				fa[nxt]=nxt-1;
      				dq+=num[nxt];//用剛種的樹的數量更新dq 
      			}
      		}
      		//ans記錄的是最少留多少樹,轉換成最多砍多少棵樹 
      		printf("%d\n",n-ans);
      	}
      	return 0;
      }
      
      posted @ 2025-10-29 19:06  qwqSW  閱讀(7)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲中文字幕成人综合网| 五月综合婷婷开心综合婷婷 | 玉山县| 日韩av一区二区高清不卡| 国模雨珍浓密毛大尺度150p| 国产精品沙发午睡系列990531 | 亚洲午夜爱爱香蕉片| 少妇撒尿一区二区在线视频| 国产亚洲精品第一综合另类无码无遮挡又大又爽又黄的视频 | 精品亚洲香蕉久久综合网| 99久久婷婷国产综合精品青草漫画| 亚洲区一区二区激情文学| 亚洲日韩性欧美中文字幕| 望奎县| 成人国产精品免费网站| 欧美日韩综合网| 亚洲区激情区无码区日韩区 | 东京热大乱系列无码| 人妻激情偷乱视频一区二区三区| 精品偷拍一区二区三区在| 国产精品爽黄69天堂a| 亚洲精品一品二品av| 亚洲中文字幕国产精品| 亚洲色一色噜一噜噜噜| 欧美性猛交xxxx乱大交极品| 国产亚洲精久久久久久久91| 久久久久噜噜噜亚洲熟女综合| 国产精品无码a∨麻豆| 悠悠人体艺术视频在线播放| 97无码人妻福利免费公开在线视频| 各种少妇wbb撒尿| 色悠悠成人综合在线视频| 四虎永久在线精品无码视频| 国产av成人精品播放| 国产精品久久无中文字幕| 久久日韩在线观看视频| 国产免费播放一区二区三区| 香蕉久久夜色精品国产成人| 亚洲最新无码中文字幕久久| 成人无码一区二区三区网站| 视频一区视频二区亚洲视频|