首页 > 其他 > 详细

【题解】Luogu P4403 [BJWC2008] 秦腾与教学评估

时间:2019-10-07 09:51:56      阅读:64      评论:0      收藏:0      [点我收藏+]

前言QwQ

学长讲题系列,然而在培训前几天,某神仙刚推荐了此题,$ORZ$


 

学长的一句话题解:二分答案,看前缀和奇偶变化的位置

计算点$1$到点$i$上的点的个数,二分位置

记得开$long long$

code 

 

技术分享图片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 namespace gengyf{
 4 #define ll long long
 5 const int maxn=2e5+10;
 6 inline ll read(){
 7     ll x=0,f=1;
 8     char c=getchar();
 9     while(c<0||c>9){if(c==-)f=-1;c=getchar();}
10     while(c>=0&&c<=9){x=(x*10)+c-0;c=getchar();}
11     return x*f;
12 }
13 int T,n,ans;
14 ll s[maxn],e[maxn],d[maxn];
15 bool fl;
16 ll check(ll pos){
17     ll tmp=0;
18     for(int i=1;i<=n;i++){
19         if(s[i]<=pos){
20             tmp+=(min(pos,e[i])-s[i])/d[i]+1;
21         }
22     }
23     return tmp;
24 }
25 int main(){
26     T=read();
27     while(T--){
28         n=read();ll l=0,r=0;ans=0;
29         for(int i=1;i<=n;i++){
30             s[i]=read();e[i]=read();d[i]=read();
31             r=max(r,e[i]);
32         }
33         if(check(r)%2==0){
34             puts("Poor QIN Teng:(");
35             continue;
36         }
37         while(l<r){
38             ll mid=(l+r)>>1;
39             if(check(mid)%2==1)r=mid;
40             else l=mid+1;
41         }
42         for(int i=1;i<=n;i++){
43             if(s[i]>l||e[i]<l)continue;
44             if((l-s[i])%d[i]==0)ans++;
45         }
46         printf("%lld %d\n",l,ans);
47     }
48     return 0;
49 }
50 }
51 signed main(){
52   gengyf::main();
53   return 0;
54 }
View Code

 

【题解】Luogu P4403 [BJWC2008] 秦腾与教学评估

原文:https://www.cnblogs.com/gengyf/p/11629309.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!