QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#162347 | #7105. Pixel Art | zhouhuanyi | AC ✓ | 658ms | 93928kb | C++14 | 2.9kb | 2023-09-03 10:38:36 | 2023-09-04 04:31:20 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<set>
#include<vector>
#define N 500000
using namespace std;
int read()
{
char c=0;
int sum=0;
while (c<'0'||c>'9') c=getchar();
while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
return sum;
}
struct reads
{
int r1,c1,r2,c2,num;
};
struct lines
{
int l,r,num;
bool operator < (const lines &t)const
{
return r<t.r;
}
};
set<lines>s[N+1];
set<lines>s2[N+1];
int T,n,m,k,scnt,cnt[N+1],st[N+1],rt[N+1];
bool vis[N+1];
vector<reads>p[N+1];
vector<int>E[N+1];
int find(int x)
{
if (rt[x]==x) return x;
return rt[x]=find(rt[x]);
}
void unionn(int x,int y)
{
rt[x]=y;
return;
}
void adder(int x,int l,int r,int c)
{
s[x].insert((lines){l,r,c});
return;
}
void adder2(int x,int l,int r,int c)
{
s2[x].insert((lines){l,r,c});
return;
}
int query(int x,int y)
{
if (x<0||x>n||y<0||y>m) return -1;
auto it=s[x].lower_bound((lines){0,y,0});
if (it!=s[x].end()&&(*it).l<=y) return (*it).num;
it=s2[y].lower_bound((lines){0,x,0});
if (it!=s2[y].end()&&(*it).l<=x) return (*it).num;
return -1;
}
int main()
{
int r1,c1,r2,c2,x,y;
T=read();
while (T--)
{
n=read(),m=read(),k=read(),scnt=0;
for (int i=1;i<=n;++i) p[i].clear(),s[i].clear(),cnt[i]=st[i]=0;
for (int i=1;i<=m;++i) s2[i].clear();
for (int i=1;i<=k;++i)
{
r1=read(),c1=read(),r2=read(),c2=read(),p[min(r1,r2)].push_back((reads){r1,c1,r2,c2,i}),rt[i]=i,E[i].clear(),vis[i]=0;
if (r1==r2) cnt[r1]+=c2-c1+1;
else st[r1]++,st[r2+1]--;
}
for (int i=1;i<=n;++i) st[i]+=st[i-1],cnt[i]+=st[i];
for (int i=1;i<=n;++i) cnt[i]+=cnt[i-1];
for (int i=1;i<=n;++i)
for (int j=0;j<p[i].size();++j)
{
if (p[i][j].r1==p[i][j].r2) adder(p[i][j].r1,p[i][j].c1,p[i][j].c2,p[i][j].num);
else adder2(p[i][j].c1,p[i][j].r1,p[i][j].r2,p[i][j].num);
}
for (int i=1;i<=n;++i)
for (int j=0;j<p[i].size();++j)
{
for (int op=-1;op<=1;++op)
for (int op2=-1;op2<=1;++op2)
if (abs(op)+abs(op2)==1&&query(p[i][j].r1+op,p[i][j].c1+op2)!=-1&&p[i][j].num!=query(p[i][j].r1+op,p[i][j].c1+op2))
{
x=p[i][j].num,y=query(p[i][j].r1+op,p[i][j].c1+op2);
if (x<y) swap(x,y);
E[x].push_back(y),E[y].push_back(x);
}
for (int op=-1;op<=1;++op)
for (int op2=-1;op2<=1;++op2)
if (abs(op)+abs(op2)==1&&query(p[i][j].r2+op,p[i][j].c2+op2)!=-1&&p[i][j].num!=query(p[i][j].r2+op,p[i][j].c2+op2))
{
x=p[i][j].num,y=query(p[i][j].r2+op,p[i][j].c2+op2);
if (x<y) swap(x,y);
E[x].push_back(y),E[y].push_back(x);
}
}
for (int i=1;i<=n;++i)
{
for (int j=0;j<p[i].size();++j)
{
scnt++;
for (int k=0;k<E[p[i][j].num].size();++k)
if (find(E[p[i][j].num][k])!=find(p[i][j].num)&&vis[E[p[i][j].num][k]])
unionn(find(E[p[i][j].num][k]),find(p[i][j].num)),scnt--;
vis[p[i][j].num]=1;
}
printf("%d %d\n",cnt[i],scnt);
}
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
详细
Test #1:
score: 100
Accepted
time: 7ms
memory: 80564kb
input:
3 2 5 2 1 1 1 2 2 3 2 5 2 5 2 1 1 1 3 2 3 2 5 3 3 3 1 1 1 2 3 1 3 2 1 3 2 3
output:
2 1 5 2 3 1 6 1 3 1 4 1 6 2
result:
ok 7 lines
Test #2:
score: 0
Accepted
time: 658ms
memory: 93928kb
input:
2130 2 5 2 1 1 1 2 2 3 2 5 2 5 2 1 1 1 3 2 3 2 5 3 3 3 1 1 1 2 3 1 3 2 1 3 2 3 3 100 51 1 2 2 2 1 4 2 4 1 6 2 6 1 8 2 8 1 10 2 10 1 12 2 12 1 14 2 14 1 16 2 16 1 18 2 18 1 20 2 20 1 22 2 22 1 24 2 24 1 26 2 26 1 28 2 28 1 30 2 30 1 32 2 32 1 34 2 34 1 36 2 36 1 38 2 38 1 40 2 40 1 42 2 42 1 44 2 44 ...
output:
2 1 5 2 3 1 6 1 3 1 4 1 6 2 50 50 100 50 200 1 50 50 150 1 200 1 2 1 4 1 6 1 8 1 10 1 12 1 14 1 16 1 18 1 20 1 22 1 24 1 26 1 28 1 30 1 32 1 34 1 36 1 38 1 40 1 42 1 44 1 46 1 48 1 50 1 52 1 54 1 56 1 58 1 60 1 62 1 64 1 66 1 68 1 70 1 72 1 74 1 76 1 78 1 80 1 82 1 84 1 86 1 88 1 90 1 92 1 94 1 96 1...
result:
ok 355756 lines
Extra Test:
score: 0
Extra Test Passed