• 【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. }  
  • 相关阅读:
    LED点阵书写显示
    cpld fpga 区别
    SublimeText 自带格式化代码功能
    iText C# 合并PDF文件流,以及A5变A4时内容默认放在最底下的问题的解决方法;ASP.NET 实现Base64文件流下载PDF
    Adobe Acrobat 9 Pro序列号
    c#比较两个数组的差异
    iNotify.js通知JS 实现浏览器的 title 闪烁、滚动、声音提示、chrome、Firefox、Safari等系统通知。
    配置IISExpress允许外部访问
    https://sweetalert2.github.io/
    c# 利用MailKit.IMap 收取163邮件
  • 原文地址:https://www.cnblogs.com/NSD-email0820/p/9839304.html
Copyright © 2020-2023  润新知