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

    传送门

    这道题是一道二分答案题……我估计很难看出这是二分答案……

    题目要求求出序列中老师为奇数的是哪一个点。

    这道题它十分神奇,我们往往都会纠结在如何存下这么多的点,如何处理老师的站位。但是这些并不是解题的关键,我们要注意一个重点,就是序列中最多只有一个位置有奇数个老师,这样的话,我们能知道,包含这个位置的点,它的老师的数的前缀和必然是奇数。而不包含这个位置的点,前缀和必然是偶数。

    所以我们可以二分这个位置!!然后我们只要求出来前面有多少个老师即可。这个是可以O(n)判断的,因为老师的站位是等差数列,可以直接O(1)计算出每个区间对于这段前缀和贡献了多少老师。

    之后我们就做完了……这个题的思维真是想不到……

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<set>
    #include<queue>
    #define rep(i,a,n) for(int i = a;i <= n;i++)
    #define per(i,n,a) for(int i = n;i >= a;i--)
    #define enter putchar('
    ')
    
    using namespace std;
    typedef long long ll;
    const int M = 200005;
    const int N = 1005;
    const int INF = 2147483647;
    
    int read()
    {
        int ans = 0,op = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9')
        {
        if(ch == '-') op = -1;
        ch = getchar();
        }
        while(ch >= '0' && ch <= '9')
        {
        ans *= 10;
        ans += ch - '0';
        ch = getchar();
        }
        return ans * op;
    }
    
    struct seg
    {
        ll s,e,d;
    }a[M];
    
    int T,n,pos;
    ll L,R;
    
    int calc(ll x)
    {
        int cur = 0;
        rep(i,1,n)
        {
        if(x < a[i].s) continue;
        cur += (min(x,a[i].e) - a[i].s) / a[i].d + 1;
        }
        //printf("#%d %d
    ",x,cur);
        return cur;
    }
        
    
    bool check(int x)
    {
        return calc(x) & 1;
    }
    
    int main()
    {
        T = read();
        while(T--)
        {
        n = read(),R = 0,pos = 0;
        rep(i,1,n) a[i].s = read(),a[i].e = read(),a[i].d = read(),R = max(R,a[i].e);
        L = 1;
        while(L <= R)
        {
            ll mid = (L+R) >> 1;
            if(check(mid)) pos = mid,R = mid - 1;
            else L = mid + 1;
        }
        if(!pos) printf("Poor QIN Teng:(
    ");
        else
        {
            int cnt = calc(pos) - calc(pos-1);
            printf("%d %d
    ",pos,cnt);
        }
        }
        return 0;
    }
  • 相关阅读:
    jQuery中deferred对象的使用(一)
    css中calc()的使用
    网络协议学习笔记1
    iOS: 类目里动态关联对象
    [转载] 2016 app 上线流程
    iOS:集成环信3.0循环掉坑。(学习笔记一)
    iOS 实现条件选择框
    iOS : 定义项目中接口文档
    iOS:消除项目中的警告⚠️
    iOS 一个简洁的条件筛选界面
  • 原文地址:https://www.cnblogs.com/captain1/p/9853178.html
Copyright © 2011-2022 走看看