• POJ2155 Matrix


    分析

    好博客
    区间修改,单点查询的题,可以用经典的树状数组的转化,把它化为单点修改,区间查询。
    方法是在一些点上加1,最后查询单点的前缀和模2即为答案。相当于维护的是一个异或差分,利用了容斥。
    可对查询的前缀矩阵对翻转矩阵的覆盖情况分类讨论须要在哪些点上加1。
    最后发现若翻转子矩阵((x_1,y_1) ightarrow(x_2,y_2)),只须在((x_1,y_1),(x_1,y_2+1),(x_2+1,y_1),(x_2+1,y_2+1))这些点上加1,即可满足我们的需要。

    代码

    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<ctime>
    #include<iostream>
    #include<string>
    #include<vector>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<map>
    #include<set>
    #include<bitset>
    #include<algorithm>
    #include<complex>
    #pragma GCC optimize ("O0")
    using namespace std;
    template<class T> inline T read(T&x)
    {
        T data=0;
    	int w=1;
        char ch=getchar();
        while(!isdigit(ch))
        {
    		if(ch=='-')
    			w=-1;
    		ch=getchar();
    	}
        while(isdigit(ch))
            data=10*data+ch-'0',ch=getchar();
        return x=data*w;
    }
    typedef long long ll;
    const int INF=0x7fffffff;
    
    const int MAXN=1123;
    int a[MAXN][MAXN],n;
    
    int lowbit(int x)
    {
    	return x&-x;
    }
    
    void add(int x,int y,int v)
    {
    	for(int i=x;i<=n;i+=lowbit(i))
    		for(int j=y;j<=n;j+=lowbit(j))
    			a[i][j]+=v;
    }
    
    int sum(int x,int y)
    {
    	int res=0;
    	for(int i=x;i;i-=lowbit(i))
    		for(int j=y;j;j-=lowbit(j))
    			res+=a[i][j];
    	return res;
    }
    
    int main()
    {
    //  freopen(".in","r",stdin);
    //  freopen(".out","w",stdout);
    	int T;
    	read(T);
    	while(T--)
    	{
    		int m;
    		read(n);read(m);
    		memset(a,0,sizeof(a));
    		while(m--)
    		{
    			char opt[2];
    			scanf("%s",opt);
    			if(opt[0]=='C')
    			{
    				int x1,y1,x2,y2;
    				read(x1);read(y1);read(x2);read(y2);
    				add(x1,y1,1);
    				add(x1,y2+1,1);
    				add(x2+1,y1,1);
    				add(x2+1,y2+1,1);
    			}
    			else
    			{
    				int x,y;
    				read(x);read(y);
    				printf("%d
    ",sum(x,y)%2);
    			}
    		}
    		if(T)
    			puts("");
    	}
    //  fclose(stdin);
    //  fclose(stdout);
        return 0;
    }
    

    Hint

    多组数据一定要初始化数组。

  • 相关阅读:
    NFramework开源AOP框架设计文档
    gdi+学习笔记(1)
    winform 二进制图片处理
    电脑屏幕分辨率多少合适
    c# winform AutoScaleMode属性 转
    Windows server 2008,Windows server 2008 R2,Windows 2008 SP2 区别
    视频分辨率
    ref和out(MSDN)
    转DirectX、Directshow介绍
    shell 命令的使用
  • 原文地址:https://www.cnblogs.com/autoint/p/9573131.html
Copyright © 2020-2023  润新知