【解题报告】 防线
解题思路:
虽然说是解题报告,但是也是有一部分曲折在其中的,因为这道题开始的时候实在想不到思路,知道看到了某大佬的题解之后才豁然开朗,明白了这道题目的做法,和神奇的思想
这道题的思想很简单,就是用前缀和
你要想,奇数加奇数等于偶数,但是题目中只有一个是奇数的,所以这种情况不成立,那么就只有偶数加奇数或偶数加偶数两种情况
因此我们就做一个前缀和加上一个神奇而又简单的二分,就可以得出正确而又完美有缺的答案了(有缺我也不知道那里缺)
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn=200005; int n,t; struct ar { long long s; long long e; long long d; }a[maxn]; long long judge(long long x) { long long ans=0; for(int i=1;i<=n;i++) { if(a[i].s<=x) ans+=(min(x,a[i].e)-a[i].s)/a[i].d+1; } return ans; } int main() { cin>>t; while(t--) { cin>>n; for(int i=1;i<=n;i++) cin>>a[i].s>>a[i].e>>a[i].d; long long l=0,r=((long long)1<<31)-1; while(l<r) { long long mid=(l+r)/2; if(!(judge(mid)&1)) l=mid+1; else r=mid; } int ans=judge(r)-judge(r-1); if(ans) cout<<l<<" "<<ans<<endl; else cout<<"There's no weakness."<<endl; } return 0; }
|