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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蓝桥杯-操作格子(java)

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯-操作格子(java) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法訓練 操作格子 ? 時間限制:1.0s ? 內存限制:256.0MB ? ? 問題描述

有n個格子,從左到右放成一排,編號為1-n。

共有m次操作,有3種操作類型:

1.修改一個格子的權值,

2.求連續一段格子權值和,

3.求連續一段格子的最大值。

對于每個2、3操作輸出你所求出的結果。

輸入格式

第一行2個整數n,m。

接下來一行n個整數表示n個格子的初始權值。

接下來m行,每行3個整數p,x,y,p表示操作類型,p=1時表示修改格子x的權值為y,p=2時表示求區間[x,y]內格子權值和,p=3時表示求區間[x,y]內格子最大的權值。

輸出格式

有若干行,行數等于p=2或3的操作總數。

每行1個整數,對應了每個p=2或3操作的結果。

樣例輸入 4 3
1 2 3 4
2 1 3
1 4 3
3 1 4 樣例輸出 6
3 數據規模與約定

對于20%的數據n <= 100,m <= 200。

對于50%的數據n <= 5000,m <= 5000。

對于100%的數據1 <= n <= 100000,m <= 100000,0 <= 格子權值 <= 10000。


package com.sihai.advance; import java.util.Scanner;/*** @author sihai**/ public class ALGO_8 {private static int[] arr;//保存所有的格子數private static int[][] op;//存放操作private static int gridNum;//格子總數private static int opNum;//操作種數private static Node[] tree;//線段樹private static int[] father;//father[i]:表示第i個格子在線段樹中的位置private static int tempMax;//用于求區間最大值private static int tempSum;//用于求區間權值和public static void main(String[] args) {init();//初始化,包括輸入參數、構建線段樹fun();}private static void fun(){for(int i=0;i<opNum;i++){int p=op[i][0];int x=op[i][1];int y=op[i][2];switch(p){case 1:arr[x]=y;update(father[x]);break;case 2:tempSum=0;getSum(x,y,1);System.out.println(tempSum);break;case 3:tempMax=Integer.MIN_VALUE;getMax(x,y,1);System.out.println(tempMax);break;}}}// index為區間的序號(對應的區間是最大范圍的那個區間,也是第一個圖最頂端的區間,一般初始是 1 ) private static void getSum(int x,int y,int index){if(x==tree[index].left&&y==tree[index].right){tempSum+=tree[index].sum;return;}int leftIndex=index*2;//左子樹在tree中的位置if(x<=tree[leftIndex].right){//所求的區間在左子樹中有涉及if(y<=tree[leftIndex].right){//左子樹完全包含所求的區間,則查詢區間形態不變 getSum(x,y,leftIndex);}else{//半包含于左區間,則查詢區間拆分,左端點不變,右端點變為左子樹的右區間端點 getSum(x,tree[leftIndex].right,leftIndex);}}int rightIndex=leftIndex+1;//右子樹在tree中的位置if(y>=tree[rightIndex].left){//所求的區間在右子樹有涉及if(x>=tree[rightIndex].left){//右子樹完全包含所求的區間,則查詢區間形態不變 getSum(x,y,rightIndex);}else{// 半包含于右區間,則查詢區間拆分,與上同理 getSum(tree[rightIndex].left,y,rightIndex);}}}// index為區間的序號(對應的區間是最大范圍的那個區間,也是第一個圖最頂端的區間,一般初始是 1) private static void getMax(int x,int y,int index){if(x==tree[index].left&&y==tree[index].right){tempMax=tree[index].max>tempMax?tree[index].max:tempMax;return;}int leftIndex=index*2;//左子樹在tree中的位置if(x<=tree[leftIndex].right){//所求的區間在左子樹中有涉及if(y<=tree[leftIndex].right){//左子樹完全包含所求的區間,則查詢區間形態不變 getMax(x,y,leftIndex);}else{//半包含于左區間,則查詢區間拆分,左端點不變,右端點變為左子樹的右區間端點 getMax(x,tree[leftIndex].right,leftIndex);}}int rightIndex=leftIndex+1;//右子樹在tree中的位置if(y>=tree[rightIndex].left){//所求的區間在右子樹有涉及if(x>=tree[rightIndex].left){//右子樹完全包含所求的區間,則查詢區間形態不變 getMax(x,y,rightIndex);}else{// 半包含于左區間,則查詢區間拆分,與上同理 getMax(tree[rightIndex].left,y,rightIndex);}}}private static void update(int index){// 從下往上更新(注:這個點本身已經在函數外更新過了) if(index==1)return;// 向上已經找到了祖先(整個線段樹的祖先結點 對應的下標為1) if(tree[index].left==tree[index].right){//該節點為葉子節點tree[index].max=arr[tree[index].left];tree[index].sum=arr[tree[index].left];}int fatherIndex=index/2;//代表父節點在tree中的位置tree[fatherIndex].max=tree[fatherIndex*2].max>tree[fatherIndex*2+1].max?tree[fatherIndex*2].max:tree[fatherIndex*2+1].max;tree[fatherIndex].sum=tree[fatherIndex*2].sum+tree[fatherIndex*2+1].sum;update(fatherIndex);}//初始化,包括輸入參數、構建線段樹private static void init(){Scanner sc=new Scanner(System.in);gridNum=sc.nextInt();opNum=sc.nextInt();arr=new int[gridNum+1];op=new int[opNum][3];tree=new Node[2*gridNum];//線段樹father=new int[gridNum+1];//father[i]:代表arr[i]在tree中的位置for(int i=1;i<=gridNum;i++){arr[i]=sc.nextInt();//初始化各格子數}for(int i=0;i<opNum;i++){for(int j=0;j<3;j++){op[i][j]=sc.nextInt();//輸入所有操作}}buildTree(1,gridNum,1);//構造線段樹//更新區間最大值、區間和for(int i=1;i<=gridNum;i++){update(father[i]);}sc.close();}//為區間[left,right]建立一個以index為祖先的線段樹,index為數組下標 private static void buildTree(int left,int right,int index){tree[index]=new Node();tree[index].left=left;tree[index].right=right;if(left==right){// 當區間長度為 0 時,結束遞歸 father[left]=index;// 能知道某個點對應的序號,為了update()的時候從下往上一直到頂 return;}//該結點往 左孩子的方向 繼續建立線段樹,線段的劃分是二分思想,如果寫過二分查找的話這里很容易接受 ,這里將 區間[left,right] 一分為二了buildTree(left,(int)Math.floor(((left+right)/2.0)),index*2);// 該結點往 右孩子的方向 繼續建立線段樹 buildTree((int)Math.floor(((left+right)/2.0))+1,right,index*2+1);} }class Node{int left;int right;int sum;int max; }


總結

以上是生活随笔為你收集整理的蓝桥杯-操作格子(java)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 午夜影院免费观看 | 九九福利视频 | 亚洲啊啊 | 欧美日韩黄色一区二区 | 亚洲福利在线播放 | 国产最新地址 | 潘金莲一级淫片aaaaa | 男女爽爽爽 | 欧美日韩国产91 | 奇米影视中文字幕 | 亚洲图片欧美另类 | 三级视频网址 | 中国a一片一级一片 | 日韩成人免费观看 | 99re热视频| 情趣五月天 | 日本视频在线免费观看 | 狠狠综合久久av一区二区 | 欧美午夜久久 | 久久久资源网 | 日韩porn | 麻豆视频在线观看免费 | 黄色三级网站在线观看 | av在线高清观看 | 丁香婷婷色 | 国产欧美日韩精品一区二区三区 | 黄色片子免费 | 天堂中文在线观看视频 | 两个小y头稚嫩紧窄h文 | 日本一区视频在线播放 | 日韩色婷婷 | 欧美成人va | 国产日韩第一页 | 亚洲最大免费视频 | 9久久9毛片又大又硬又粗 | 国产偷啪 | 五月天综合视频 | 久久刺激| 国内三级视频 | 精品国产一区二区三 | 日韩大尺度视频 | 国产无遮挡免费视频 | 男人都懂的网站 | 欧美天天性 | 男女视频在线观看 | 天天摸天天插 | 日本一本在线 | 欧美成人精品欧美一级 | 北条麻妃一二三区 | 精品久久国产视频 | 4hu最新网址 | 久草视频在线看 | 精品一区二区三区成人免费视频 | 久久久久久婷 | 一区二区精品国产 | 久久久久久亚洲中文字幕无码 | 午夜免费福利网站 | 亚洲va天堂va国产va久 | 欧美你懂得| 亚洲一区精品在线 | 又嫩又硬又黄又爽的视频 | 天天操综合 | 日韩精品aaa | 国产精品乱码一区二区视频 | 亚洲欧洲国产日韩 | 国产高清自拍一区 | 欧美日韩国产麻豆 | 五月天av网| 成年人看的羞羞网站 | 999这里只有精品 | 国产欧美精品一区二区色综合朱莉 | 亚洲一级片av| 欧洲一区二区三区在线 | sm捆绑调教视频 | 午夜视频福利在线观看 | 日韩极品视频 | 久热免费在线 | 国产第一福利影院 | 中国老妇性视频 | 国产精品熟女一区二区不卡 | 成人免费国产 | 最新免费黄色网址 | 色妞干网 | 日本丰满熟妇hd | 中文高清av | 久久激情综合网 | 91成人在线免费观看 | 国产精品成人在线观看 | 性色av免费观看 | 国产中文字幕一区二区三区 | 日韩美女在线视频 | 日韩欧美高清在线 | 亚洲一区二区三区在线视频 | 激情婷婷网 | 老狼影院伦理片 | 你懂的亚洲 | 亚洲av成人精品日韩在线播放 | 亚洲依依 | av天堂一区二区 |