您的位置:首页 > 其它

最近题目记录

2016-03-30 10:28 375 查看
1,二分图染色法 hdu 5285 wyh2000 and pupil

  题意:一共有 N 个人,有些人之间不认识(a不认识b则b不认识a),要分成两组,每组的人都相互认识,且每组至少一人,问是否能可以做到,若可以则输出每组人数

  这是第一次接触二分图。。。写了好久一直TTTTTTT。。。无奈之下只好看题解了。。

  

/*********************************************************************
> File Name: poj2528.cpp
> Author: CROSShh
> Mail: smile_wen@foxmail.com
> Created Time: 2015年11月20日 星期五 21时55分08秒
********************************************************************/

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <list>
using namespace std;
#define LL long long
const int maxn = 200010 ;
int vis[maxn<<2] , s[maxn<<2] , N ;
struct Node
{
int le , ri , mid , sc , tag ;
}A[maxn<<2] ;

void build(int i,int le,int ri)
{
A[i].le = le , A[i].ri = ri , A[i].mid = (le + ri)/2 ;
A[i].sc = 0 , A[i].tag = 0 ;
if (le == ri) {
s[le] = i ;
return ;
}
build(i<<1,le,A[i].mid) ;
build(i<<1|1,A[i].mid+1,ri) ;
}

void pushdown(int i)
{
A[i].tag = 0 , A[i<<1].tag = A[i<<1|1].tag = 1 ;
A[i<<1|1].sc = A[i<<1].sc = A[i].sc ;
}

void update(int i,int le,int ri,int id)
{
if (le < A[i].le || A[i].ri < ri) return ;
if (A[i].le == le && A[i].ri == ri) {
A[i].tag = 1 , A[i].sc = id ;
return ;
}
if (A[i].tag) pushdown(i) ;
if (ri <= A[i].mid) update(i<<1,le,ri,id) ;
else if (le > A[i].mid) update(i<<1|1,le,ri,id) ;
else {
update(i<<1,le,A[i].mid,id) ;
update(i<<1|1,A[i].mid+1,ri,id) ;
}
}

void query(int i)
{
if (A[i].le == A[i].ri) return ;
if (A[i].tag) pushdown(i) ;
query(i<<1) ;
query(i<<1|1) ;
}

int Aa[maxn] , cnt , xx , pp[10000005] ;
struct node
{
int le , ri ;
}AZ[maxn] ;

void change()
{
sort(Aa,Aa+cnt) ;
xx = pp[Aa[0]] = 1 ;
for (int i = 1 ; i < cnt ; ++ i) {
if (Aa[i] == Aa[i-1]) continue ;
else if (Aa[i] == Aa[i-1] + 1) pp[Aa[i]] = xx + 1 ;
else pp[Aa[i]] = xx + 2 ;
xx = pp[Aa[i]] ;
}
xx = pp[Aa[cnt-1]] ;
int le , ri ;
build(1,1,xx) ;
memset(vis,0,sizeof(vis)) ;
for (int i = 1 ; i <= N ; ++ i) {
le = pp[AZ[i].le] , ri = pp[AZ[i].ri] ;
update(1,le,ri,i) ;
}
query(1) ;
}

int main()
{
// freopen("in","r",stdin) ;
int T , le , ri ;
scanf("%d",&T) ;
while (T --) {
scanf("%d",&N) ;
cnt = 0 ;
for (int i = 1 ; i <= N ; ++ i) {
scanf("%d%d",&le,&ri) ;
Aa[cnt++] = le , Aa[cnt++] = ri ;
AZ[i].le = le , AZ[i].ri = ri ;
}
change() ;
int x , ans = 0 ;
for (int i = 1 ; i <= xx ; ++ i) {
x = A[s[i]].sc ;
if (vis[x] || x == 0) continue ;
else {
vis[x] = 1 ;
ans ++ ;
}
}
printf("%d\n",ans) ;
}
return 0 ;
}


poj2528
7. 最近公共祖先(裸) poj 1330 Nearest Common Ancestors
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: