1 条题解
-
0
#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
- 上传者