BZOJ1176: [Balkan2007]Mokia CDQ分治

很裸的一道CDQ分治吧

拆操作 询问区间的时候  拆成询问四个子区间然后加加减减

根据时间顺序来二分 然后用插排降一维  最后一维树状数组维护前缀和


#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char c;
inline void read(int &a)
{
	a=0;do c=getchar();while(c<'0'||c>'9');
	while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();
}

struct O
{
   int x,y,ans,No,op;
   int add;
   inline friend bool operator <(O a,O b)
   {return a.No<b.No||a.No==b.No&&a.op<b.op;}
   inline void print()
   {
   	 printf("  x:%d  y:%d  ans:%d  No:%d op:%d add:%d",x,y,ans,No,op,add);
   	 puts("");
   }
}Line[1000001];

int BIT[5000001];
int base;
inline int low_bit(int a){return a&-a;}
inline void Add(int x,int delta)
{for(int i=x;i<=base;i+=low_bit(i))BIT[i]+=delta;}
inline int Query(int x)
{int res=0;for(int i=x;i;i^=low_bit(i))res+=BIT[i];return res;}

void Solve(int L,int R)
{
	if(L^R)
	 {
	 	int Mid=(L+R)>>1;
	    Solve(L,Mid),Solve(Mid+1,R);
	    int j=L;
	    for(int i=Mid+1;i<=R;i++)
	     if(Line[i].add==0)
		  {
		   while(j<=Mid&&Line[j].x<=Line[i].x)
	       {
	       	 if(Line[j].add)Add(Line[j].y,Line[j].add);
	       	 j++;
	       }
	       Line[i].ans+=Query(Line[i].y); 
		 }
		 j--;
		while(j>=L) 
	    {
	     if(Line[j].add)Add(Line[j].y,-Line[j].add);
	      j--;
		}
	   O A[R-L+2];
	   int x=L,y=Mid+1,con=0;
	   while(x<=Mid&&y<=R) 
	      if(Line[x].x<=Line[y].x)A[++con]=Line[x],x++;
	      else A[++con]=Line[y],y++;

	  while(x<=Mid)
	        A[++con]=Line[x],x++;
	  while(y<=R) 
	        A[++con]=Line[y],y++;	  
	/*  for(int i=1;i<=con;i++)
	     A[i].print();
	  */  for(int i=L;i<=R;i++)
	        Line[i]=A[i-L+1];
//       puts("");puts("");puts("");puts("");
}
	else
	   return;
}
int main()
{
	int S,W;
	read(S),read(W);
    base=W<<1;
	/*for(int i=1;i<=W;i++)	
	    Add(i,S);
	*/
	int n=0,j,jk=0;
    while(true)
     {
     	read(j);
     	if(j==3)break;
        n++;
        if(j==1)
           {
		     read(Line[n].x);
			 read(Line[n].y);
			 read(Line[n].add);
			 Line[n].No=0;      }
	     else
	       {
	       	 ++jk;
	       	 int x1,x2,y1,y2;
	       	 read(x1),read(y1),read(x2),read(y2);
	       	 Line[n]=(O){x1-1,y1-1,0,jk,1,0};
	       	 Line[n].ans+=S*(x2-x1+1)*(y2-y1+1);
			 Line[++n]=(O){x2,y2,0,jk,2,0};
	       	 Line[++n]=(O){x1-1,y2,0,jk,3,0};    
	       	 Line[++n]=(O){x2,y1-1,0,jk,4,0};
	       }
	 }
	 Solve(1,n);
	 sort(Line+1,Line+1+n);
	 int i=1;
	 while(Line[i].No==0)i++;
	 for(;i<=n;i+=4)
	  printf("%d\n",Line[i].ans+Line[i+1].ans-Line[i+2].ans-Line[i+3].ans);
	return 0;
} 


内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值