1.Madoka and the Elegant Gift;2,树状数组
1.Madoka and the Elegant Gift
题意:
在一个 0101 矩阵中,称一个子矩形为黑色的,当且仅当其包含的都为黑色(11)。称一个黑色子矩形为好的,当且仅当其不是另一个黑色子矩形的子矩形。称这个 0101 矩阵为优雅的,当且仅当不存在两个有公共格子的好的子矩形。
你的任务是,判断一个矩阵是否为优雅的。
容易观察发现,只有下面的L型1,就一定是两个黑nice重合了,不是elgant;
11 | 11 | 10 | 01
01 | 10 | 11 | 11
所以只需要遍历是否存在这四个L型即可;
在函数中虽然return 可以直接终止函数,不运行下面的代码,但是也要最好按照if else 来写,不然就可能容易犯错!
#include<bits/stdc++.h>
#define rep1(i,a,n) for(register ll i=a;i<n;i++)
#define rep2(i,a,n) for(register ll i=a;i<=n;i++)
#define per1(i,n,a) for(register ll i=n;i>a;i--)
#define per2(i,n,a) for(register ll i=n;i>=a;i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define INF 0x3f3f3f3f
#define pb push_back
#define endl "\n"
#define xiaoshu(a) setprecision(a)
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
const int N=150;
char a[N][N];
bool check(int x,int y)
{
if(a[x][y]=='1')
{
if(a[x+1][y]=='1'&&a[x][y+1]=='1'&&a[x+1][y+1]=='0')return 0;
if(a[x+1][y]=='0'&&a[x][y+1]=='1'&&a[x+1][y+1]=='1')return 0;
if(a[x+1][y]=='1'&&a[x][y+1]=='0'&&a[x+1][y+1]=='1')return 0;
}
else if(a[x+1][y]=='1'&&a[x][y+1]=='1'&&a[x+1][y+1]=='1')return 0;
return 1;
}
void solve()
{
int n,m;
cin>>n>>m;
rep2(i,1,n)
rep2(j,1,m)cin>>a[i][j];
bool flag=0;
rep2(i,1,n-1)
rep2(j,1,m-1)
{
if(!check(i,j))
{
flag=1;
break;
}
}
if(flag)cout<<"NO\n";
else cout<<"YES\n";
}
signed main()
{
quick_cin();
int T;
cin>>T;
while(T--)solve();
return 0;
}
2,树状数组;
所以对一个区间的操作就很简单,只需要从叶子节点走到给根节点,而不是遍历整个数组;
int lowbit(int x){return -x&x;};
void add(int i,int x)更新区间(数组ai添加一个值)
{
for(;i<=n;i+=lowbit(i))c[i]+=x;
}
int sum(int i)求a1到ai的前缀和
{
int s=0;
for(;i>=1;i-=lowbit(i))
s+=c[i];
return s;
}
求区间和:sum(j)-sum(i-1);
eg:数星星
用c[]储存,sum(i)求到i有多少个小于i的数;
#include<bits/stdc++.h>
#define rep1(i,a,n) for(register ll i=a;i<n;i++)
#define rep2(i,a,n) for(register ll i=a;i<=n;i++)
#define per1(i,n,a) for(register ll i=n;i>a;i--)
#define per2(i,n,a) for(register ll i=n;i>=a;i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define INF 0x3f3f3f3f
#define pb push_back
#define endl "\n"
#define xiaoshu(a) setprecision(a)
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
const int N=15010;
int a[32010],c[32010];
int n,m;
int lowbit(int x){return -x&x;};
int maxx;
void add(int i,int x)
{
for(;i<=maxx;i+=lowbit(i))c[i]+=x;
}
int sum(int i)
{
int s=0;
for(;i>=1;i-=lowbit(i))
s+=c[i];
return s;
}
int ans[N],xx[N],yy[N];
signed main()
{
quick_cin();
cin>>n;
rep2(i,1,n)
{
int x,y;
cin>>x>>y;
xx[i]=x+1;
yy[i]=y;
if(maxx<x+1)maxx=x+1;
a[x]=1;
// add(x,a[x]);
//cout<<sum(x)-1<<endl;
//ans[sum(x)-1]++;
}
rep2(i,1,n)
{
add(xx[i],1);
ans[sum(xx[i])-1]++;
}
rep2(i,0,n-1)cout<<ans[i]<<endl;
return 0;
}