|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
rt.
题目链接
https://www.luogu.com.cn/problem/P9698
问题
https://www.luogu.com.cn/discuss/700009
求hack/求调,都行,我比赛时候看了半个小时愣是看不出问题。是WA了。
Code:
- #include <iostream>
- #include <set>
- #include <algorithm>
- using namespace std;
- struct pt{
- int v,l;//l 指所在斜线的编号
- };
- inline bool cmp(pt x,pt y)
- {
- return x.v<y.v;
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin.tie(0);
- int t,n,m,tmp,cnt;
- pt arr[2114514];
- // 共走 n+m step 故只需考虑前 n+m 个自然数即可。
- cin>>t;
- while(t--)
- {
- cin>>n>>m;
- cnt=0;
- for(int i=0;i<n;i++)
- {
- for(int j=0;j<m;j++)
- {
- cin>>tmp;
- if(tmp<n+m-1)//走 n+m-1 步,则只有 <n+m-1 的自然数才可能被加入
- {
- arr[cnt].l=i+j;
- arr[cnt].v=tmp;//tmp min=0 max=n+m-1
- cnt++;
- }
- }
- }
- sort(arr,arr+cnt,cmp);
- set<int> st;
- bool flag=true;
- for(int i=0;i<cnt;i++)
- {
- //cout<<'='<<arr[i].v<<' '<<arr[i].l<<'='<<endl;
- if(st.find(arr[i].l)==st.end())
- {
- st.insert(arr[i].l);
- }
- else//该线已被占
- {
- cout<<i<<endl;
- flag=false;
- break;
- }
- }
- if(flag)
- {
- cout<<cnt<<endl;
- }
- }
- }
复制代码
对拍代码:
- t = int(input())
- for _ in range(t):
- n, m = map(int, input().split())
- a = [list(map(int, input().split())) for _ in range(n)]
- l = 0
- r = n * m
- ans = 0
- while l <= r:
- k = (l + r) // 2
- p = -1
- flag = True
- for i in range(n):
- for j in range(m):
- if a[i][j] < k:
- if p > j:
- flag = False
- break
- p = j
- if not flag:
- break
- if flag:
- l = k + 1
- ans = k
- else:
- r = k - 1
- print(ans)
复制代码
l和r说明2分
但是可能有点慢
|
|