zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    POJ 3710 Christmas Game#经典图SG博弈
    POJ 2599 A funny game#树形SG(DFS实现)
    POJ 2425 A Chess Game#树形SG
    LeetCode Array Easy 122. Best Time to Buy and Sell Stock II
    LeetCode Array Easy121. Best Time to Buy and Sell Stock
    LeetCode Array Easy 119. Pascal's Triangle II
    LeetCode Array Easy 118. Pascal's Triangle
    LeetCode Array Easy 88. Merge Sorted Array
    ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel
    ASP.NET MVC 学习笔记之面向切面编程与过滤器
  • 原文地址:https://www.cnblogs.com/autoint/p/9573131.html
Copyright © 2011-2022 走看看