首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

Codeforces Round #207 (Div. 二)

2013-10-19 
Codeforces Round #207 (Div. 2)A. Group of Students链接:http://codeforces.com/contest/357/problem/A

Codeforces Round #207 (Div. 2)

A. Group of Students

链接:http://codeforces.com/contest/357/problem/A

描述:一共m(2<=m<=100)个人,c1,c2,c3....cm(0<=ci<=100)代表分数为1,2,3...m的人数。求一个分界分数点,使得该分界点左边所有人数和右边所有人数(右边包括分界点人数)都在x和y之内(包括x,y).(1<=x<=y<=10000).

 思路:水题,直接模拟。

1 for white, 2 for red, 3 for blue)使得条件满足。

思路:一开始想多了,想用dfs染色。但是后来注意到一个条件非常重要“ Your agency cannot allow that to happen, so each dance has at most one dancer who has danced in some previous dance.”这样一来就变成一个大水题了。只要记录以前被染色过的点,以后遇到一个三人组里有一个被染色的,就随便给另外两个染色就可以了。要是三人都没有被染色,就可以随便给这仨货染色。看题要仔细,抓住一个信息就变成大水题了。代码有点逆天,还好一次过。

#include <cstdio>#include <iostream>#include <vector>#include <algorithm>#include <cstring>#include <set>using namespace std;set<int> s;typedef set<int>::iterator s_it;typedef vector<s_it>::iterator v_it;int a[300000+10];int main(){int n, m;while (scanf("%d %d", &n, &m) != EOF){s.clear();memset(a, 0, sizeof(a));for (int i = 1; i <= n; ++i)s.insert(i);int li, ri, xi;s_it it, beg, end;vector<s_it> t;v_it vit;while (m--){scanf("%d %d %d", &li, &ri, &xi);beg = s.lower_bound(li), end = s.upper_bound(ri);for (it = beg; it != end; ++it)if (*it != xi){a[*it] = xi;t.push_back(it);  //为了防止迭代器失效,先将需要删除的保存,后面一起删除}for (vit = t.begin(); vit != t.end(); ++vit)//将保存的点删除s.erase(*vit);t.clear();}for (int i = 1; i <= n; ++i)printf(i == n ? "%d\n" : "%d ", a[i]);}return 0;}


思路:

热点排行