• 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

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

  • 相关阅读:
    LeetCode——Merge Two Sorted Lists
    【iOS与EV3混合机器人编程系列之四】iOS_WiFi_EV3_Library 剖析之中的一个:WiFi UDP和TCP
    Java 中最常见的 5 个错误
    Linux 设备驱动的固件载入
    kettle的job中使用循环
    Servlet 容器对URI的处理
    友元函数友元类.
    【批量加入】-拼接sql字符串
    java JSONObject/JSONArray详解
    java 中文转化为拼音
  • 原文地址:https://www.cnblogs.com/autoint/p/9573131.html
Copyright © 2020-2023  润新知