QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#662091 | #4434. Lemurs | QingTian | TL | 29ms | 19836kb | C++14 | 3.2kb | 2024-10-20 20:46:00 | 2024-10-20 20:46:02 |
Judging History
answer
//F9 编译并运行
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1010;
int n,m,k;
string mp[N];
int sum[N][N];
int a[N][N];
int sum2[N][N];
int clip(int x,int low,int hig){
if(x<low) return low;
if(x>hig) return hig;
return x;
}
bool getSquare(int x0,int y0,int x1,int y1){
x0=clip(x0,1,n);
x1=clip(x1,1,n);
y0=clip(y0,1,m);
y1=clip(y1,1,m);
if(x0>x1) swap(x0,x1);
if(y0>y1) swap(y0,y1);
int res=(sum[x1][y1]-sum[x0-1][y1]-sum[x1][y0-1]+sum[x0-1][y0-1]);
//cerr<<x0<<' '<<y0<<' '<<x1<<' '<<y1<<' '<<res<<"\n";
return res==(x1-x0+1)*(y1-y0+1);
}
bool getTri(int x,int y,int dx,int dy,int len){
//cerr<<"TRI: "<<x<<' '<<y<<' '<<dx<<' '<<dy<<' '<<len<<'\n';
if(x<1||x>n||y<1||y>m||len<0) return 1;
if(len==0) return 1;
int slen=(len+1)/2-1;
int rlen=slen+1;
// cerr<<slen<<' '<<rlen<<'\n';
return getSquare(x,y,x+dx*slen,y+dy*slen)
&&getTri(x+dx*rlen,y,dx,dy,len-rlen)
&&getTri(x,y+dy*rlen,dx,dy,len-rlen);
}
bool get(int x,int y,int k){
int dx[]={1,1,-1,-1};
int dy[]={1,-1,1,-1};
for(int i=0;i<4;i++){
bool res=getTri(x,y,dx[i],dy[i],k+1);
//cerr<<"GET: "<<x<<' '<<y<< ' '<<res<<'\n';
if(!res) return 0;
}
return 1;
}
int getSquare1(int x0,int y0,int x1,int y1){
//cerr<<x0<<' '<<y0<<' '<<x1<<' '<<y1<<"\n";
x0=clip(x0,1,n);
x1=clip(x1,1,n);
y0=clip(y0,1,m);
y1=clip(y1,1,m);
if(x0>x1) swap(x0,x1);
if(y0>y1) swap(y0,y1);
return (sum2[x1][y1]-sum2[x0-1][y1]-sum2[x1][y0-1]+sum2[x0-1][y0-1]);
}
int getTri1(int x,int y,int dx,int dy,int len){
//cerr<<"TRI: "<<x<<' '<<y<<' '<<dx<<' '<<dy<<' '<<len<<'\n';
if(x<1||x>n||y<1||y>m||len<0) return 0;
if(len==0) return 0;
int slen=(len+1)/2-1;
int rlen=slen+1;
return getSquare1(x,y,x+dx*slen,y+dy*slen)
+getTri1(x+dx*rlen,y,dx,dy,len-rlen)
+getTri1(x,y+dy*rlen,dx,dy,len-rlen);
}
bool get1(int x,int y,int k){
int dx[]={1,1,-1,-1};
int dy[]={1,-1,1,-1};
for(int i=0;i<4;i++){
int res=getTri1(x,y,dx[i],dy[i],k+1);
if(res) return 1;
}
return 0;
}
void solve(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
cin>>mp[i],mp[i]=" "+mp[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+(mp[i][j]=='x');
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=get(i,j,k);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sum2[i][j]=sum2[i-1][j]+sum2[i][j-1]-sum2[i-1][j-1]+a[i][j];
}
}
int res=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]=='x'){
if(get1(i,j,k)==0){
res=0;
}
}
}
}
// cout<<getTri(sum,2,2,1,1,1)<<'\n';
// db(sum);
// db(a);
// db(sum2);
if(res) cout<<"TAK\n";
else cout<<"NIE\n";
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int _=1;cin>>_;
while(_--) solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 29ms
memory: 19836kb
input:
4000 1 1 1 . 1 1 1 x 1 1 1000 . 1 1 1000 x 1 1000 4 ..........................................xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
output:
TAK TAK TAK TAK TAK NIE NIE TAK NIE TAK NIE NIE TAK TAK NIE TAK TAK NIE NIE NIE NIE NIE NIE NIE NIE NIE TAK NIE NIE TAK TAK TAK NIE NIE NIE TAK TAK NIE NIE TAK NIE NIE NIE TAK NIE NIE NIE TAK NIE NIE NIE NIE TAK NIE NIE NIE NIE NIE NIE NIE NIE NIE NIE NIE NIE NIE NIE NIE NIE TAK NIE NIE NIE TAK TAK ...
result:
ok 4000 lines
Test #2:
score: -100
Time Limit Exceeded
input:
36 1000 1000 2 ....xxxx..............xxxxxx..........xx..xxxx......xxxxxxxxxxx.........xxxxxxxxxx...xxxxxx....xxxxxx.......xxxxxx....xxxxxx......................................xx.............xxxxxxxxx......xxxxxxx................xxxxxx..xxxxxx....xxxxxx..............xxxxxxxxxxxxxxxxxxxxxxxxxxxx...x...