zoukankan      html  css  js  c++  java
  • [BJWC2008]秦腾与教学评估 题解

    [BJWC2008]秦腾与教学评估

    Description

    在秦腾进入北京大学学习的第一个学期,就不幸遇到了前所未有的教学评估。
    在教学评估期间,同学们被要求八点起床,十一点回宿舍睡觉,不 准旷课,上课不准迟到,上课不准睡觉……甚至连著名的北大三角地也在教学评估期间被以影响校容的理由被拆除。这些“变态”规定令习惯了自由自在随性生活学习的北大同学叫苦不迭。
    这一天又到了星期五,一大早就是秦腾最不喜欢的高等代数课。可是因为是教学评估时期,不能迟到,于是他在八点五分的 时候挣扎着爬出了宿舍,希望能赶快混进在八点钟已经上课了的教室。
    可是,刚一出宿舍楼门他就傻眼了: 从宿舍到教学楼的路上已经站满了教学评估团的成员。他们的目的就是抓住像他这样迟到的学生,扣除学校的分数。
    秦腾当然不能让评估团得逞。他经过观察发现,整个评估团分成了N个小组,每个小组的成员都分布在从宿舍楼到教学楼的路上的某一段,并且同一小组的成员间的距离是相等的。于是,我们可以用三个整数S, E, D来描述评估团的小组: 既该小组的成员在从宿舍到教学楼的路上的:S, S + D, S + 2D, …, S + KD (K ∈ Z, S + KD ≤ E, S + (K + 1)D > E)位置。
    观察到了教学评估团的这一特点,又经过了认真的思考,秦腾想出了对策: 如果在路上的某一位置有奇数个教学评估团成员,他就可以运用调虎离山,声东击西,隔山打牛,暗度陈仓……等方法,以这一地点为突破口到达教学楼。
    但是由于 教学评估团的成员的十分狡猾,成员位置安排的设计极其精妙,导致在整条路上几乎没有这样的位置出现。即使由于安排不慎重出现了这样的位置,最多也仅有一个。
    现在秦腾观察出了所有小组的安排,但是由于整个教学评估团的人数太多,他实在看不出这样的位置是否存在。
    现在,你的任务是写一个程序,帮助他做出判断。

    Input

    输入文件的第一行为一个整数T。
    接下来输入T组相互独立的测试数据。
    每组测试数据的第一行包含一个整数,代表N接下来的N行,每行三个整数Si, Ei, Di, 代表第i个小组对应的三个参数。

    Output

    对于每个测试数据,如果题目中所求的位置不存在,既任意位置都有偶数个教学评估团的成员存在,在输出文件的中打印一行:"Poor QIN Teng:(" (不包含引号)否则打印两个整数Posi, Count,代表在唯一的位置Posi,有Count个教学评估团的成员。
    根据题意,Count应为奇数。

    Sample Input

    3
    2
    1 10 1
    2 10 1
    2
    1 10 1
    1 10 1
    4
    1 10 1
    4 4 1
    1 5 1
    6 10 1

    Sample Output

    1 1
    Poor QIN Teng:(
    4 3

    Data Constraint

    教学评估团的总人数不大于10^8
    Si ≤ Ei
    1 ≤ T ≤ 5
    N ≤ 200000
    0 ≤ Si, Ei, Di ≤ 2^31 – 1
    输入文件的大小不大于2048KB

    题解

    这道题是一个非常经典的二分题,我们考虑二分有奇数个评估团成员的位置
    又因为这个位置是唯一的,就给了我们一个很好的突破口
    首先我们知道一个很基础的数学公式:偶数+偶数=偶数,偶数+奇数=奇数
    所以我们(pd())函数中只需要统计出从(1sim mid)的位置一共有多少个评估团成员,然后判断奇偶性即可
    当然算当前位置的评估团成员个数就用类似前缀和相减的方法就行了

    CODE

    #include<cstdio>
    #include<string>
    #define R register ll
    #define N 200005
    #define ll long long
    #define inf 0x3f3f3f3f
    using namespace std;
    ll t,n,s[N],e[N],d[N];
    ll max(ll a,ll b) {return a>b?a:b;}
    ll min(ll a,ll b) {return a<b?a:b;}
    void read(ll &x)
    {
    	x=0;ll f=1;char ch=getchar();
    	while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
    	while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();x*=f;
    }
    bool pd(ll k)
    {
    	ll tot=0;
    	for (R i=1;i<=n;++i)
    		if (s[i]<=k) tot+=(min(k,e[i])-s[i])/d[i]+1;
    	if (tot&1) return 1;return 0;
    }
    int main()
    {
    	read(t);
    	while (t--)
    	{
    		read(n);
    		for (R i=1;i<=n;++i)
    			read(s[i]),read(e[i]),read(d[i]);
    		ll l=1,r=3000000000,tot1=0,tot2=0,ans,ans1;
    		while (l<=r)
    		{
    			ll mid=l+r>>1;
    			if (pd(mid)) r=mid-1,ans=mid;else l=mid+1;
    		}
    		for (R i=1;i<=n;++i)
    			if (s[i]<=ans) tot1+=(min(ans,e[i])-s[i])/d[i]+1;
    		for (R i=1;i<=n;++i)
    			if (s[i]<ans) tot2+=(min(ans-1,e[i])-s[i])/d[i]+1;
    		ans1=tot1-tot2;if (ans1&1) printf("%d %d
    ",ans,ans1);else printf("Poor QIN Teng:(
    ");
    	}
     	return 0;
    }
    
  • 相关阅读:
    PCA算法---实验代码完整版(实验代码+数据集下载)
    ubuntu 系统 anaconda 虚拟环境下各种包的安装常用命令
    真实机下 ubuntu 18.04 安装GPU +CUDA+cuDNN 以及其版本选择(亲测非常实用)
    ubuntu 18.04/16.04/14.04 双硬盘分区方案
    如何制作 linux 系统 U盘启动盘
    pandas系列 read_excel() 和 to_excel()各参数详解
    pandas系列 read_csv 与 to_csv 方法各参数详解(全,中文版)
    pycharm 修改程序运行所需内存
    如何利用pandas 将excel文件与csv文件进行相互转化
    python读取文件时提示"UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multi
  • 原文地址:https://www.cnblogs.com/CMC-YXY/p/15131005.html
Copyright © 2011-2022 走看看