[关闭]
@exut 2024-11-01T02:56:11.000000Z 字数 627 阅读 177

ARC选做

atcoder


ARC176A

考虑斜线构造,一条斜线可以做到给每行每列一个 ,这是非常好的,而且两条斜线互相不会干扰,当然这个斜线实际是环状的:每次往左上走一步放 ,到达边界就飞到另一边,从左边界到右边界,上到下。

从每个给定点出发去跑斜线,如果经过了别的给定点就说明还要额外再找点出发,这样肯定是可以的,但是实现可能有点复杂。

我们可以考虑对于每个给定点 的 找出其对应的在第一行的点,从这些点跑即可,如果少了就顶多 的扫一遍底端点补到 个即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=100005;
  4. int n,m;
  5. int x,y;
  6. bool ok[N];
  7. int main(){
  8. cin>>n>>m;
  9. for(int i=1;i<=m;i++){
  10. cin>>x>>y;
  11. while(x>1){
  12. x--,y++;
  13. if(y==n+1) y=1;
  14. }
  15. ok[y]=1;
  16. }
  17. int sum=0;
  18. for(int i=1;i<=n;i++){
  19. if(ok[i]) sum++;
  20. }
  21. int pos=1;
  22. while(sum<m){
  23. while(ok[pos]) pos++;
  24. ok[pos]=1,sum++;
  25. }
  26. cout<<n*m<<endl;
  27. for(int i=1;i<=n;i++){
  28. if(ok[i]){
  29. int x=1,y=i;
  30. while(x<=n){
  31. cout<<x<<" "<<y<<endl;
  32. x++,y--;
  33. if(y==0) y=n;
  34. }
  35. }
  36. }
  37. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注