1 条题解

  • 0
    @ 2026-4-2 14:42:27
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    /* 放格子:选一个位置为左上角放一个2*2格子--如果该2*2都是空的才能放
       讲讲我的思路 因为N太大1e8 且每次释放的格子小且固定无非使用二分前缀和与标记数组
        这里直接用 umpx umpy进行判断释放更新与ans+=1
     // 我们只用看有没有直接 ust---但是ust无非与PII兼用 所以我们要将 x,y映射为一个唯一数
        直接方法 get(int x,int) return x*N+y;完全可以 
    */
    int n,m;
    const int N=1e9+2;
    unordered_set<int> ust;
    int get(int x,int y)
    {
      return x*N+y;//很大但ll 9e18	
    } 
    int dx[]={0,1,1,0};
    int dy[]={0,0,1,1};
    signed main()
    { std::ios::sync_with_stdio(0);
      cin.tie(0),cout.tie(0);
      cin>>n>>m;
      int x,y;
      int ans=0;
      while(m--)
      {
      	cin>>x>>y;
      	if(x==n||y==n) continue;//边界不看
    	//先看有没有
    	bool flag=1;
    	for(int i=0;i<=3;i++)
          {
          	int nx=x+dx[i];
          	int ny=y+dy[i];
          	if(ust.count(get(nx,ny)))//有过
    		  {
    		    flag=0;
    			break;//没必要看	
    		  } 
    	  }
    	 if(flag)
    	 {
    	    ans+=1;
    	   	for(int i=0;i<=3;i++)
          {
          	int nx=x+dx[i];
          	int ny=y+dy[i];
          	ust.insert(get(nx,ny));//插入 
    	  }
    	 } 
      }
      	cout<<ans<<"\n";
    	return 0;
    }
    • 1

    信息

    ID
    819
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    (无)
    递交数
    35
    已通过
    14
    上传者