zoukankan      html  css  js  c++  java
  • [noip2012]借教室

    可以线段树或者二分。

    线段树会被卡,二分写不好也会被卡。

    所以用二分。

    读入用getchar()的话可以减少一半以上的时间。

    #include <cstdio>
    const int N = 1000000 + 9;
    long long delta[N];
    int idx[N],a[N],n,m,d[N],s[N],t[N],pre;
    inline bool check(const int mid)
    {
    	long long sum = 0;
    	if (pre < mid)
    		for (int i = pre + 1; i <= mid; ++i)
    			delta[s[i]] += d[i],delta[t[i] + 1] -= d[i];
    	else 
    		for (int i = mid + 1; i <= pre; ++i)
    			delta[s[i]] -= d[i],delta[t[i] + 1] += d[i];
    	pre = mid;
    	for (int i = 1; i <= n; ++i)
    		if ((sum += delta[i]) > a[i]) return false;
    	return true;
    }
    inline void read(int &x)
    {
    	char c;
    	while ((c = getchar()) < '0');
    	while (c >= '0') {
    		x = x * 10 + c - '0';
    		c = getchar();
    	}
    }
    int main()
    {
    	#ifndef ONLINE_JUDGE
    	freopen("classroom.in","r",stdin);
    	freopen("classroom.out","w",stdout);
    	#endif
    	read(n);read(m);
    	for (int i = 1; i <= n; ++i) read(a[i]);
    	for (int i = 1; i <= m; ++i) {
    		read(d[i]);read(s[i]);read(t[i]);
    	}
    	int l = 0,r = n + 1;
    	while (l + 1 < r) {
    		const int mid = (l + r)/2; 
    		if (check(mid)) l = mid;
    		else r = mid;
    	}
    	if (l == n) puts("0");
    	else printf("-1
    %d
    ",r);
    }
    

      

  • 相关阅读:
    进度条4
    构建之法读书笔记02
    进度条3
    个人作业四则运算2测试
    个人作业3
    从小工到专家阅读笔记01
    个人冲刺07
    个人冲刺06
    个人冲刺05
    学习进度条08
  • 原文地址:https://www.cnblogs.com/lazycal/p/noip2012-day2-t2.html
Copyright © 2011-2022 走看看