uva 11992 线段树对矩阵进行更新查询

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3143


把矩阵变成一行,然后计算位置,lrj给了线段树数组做法 但是我做的线段树空间过大,直接爆掉,所以换方法了

主要还是测试自己的线段树区间更新的模板

各种RE+WA之后AC,,,,,


做的时候出现的几个错误:

1、行和列弄错

2、build初始化的时候,mmin mmax 都初始化为0才对



  1. #include<cstdio>  
  2. #include<cstring>  
  3. #include<algorithm>  
  4. using namespace std;  
  5.   
  6. #define lson(i) l , mid , (i)*2  
  7. #define rson(i) mid + 1 , r , ((i)*2 +1)  
  8. #define ll rt*2  
  9. #define rr (rt*2+1)  
  10.   
  11. const int INFMIN = 0xffffffff;  
  12. const int INFMAX = 1000000009;//0x80000000;  
  13. const int MAXN = 30001000;  
  14. struct Node{  
  15.     int l,r;  
  16.     int mmax,mmin,sum,add,s;/*s去标记是不是被set*/  
  17. };  
  18. Node nodes[MAXN];  
  19.   
  20.     int mmax,mmin,sum;  
  21.     void PushUp(int rt)  
  22.     {  
  23.         nodes[rt].mmax = max(nodes[ll].mmax,nodes[rr].mmax);  
  24.         nodes[rt].mmin = min(nodes[ll].mmin,nodes[rr].mmin);  
  25.         nodes[rt].sum = nodes[ll].sum + nodes[rr].sum;  
  26.     }  
  27.     void PushDown(int rt)  
  28.     {  
  29.         //if(nodes[rt].add && flag == 1)  
  30.         if(nodes[rt].add)  
  31.         {  
  32.             nodes[ll].add += nodes[rt].add;  
  33.             nodes[ll].mmin += nodes[rt].add;  
  34.             nodes[ll].mmax += nodes[rt].add;  
  35.             nodes[rr].add += nodes[rt].add;  
  36.             nodes[rr].mmin += nodes[rt].add;  
  37.             nodes[rr].mmax += nodes[rt].add;  
  38.   
  39.             nodes[ll].sum += nodes[rt].add*(nodes[ll].r-nodes[ll].l+1);  
  40.             nodes[rr].sum += nodes[rt].add*(nodes[rr].r-nodes[rr].l+1);  
  41.             nodes[rt].add = 0;  
  42.         }  
  43.         //if(nodes[rt].s && flag == 2)  
  44.         if(nodes[rt].s)  
  45.         {  
  46.             nodes[ll].s = nodes[rr].s=nodes[rt].s;  
  47.             nodes[ll].mmin = nodes[ll].mmax = nodes[rr].mmax = nodes[rr].mmin = nodes[rt].mmax;  
  48.             nodes[ll].sum = nodes[rt].mmin*(nodes[ll].r-nodes[ll].l+1);  
  49.             nodes[rr].sum = nodes[rt].mmin*(nodes[rr].r-nodes[rr].l+1);  
  50.             nodes[ll].add = nodes[rr].add = 0;//////////////  
  51.             nodes[rt].s=0;  
  52.         }  
  53.     }  
  54.     void Build(int l,int r,int rt)  
  55.     {  
  56.         nodes[rt].l=l;  
  57.         nodes[rt].r=r;  
  58.         nodes[rt].add =0;  
  59.         nodes[rt].s=0;  
  60.         nodes[rt].sum =0;  
  61.         nodes[rt].mmin=0;  
  62.         nodes[rt].mmax=0;  
  63.         if(l == r)  
  64.         {  
  65.             //nodes[rt].mmin = nodes[rt].mmax = nodes[rt].sum =a[l];  
  66.             nodes[rt].mmin = nodes[rt].mmax = nodes[rt].sum =0;////////////////  
  67.             return ;  
  68.         }  
  69.         int mid = (nodes[rt].l+nodes[rt].r)/2;  
  70.         Build(lson(rt));  
  71.         Build(rson(rt));  
  72.         //PushUp(rt);  
  73.     }  
  74.   
  75.     void Update(int l,int r,int add,int rt,int flag)  
  76.     {  
  77. /////////////////////////////////////////////////////////////////  
  78. //printf("rt=%d l=%d r=%d add=%d flag =%d nodes[rt].l=%d nodes[rt].r=%d\n",rt,l,r,add,flag,nodes[rt].l,nodes[rt].r);  
  79.         if(l<=nodes[rt].l && nodes[rt].r<=r)  
  80.         {  
  81.             if(flag == 1)/*increase*/  
  82.             {  
  83.                 nodes[rt].mmax += add;  
  84.                 nodes[rt].mmin += add;  
  85.                 nodes[rt].add += add;  
  86.                 nodes[rt].sum += add*(nodes[rt].r-nodes[rt].l+1);  
  87.   
  88.             }  
  89.             else  
  90.             {  
  91.                 nodes[rt].mmax = add;  
  92.                 nodes[rt].mmin = add;  
  93.                 nodes[rt].add=0;  
  94.                 nodes[rt].s=1;  
  95.                 nodes[rt].sum = add*(nodes[rt].r-nodes[rt].l+1);  
  96.             }  
  97.             return;  
  98.         }  
  99.         PushDown(rt);  
  100.         int mid = (nodes[rt].l+nodes[rt].r)/2;  
  101.         if(l<=mid)Update(l,r,add,ll,flag);  
  102.         if(r>mid)Update(l,r,add,rr,flag);  
  103.         PushUp(rt);  
  104.     }  
  105.     void Query(int l,int r,int rt)/*1表示mmin 2--mmax 3-sum*/  
  106.     {  
  107.     /////////////////////////////////////////////////////////////////  
  108. //printf("rt=%d l=%d r=%d  nodes[rt].l=%d nodes[rt].r=%d\n",rt,l,r,nodes[rt].l,nodes[rt].r);  
  109.  ///////////////////////////////////////////////////////////////////////////  
  110.         if(l<=nodes[rt].l && nodes[rt].r<=r)  
  111.         {  
  112.             mmin = min(mmin,nodes[rt].mmin);  
  113.             mmax = max(mmax,nodes[rt].mmax);  
  114.             sum += nodes[rt].sum;  
  115.             return ;  
  116.         }  
  117.         PushDown(rt);  
  118.         int mid = (nodes[rt].l+nodes[rt].r)/2;  
  119.         if(l<=mid)Query(l,r,ll);  
  120.         if(r>mid)Query(l,r,rr);  
  121.         PushUp(rt);  
  122.     }  
  123.     void clr()/*每次查询之前使用*/  
  124.     {  
  125.         sum =0;  
  126.         mmin=INFMAX;  
  127.         mmax=INFMIN;  
  128.     }  
  129.   
  130. int main()  
  131. {  
  132.     //freopen("uva11992.txt","r",stdin);  
  133.     int r,c,m,v,flag,x1,y1,x2,y2;  
  134.   
  135.     while(scanf("%d%d%d",&r,&c,&m)!=EOF)  
  136.     {  
  137.         Build(1,r*c,1);  
  138.         while(m--)  
  139.         {  
  140.             scanf("%d%d%d%d%d",&flag,&x1,&y1,&x2,&y2);  
  141.             if(flag<3)  
  142.             {  
  143.                 scanf("%d",&v);  
  144.                 for(int i=x1;i<=x2;i++)/*此处注意*/  
  145.                 {  
  146. ///////////////////////////////////////////////////////////////  
  147. //printf("i=%d\n",i);  
  148.   
  149.                     Update(y1+(i-1)*c,y2+(i-1)*c,v,1,flag);  
  150.                 }  
  151.             }  
  152.             else  
  153.             {  
  154.                 int anssum=0,ansmin=INFMAX,ansmax=INFMIN;  
  155.                 for(int i=x1;i<=x2;i++)  
  156.                 {  
  157.                     clr();  
  158.                     Query(y1+(i-1)*c,y2+(i-1)*c,1);  
  159.                     ////////////////////////  
  160.                    // printf("**min=%d\n",mmin);  
  161.                     /////////////////  
  162.                     anssum+=sum;  
  163.                     ansmax=max(ansmax,mmax);  
  164.                     ansmin=min(ansmin,mmin);  
  165.                 }  
  166.                 printf("%d %d %d\n",anssum,ansmin,ansmax);  
  167.             }  
  168.         }  
  169.     }  
  170.   
  171.     return 0;  
  172. }  
