给一些区间【l , r】 , 区间i 内间隔 d[i] 有一个点(可能会重复),保证最后只有一个位置的点数为奇数,其他位置的点数为偶数
找出这个点
二分查找
二分点的位置,注意题目中唯一的奇数点
求区间和,判断奇偶性,缩小范围
#include "bits/stdc++.h" using namespace std; const int N=2e5+5; struct T{ int l,r,d; }; T a[N]; int n; int sum(int p){ int i,t=0; for(i=1;i<=n;i++){ if(a[i].l<=p) t+=(min(a[i].r,p)-a[i].l)/a[i].d+1; } return t; } int rs(int l,int r){ return sum(r)-sum(l-1); } void sov(){ cin>>n; int i,l=0,r=0,ans; for(i=1;i<=n;i++) cin>>a[i].l>>a[i].r>>a[i].d,r=max(r,a[i].r); if(sum(r)%2==0){ cout<<"There's no weakness.\n";return; } while(l<=r){ int md=(l+r)/2; if(rs(l,md)%2) ans=md,r=md-1; else l=md+1; } cout<<ans<<' '<<sum(ans)-sum(ans-1)<<'\n'; } int main(){ int tes; cin>>tes; while(tes--) sov(); }
标签:std,int,sum,防线,120,acw,tes From: https://www.cnblogs.com/towboa/p/16939014.html