【NOIP模拟】行星通道计划

题面

时限500ms

分析

考完才发现,很裸的二维树状数组也能过

可以画图发现,能满足两条线相交,只有两种情况 :

1.大的比大的大,小的在中间(9比7大,2在1和7中间)

2.小的比小的小,大的在中间(或者说1比2小,7在2和9中间)

还有各种修改操作,第一个想到的就是树状数组,线段树之类的。

而二维树状数组维护的就是动态二维前缀和,根据我们推出来的结论,超适合做此题。

设x<y,把两端分别为x和y的一条线段加入二维树状数组的(x,y)位置

看下面此图,红色和蓝色矩形中的权值,就是我们要求的。根据上面两句话推出来的。

代码

  1. #include<bits/stdc++.h>  
  2. using namespace std;  
  3. #define N 1010  
  4. #define M 500050  
  5. int n,m;  
  6. int t[N][N];  
  7. struct email  
  8. {  
  9.     int x,y,c,k;  
  10. }a[M];  
  11. template<class T>    
  12. void read(T &x)    
  13. {    
  14.     x=0;    
  15.     static char c=getchar();    
  16.     while(c<'0'||c>'9') c=getchar();    
  17.     while(c>='0'&&c<='9')    
  18.     x=x*10+c-'0',c=getchar();    
  19. }    
  20. inline int lowbit(int x){return x&(-x);}  
  21. inline void add(int x,int y,int v)  
  22. {  
  23.     for(int i=x;i<=n;i+=lowbit(i))  
  24.         for(int j=y;j<=n;j+=lowbit(j))  
  25.             t[i][j]+=v;  
  26. }  
  27. inline int query(int x,int y)  
  28. {  
  29.     if(x<=0||y<=0) return 0;  
  30.     int ret=0;  
  31.     for(int i=x;i;i-=lowbit(i))  
  32.         for(int j=y;j;j-=lowbit(j))  
  33.             ret+=t[i][j];  
  34.     return ret;  
  35. }  
  36.   
  37. int main()  
  38. {  
  39.     read(n);read(m);  
  40.     for(int i=1;i<=m;i++)  
  41.     {  
  42.         read(a[i].c);  
  43.         if(a[i].c==0)  
  44.         {  
  45.             read(a[i].x),read(a[i].y);  
  46.             if(a[i].x>a[i].y)swap(a[i].x,a[i].y);  
  47.             int x=a[i].x,y=a[i].y;  
  48.             if(y-x<2){printf("0 ");continue;}  
  49.             int ans=query(x-1,y-1)-query(x-1,x)+query(y-1,n)-query(x,n)-query(y-1,y)+query(x,y);  
  50.             printf("%d ",ans);   
  51.             add(x,y,1);  
  52.         }  
  53.         else  
  54.         {  
  55.             read(a[i].k);  
  56.             add(a[a[i].k].x,a[a[i].k].y,-1);  
  57.         }  
  58.     }  
  59. }  
原文地址:https://www.cnblogs.com/NSD-email0820/p/9839304.html