内容概要:该论文探讨了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能同时反射和传输信号,与传统仅能反射的RIS不同。结合NOMA技术,STAR-RIS可以提升覆盖范围、用户容量和频谱效率。针对STAR-RIS元素众多导致获取完整信道状态信息(CSI)开销大的问题,作者提出一种在不依赖完整CSI的情况下,联合优化功率分配、基站波束成形以及STAR-RIS的传输和反射波束成形向量的方法,以最大化总可实现速率并确保每个用户的最低速率要求。仿真结果显示,该方案优于STAR-RIS辅助的OMA系统。 适合人群:具备一定无线通信理论基础、对智能反射面技术和非正交多址接入技术感兴趣的科研人员和工程师。 使用场景及目标:①适用于希望深入了解STAR-RIS与NOMA结合的研究者;②为解决无线通信中频谱资源紧张、提高系统性能提供新的思路和技术手段;③帮助理解PSO算法在无线通信优化问题中的应用。 其他说明:文中提供了详细的Python代码实现,涵盖系统参数设置、信道建模、速率计算、目标函数定义、约束条件设定、主优化函数设计及结果可视化等环节,便于读者理解和复现实验结果。此外,文章还对比了PSO与其他优化算法(如DDPG)的区别,强调了PSO在不需要显式CSI估计方面的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值