最近题目记录
2016-03-30 10:28
375 查看
1,二分图染色法 hdu 5285 wyh2000 and pupil
题意:一共有 N 个人,有些人之间不认识(a不认识b则b不认识a),要分成两组,每组的人都相互认识,且每组至少一人,问是否能可以做到,若可以则输出每组人数
这是第一次接触二分图。。。写了好久一直TTTTTTT。。。无奈之下只好看题解了。。
poj2528
7. 最近公共祖先(裸) poj 1330 Nearest Common Ancestors
题意:一共有 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
相关文章推荐
- 数论学习笔记之欧拉函数
- 让Web API支持$format参数的方法
- c++ constexpr
- Win7 添加grub引导Linux最简单方法
- gcc和g++的区别
- __init的用法
- linux内核MKDEV()宏
- 硬盘安装 CentOS-6.0
- 名言警句
- 毛泽东是神
- linux下查看系统配置的命令
- Linux步入弱冠之年
- 七部门查处奥数班遇尴尬 学生齐喊“出去”
- 提高网站排名的5大因素
- 分析:低成本应用先锋 Linux系统大盘点
- RHEL6参考文档(官方的PDF文件)
- java中进行二进制,八进制,十六进制,十进制间进行相互转换
- Objective-c方法调用流程
- Homebrew的安装与卸载
- Eclipse 一直Building Workspace 的解决办法