锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鎬濊礬1錛?/font> 姣忚緭鍏ヤ竴涓叧緋伙紝鍚堝茍錛屾渶鍚庝粠1鍒癗錛屽浜庢瘡涓涓漢錛屾壘鍑哄畠浠殑紲栧厛錛屽皢浠栦滑鐨勫篸ebt鍔犲埌紲栧厛鐨刣ebt 涓娿傞氫織鐨勮錛屽氨鏄瘡涓泦鍚堢殑鎴愬憳閮藉皢鑷繁鐨刣ebt鍔犲埌紲栧厛涓婏紝鑷繁褰?錛屾渶鍚庣湅紲栧厛鐨勫兼槸鍚︿負0錛?/font> 鏈鍚庡湪浠?鍒癗鎵竴閬嶅鏋滄湁debt涓嶄負0鐨勶紝杈撳嚭“IMPOSSIBLE”錛屽惁鍒?#8220;POSSIBLE”錛?/font> 緙虹偣錛氬鏉傚害楂橈紝鏌ヨ澶嶆潅搴?N錛屾渶鍚庡媺寮鴻繃浜嗭紝鏃墮棿0.63s 鎬濊礬2錛?/font> 璺緞鍘嬬緝錛屾瘡杈撳叆涓涓叧緋伙紝鍚堝茍銆傛渶鍚庝粠1鍒癗錛屽鏋?i 鐨刣ebt涓嶄負0錛屼粠 i 鍒?i 鐨勭鍏堢殑璺緞涓嶆柇鍘嬬緝鐩村埌 紲栧厛錛岃繖鏍瘋櫧鐒朵粛鐒舵槸N嬈℃搷浣滐紝浣嗙敱浜庡湪鍘嬬緝榪囩▼涓ぇ閮ㄥ垎鎴愬憳debt褰?錛屾晠瀹為檯涓婅繘琛屾搷浣滅殑嬈℃暟榪滃皬浜嶯. 鏈鍚庢椂闂翠負0.11,姣旇搗涓婁竴縐嶆柟娉曟湁浜嗗緢澶ф彁楂?/font> Code 1:
]]>
2) 濡傛灉u涓嶆槸鐩村緞涓婄殑鐐癸紝鍒檜鍒皏蹇呯劧浜庢爲鐨勭洿寰勭浉浜?鍙嶈瘉),閭d箞浜ょ偣鍒皏 蹇呯劧灝辨槸鐩村緞鐨勫悗鍗婃浜?br> 鎵浠涓瀹氭槸鐩村緞鐨勪竴涓鐐癸紝鎵浠ヤ粠v榪涜BFS寰楀埌鐨勪竴瀹氭槸鐩村緞闀垮害
鐩稿叧棰樼洰鏈塗OJ1056錛孴OJ3517.
TOJ 1056(Labyrinth):
澶ф剰鏄竴涓敱‘#’鍜?.'鏋勬垚鐨勮糠瀹紝'.'琛ㄧず鍙錛?#8216;#’琛ㄧず涓嶅彲琛岋紝闂彲琛岀殑鏈闀跨殑璺殑闀垮害鏄灝戙?br>
#include <cstring>
#include <queue>
#define M 1002
using namespace std;
int r,c;
char map[M][M];
bool flag[M][M];
int move[4][2]={-1,0,1,0,0,-1,0,1}; // 鍒嗗埆琛ㄧず涓婁笅宸﹀彸
int maxt;
struct Node{
int x,y,num;
};
Node ans;
bool legal(int x,int y){ //鍒ゆ柇璇ョ偣鏄惁瓚婄晫鍙婃槸鍚﹀彲璧?/span>
if(x >=0 && x < r && y>=0 && y < c &&map[x][y]=='.') return true;
return false;
}
void bfs(Node start){
memset(flag,false,sizeof(flag)); //鍒濆鎵鏈夌偣鏍囪涓篺alse
flag[start.x][start.y] = true; //璧風偣鏍囪涓簍rue
queue<Node>f;
while(!f.empty()) f.pop(); //娓呯┖鍒涘緩鐨勯槦鍒?/span>
Node m,n,tep;
int tx,ty,xx,yy;
int i,j,k,num;
f.push(start);
while(!f.empty()){ //濡傛灉闃熷垪涓嶄負絀?/span>
m = f.front(); //鍙栧嚭闃熼鍏冪礌
tx = m.x; ty = m.y; num = m.num;
if(num > maxt){ //濡傛灉璇ュ厓绱犵殑闀垮害澶т簬maxt錛屾洿鏂癿axt
maxt = num;
ans = m;
}
for(i = 0;i < 4; i++){ //浠涓鴻搗鐐瑰悜4涓柟鍚態FS
xx = tx + move[i][0];
yy = ty + move[i][1];
if(!flag[xx][yy] && legal(xx,yy)){
flag[xx][yy] = true;
tep.x = xx;
tep.y = yy;
tep.num = num + 1;
f.push(tep);
if(num+1>maxt){ //濡傛灉鏈夋洿澶х殑鍒欐洿鏂?/span>
maxt = num + 1;
ans = tep;
}
}
}
f.pop(); //寮瑰嚭闃熼鍏冪礌
}
}
int main(){
int i,j,T;
Node start,end;
bool mark;
scanf("%d",&T);
while(T--){
scanf("%d%d",&c,&r);
mark = false; maxt = -1;
for(i = 0;i < r; i++)
scanf("%s",map[i]);
for(i = 0;i < r; i++){
for(j = 0;j < c; j++){
if(map[i][j]=='.'){ //浠婚変竴鐐笲FS
start.x = i;
start.y = j;
start.num = 0;
bfs(start);
mark = true;
break;
}
}
if(mark) break;
}
maxt = -1;ans.num = 0; //姝ゆ椂ans涓瀹氭槸鐩村緞鐨勭鐐癸紝灝嗗畠璁句負璧風偣
bfs(ans); //榪涜絎簩嬈FS
printf("Maximum rope length is %d.\n",maxt);
}
}
TOJ3517(The longest athletic track):
棰樼洰緇欏嚭浜嗕竴媯電敓鎴愭爲錛岄棶榪欐5鐢熸垚鏍戞渶闀跨殑璺殑闀垮害鏄灝戙?br>
#include<queue>
#define INF 999999
#define M 2002
using namespace std;
int n;
int maxx;
int map[M][M],sum[M];
bool flag[M];
int bfs(int begin){
queue<int>f;
int i,m,k,key;
maxx=0;
memset(flag,false,sizeof(flag));
f.push(begin);
while(!f.empty()){
k=f.front();
for(i=1;i<=n;i++){
if(map[k][i]!=INF&&!flag[i]){
flag[i]=true;
f.push(i);
sum[i]=sum[k]+map[k][i];
if(sum[i]>maxx) { maxx=sum[i];key=i; }
}
}
f.pop();
}
return key;
}
int main()
{
int i,j,k,dis,key,cas;
scanf("%d",&cas);
while(cas--){
scanf("%d",&n);
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
map[i][j]=map[j][i]=INF;
for(i=1;i<n;i++){
scanf("%d%d%d",&j,&k,&dis);
map[j][k]=map[k][j]=dis;
}
sum[1]=0;
key=bfs(1);
sum[key]=0;
key=bfs(key);
printf("%d\n",maxx);
}
//system("pause");
}
]]>
if(L[i]<=R[j])
a[k] = L[i++];
else{ //濡傛灉L鏈涓婇潰鐨勬暟澶т簬R鐨勶紝閭d箞L[i]鍙婂悗闈㈢殑鏁板彲浠ュ拰R[j]鏋勬垚n1-i+1涓嗗簭瀵?br> a[k] = R[j++];
count +=(n1 -i + 1); //绱姞
}
}
褰掑茍鎺掑簭鐨勪唬鐮侊細
int n1 = q-p+1,n2 = r-q;
int i,j,k;
for(i = 1;i <= n1; i++)
L[i] = a[p+i-1];
for(j = 1;j <= n2; j++)
R[j] = a[q+j];
L[n1+1] = INF;
R[n2+1] = INF;
i = 1;j = 1;
for(k = p;k <= r;k ++){
if(L[i]<=R[j])
a[k] = L[i++];
else{
a[k] = R[j++];
count +=(n1 -i + 1);
}
}
}
void merge_sort(int p,int r){
if(p<r){
int q = (p+r)/2;
merge_sort(p,q);
merge_sort(q+1,r);
merge(p,q,r);
}
}
]]>
鎴愮珛鐨勩?br>澶氶噸鑳屽寘闂鏈塗OJ1034錛孴OJ1670.
TOJ1034 :
澶ф剰鏄湁6縐嶈鏍肩殑鐭沖ご錛岀紪鍙蜂粠1鍒?錛岀紪鍙蜂負 i 鐨勭煶澶寸殑浠峰間負 i .鐜板湪緇欏嚭鍚勭鐭沖ご鐨勬暟閲忥紝闂湁娌℃湁鍙兘寰楀埌鎬諱環鍊肩殑涓鍗娿?br>鍋氭硶: DP, 姣忕鐭沖ご浠峰間負v[i],浠峰間負 i 錛屾暟閲忎負 num[i] ,閫氳繃澶氶噸鑳屽寘鐪嬭兘涓嶈兘鎭板ソ鍙栧緱鎬諱環鍊肩殑涓鍗娿?br> 涓涓紭鍖栨槸鎬諱環鍊間負濂囨暟鐩存帴涓嶇敤鑰冭檻錛岃屽湪DP鐨勬椂鍊欒緗竴涓爣璁版潵璁板綍鏄惁宸茬粡鍙栧緱鎬諱環鍊間竴鍗婏紝濡傛灉鍙栧緱鍒欏彲浠ヨ繑鍥炪?br>鍋氭硶2錛氳繖縐嶆柟娉曠殑鍓嶆彁鏄疨OJ discuss閲岀殑涓縐嶅仛娉曪紝鍗崇粰姣忎釜鐭沖ご鐨勬暟閲弇od 8銆傝瘉鏄庢槸鐢ㄦ娊灞夊師鐞嗚瘉鐨勶紝寰堝鏉傦紝鎴戞病鏈夌湅銆備絾鏄繖鏍蜂互鏉ワ紝鏁伴噺
涓涓嬪瓙澶уぇ鍑忓皯錛屾瀬澶х殑鎻愰珮浜嗘晥鐜囥?br> 鎴戣鐨勫仛娉?浜嬪疄涓婃槸鎴戠殑鏈鍒濆仛娉曪紝鍗矰FS錛屾悳绱紝鍦ㄦ悳绱㈣繃紼嬩腑娉ㄦ剰鍓灊錛屽啀鍔犱笂鏁伴噺鍙栨ā鐨勪紭鍖栵紝澶嶆潅搴︿篃涓嶉珮銆?nbsp;
Code for 1034(Dividing):
import java.util.*;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
public class Main {
public static int f[] = new int[20001*6]; // f[i]琛ㄧず瀹歸噺涓?i 鐨勮儗鍖呮渶澶氳兘瑁呯殑鐗╁搧鐨勪環鍊?br> public static int v[] = new int[7];
public static int num[] = new int[7];
public static int total,flag,key; //total涓?6 縐嶅ぇ鐞嗙煶鐨勬諱環鍊?錛宖lag涓烘爣璁幫紝涓鏃︿負1琛ㄧず鍙互鍙栧緱錛屽彲浠ヨ繑鍥炰簡
public static void onezeropack(int cost,int weight) { // 01鑳屽寘鍑芥暟錛屾敞鎰忓驚鐜槸浠巘otal 鍒?cost錛屼笉瑕佸紕鍙?br> int i;
for(i = total;i >= cost; i--) {
f[i] = Math.max(f[i],f[i-cost]+weight);
if(f[i] == key) { // 濡傛灉鍙互鍙栧緱鎬諱環鍊間竴鍗婏紝flag=1錛岃繑鍥?br> flag = 1;
return ;
}
}
}
public static void finishpack(int cost,int weight) {
int i;
if(flag==1) return ;
for(i = cost;i <= total; i++) {
f[i] = Math.max(f[i], f[i-cost]+weight);
if(f[i] == key) {
flag = 1;
return ;
}
}
}
public static void multipack(int cost,int weight,int amount) {
if(cost*amount >= total) {
finishpack(cost, weight);
return ;
}
if(flag==1) return ;
int k = 1;
while(k < amount) { // 璇ヨ繃紼嬪嵆涓哄皢涓浠剁墿鍝佹媶鍒嗕負1錛?錛?...2^k 浠剁墿鍝佽繘琛?1鑳屽寘榪囩▼
onezeropack(k*cost, k*weight);
amount -= k;
k *= 2;
}
onezeropack(cost*amount, weight*amount);
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int i,j,cas = 1;
while(true) {
Arrays.fill(f,0);
total = 0; flag = 0;
for(i = 1;i <= 6; i++) {
num[i] = in.nextInt();
v[i] = i;
total += i*num[i];
}
if(num[1]==0&&num[2]==0&&num[3]==0&&num[4]==0&&num[5]==0&&num[6]==0)
break;
if(total%2==1) flag = 0;
else {
key = total/2;
for(i = 1;i <= 6; i++)
multipack(i, i, num[i]);
}
System.out.println("Collection #"+cas+":");
if(flag==0) System.out.println("Can't be divided.");
else System.out.println("Can be divided.");
System.out.println();
cas++;
}
}
}
TOJ 1670錛?br> 澶ф剰鏄竴鍙板彇嬈炬満鏈塏涓揣甯侊紝姣忕璐у竵闈㈠間負 V[i] 錛屾暟閲忎負 num[i] , 緇欏嚭涓涓環鍊鹼紝涓哄湪榪欎釜浠峰間箣鍐?鍖呮嫭榪欎釜浠峰?鏈澶ц兘鍙栧緱澶氬ぇ銆?br>鍒嗘瀽錛氬吀鍨嬬殑澶氶噸鑳屽寘錛岀粰鍑虹殑浠峰煎嵆涓鴻儗鍖呭閲忥紝姣忕璐у竵涓轟竴縐嶇墿鍝侊紝浠峰間負v[i] , 鏁伴噺涓簄um[i]錛屾眰鑳藉緱鍒扮殑鏈澶т環鍊箋?br> 娉ㄩ噴灝變笉鍔犱簡錛屽弬鑰冧笂闈㈢殑紼嬪簭
Code for 1670(Cash Mechine):
#include <cstring>
int f[100002],v[12],num[12],cost[12];
int total,n;
int max(int a,int b){ return a>b?a:b;}
void OneZeroPack(int cost,int value){
int i,j;
for(i = total;i >= cost; i--)
f[i] = max(f[i],f[i-cost]+value);
}
void completePack(int cost,int weight){
int i;
for(i = cost;i <= total; i++)
f[i] = max(f[i],f[i-cost]+weight);
}
void multiPack(int cost,int weight,int amount){
if(cost*amount >= total){
completePack(cost,weight);
return ;
}
int k = 1;
while(k < amount){
OneZeroPack(k*cost,k*weight);
amount -= k;
k*=2;
}
OneZeroPack(cost*amount,amount*weight);
}
int main(){
int i,j,k;
while(scanf("%d%d",&total,&n)!= EOF){
memset(f,0,sizeof(f));
for(i = 1;i <= n; i++){
scanf("%d%d",&num[i],&cost[i]);
v[i] = cost[i];
}
for(i = 1;i <= n; i++)
multiPack(cost[i],v[i],num[i]);
printf("%d\n",f[total]);
}
}
]]>
Sample Input 1: Sample Input 2:
5 3 4 2
100 15
-75 20
-25 -10
-42 -15
42 0 2
0 1 1 3
1 2
3 4
Sample Output 1: Sample Output 2:
POSSIBLE IMPOSSILBE
#include <cstring>
struct Node{
int father,v,num;
}a[10002];
int find(int n){
int tep,m = n;
while(n != a[n].father)
n = a[n].father;
while(m != n){
tep = a[n].father;
a[n].father = n;
m = tep;
}
return n;
}
void Union(int root1,int root2){
int t1,t2;
t1 = find(root1),t2 = find(root2);
if(t1 == t2) return ;
else{
if(a[t1].v > a[t2].v){
a[t1].v += a[t2].v;
a[t2].father = t1;
}
else{
a[t2].v += a[t1].v;
a[t1].father = t2;
}
}
}
int main()
{
int n,m,i,j;
bool flag = false;
scanf("%d%d",&n,&m);
for(i = 0;i < n; ++i){
a[i].father = i,a[i].v = 0;
scanf("%d",&a[i].num);
}
while(m--){
scanf("%d%d",&i,&j);
Union(i,j);
}
for(i = 0;i < n; ++i){
int tep = find(i);
int tt = a[i].num;
a[i].num -= tt;
a[tep].num += tt;
}
for(i = 0;i < n; i++)
if(a[i].num != 0){
flag = true;
break;
}
if(flag) printf("IMPOSSIBLE\n");
else printf("POSSIBLE\n");
}
#include <cstring>
struct Node{
int father,v,num;
}a[10002];
int find(int n){
int m = n,tep;
while(n != a[n].father)
n = a[n].father;
while(m != n){
tep = a[m].father;
int tt = a[m].num;
a[m].num -= tt;
a[tep].num += tt;
a[m].father = n;
m = tep;
}
return n;
}
void Union(int root1,int root2){
int t1,t2;
t1 = find(root1),t2 = find(root2);
if(t1 == t2) return ;
else{
if(a[t1].v > a[t2].v){
a[t1].v += a[t2].v;
a[t2].father = t1;
}
else{
a[t2].v += a[t1].v;
a[t1].father = t2;
}
}
}
int main()
{
int n,m,i,j;
bool flag = false;
scanf("%d%d",&n,&m);
for(i = 0;i < n; ++i){
a[i].father = i,a[i].v = 0;
scanf("%d",&a[i].num);
}
while(m--){
scanf("%d%d",&i,&j);
Union(i,j);
}
for(i = 0;i < n; ++i)
if(a[i].num != 0) find(i);
for(i = 0;i < n; i++)
if(a[i].num != 0){
flag = true;
break;
}
if(flag) printf("IMPOSSIBLE\n");
else printf("POSSIBLE\n");
}
]]>
1
Sample Output:
4
E 3
I 3 1
E 3
I 1 2
E 3
I 2 4
E 3
O
0
2
3
5
Code:
#include <iostream>
#define M 20010
using namespace std;
struct Node{
int father,num;
}a[M];
void initial(int n){
int i;
for(i = 1;i <= n; i++){
a[i].father = i;
a[i].num = 0;
}
}
int find(int n){
int tep,m = n;
if(n == a[n].father) return n;
find(a[n].father); //閫掑綊鏌ユ壘n鐨勭鍏?/tt>
a[n].num += a[a[n].father].num; //n鐨勭洿闇瑕佹洿鏂?鍔犱笂n鐨勭埗浜茬殑鍊?
a[n].father = a[a[n].father].father;
}
int main()
{
int T,n,i,j,k;
char order[3];
scanf("%d",&T);
while(T--){
scanf("%d",&n);
initial(n);
while(scanf("%s",order)){
if(order[0]== 'O') break;
if(order[0] == 'E'){
scanf("%d",&k);
find(k);
printf("%d\n",a[k].num);
}
else{
scanf("%d%d",&j,&k);
int dis = abs(j-k)%1000;
a[j].num = dis; //璇ュ糳is涓簀鐨勫?/tt>
a[j].father = k; //k鎴愪負浜唈鐨勭埗浜?/tt>
}
}
}
}
]]>
a.mod(b) ; //a%b,鍏朵腑a鍜宐閮芥槸澶ф暟涓旂粨鏋滀負10榪涘埗錛屼笉綆鍜宐鏄粈涔堣繘鍒?br>String str= a.toString(base); //灝嗕竴涓ぇ鏁癮杞崲鎴恇榪涘埗鐨勫瓧絎︿覆
榪欎釜棰樺氨鐢ㄥ埌榪欎簺涓滆タ錛屼唬鐮佸氨涓嶈創浜嗐倊~
]]>
澶勭悊榪愮畻鍏堝悗鐨勬椂鍊欙紝鐢ㄦ爤瀹炵幇錛屽嵆鍚庤繘鍏堝嚭灝卞彲浠ヤ簡銆?br>Sample Input:
9
A 50 10
B 10 20
C 20 5
D 30 35
E 35 15
F 15 5
G 5 10
H 10 20
I 20 25
A
B
C
(AA)
(AB)
(AC)
(A(BC))
((AB)C)
(((((DE)F)G)H)I)
(D(E(F(G(HI)))))
((D(EF))((GH)I))
Sample Outout:
0
0
0
error
10000
error
3500
15000
40500
47500
15125
Code:
#include <cstdio>
#include <string>
#include <map>
using namespace std;
struct Matrx{
char id;
int x,y;
}a[30];
Matrx stack[100];
int main()
{
int i,j,k,n,ans;
bool flag;
map<char,int>mark;
scanf("%d",&n);
for(i = 1;i <= n; i++){
cin >> a[i].id;
scanf("%d%d",&a[i].x,&a[i].y);
mark[a[i].id] = i;
}
string str;
while(cin>>str){
ans = 0; flag = true;
int len = str.length();
int head,tail;
head = tail = 0;
for(i = 0;i <len; i++){
if(str[i] == '(')
continue;
else if(str[i] == ')'){ //pop
if(head == 1)
head --;
else if(head > 1){
int tx = stack[head-2].x;
int ty = stack[head-1].y;
if(stack[head-2].y != stack[head-1].x) flag = false;
ans += stack[head-2].x*stack[head-2].y*stack[head-1].y;
head -= 2;
stack[head].x = tx;
stack[head++].y = ty;
}
}
else{ // push
stack[head++] = a[mark[str[i]]];
}
}
if(!flag) printf("error\n");
else printf("%d\n",ans);
}
}
]]>
{{1},{2},{3}}
{{1,2},{3}}
{{1,3},{2}}
{{2,3},{1}}
{{1,2,3}}
鏈鍚庣殑緇撴灉鍙繚鐣欏悗鍥涗綅錛屽嵆mod10000錛?br>涓婄綉鏌ヤ簡涓嬶紝闆嗗悎鐨勫垝鍒嗙殑涓暟鍙仛bell鏁幫紝bell鏁板彲浠ラ掑綊姹傝В錛?br>bell[0] = 1;
bell [n + 1] = sigma(C(n,k))*(bell[k]); (0<=k<=n)
鐒惰岃繖涓鍗翠笉鍙互榪欐牱鍋氾紝鍥犱負N寰楄寖鍥存槸2000錛岃繖鏍峰仛蹇呭畾瓚呮椂錛屼簬鏄兂鍒頒簡DP錛屽鏋滅敤dp[i][j]琛ㄧずi涓暟
鍒掑垎鎴恓涓泦鍚堬紝閭d箞渚挎湁dp[i][j] = j * dp[i-1][j] + dp[i-1][j-1];( i > j )鐩磋鐞嗚В灝辨槸錛屽皢i涓暟鍒掑垎鎴恓涓泦鍚堢殑涓暟錛屽嵆涓篿-1涓暟鍒掑垎鍒癹涓泦鍚堢殑鏁幫紝鍐嶅皢澶氱殑閭d釜渚濇鏀懼埌j涓泦鍚堜腑錛屾墍浠ヤ箻浠錛屾垨鑰呮槸i-1涓暟鏀懼湪j-1涓泦鍚堜腑錛岀j涓泦鍚堜負絀猴紝鍒欐濂藉皢澶氱殑榪欎釜鏁版斁鍒拌繖涓泦鍚堜腑錛屼簬鏄究鏈変笂杈圭殑鐘舵佽漿縐繪柟紼嬨?br>Code:
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int map[2002][2002];
void DP()
{
memset(map,0,sizeof(map));
int i,j,k;
for(i = 0;i <= 2000; i++)
{
map[i][i] = 1;
map[i][1] = 1;
}
for(i = 0;i <= 2000 ;i++)
for(j = 0; j < i; j++)
map[i][j] = (j * map[i-1][j] + map[i-1][j-1])%10000;
}
int main()
{
int i,j,k,n;
DP();
while(scanf("%d",&n),n)
{
int ans = 0;
for(i = 0;i <= n; i++)
ans = (ans + map[n][i])%10000;
string str = "0000";
str[3] = ans%10+'0'; ans/=10;
str[2] = ans%10+'0'; ans/=10;
str[1] = ans%10+'0'; ans/=10;
str[0] = ans%10+'0'; ans/=10;
cout<<str<<endl;
}
}
#include<iostream>
#include<algorithm>
#define M 20002
using namespace std;
struct Node
{
int h,w;
}a[M];
int tail[M],n;
void LIS(int n)
{
int i,j,m,len,mid,low,high;
len=1;tail[1]=a[1].h;
for(i=2;i<=n;i++)
{
if(tail[len]<=a[i].h)
{
len++;
tail[len]=a[i].h;
}
else
{
low=1;high=len;
while(low<high)
{
mid=(low+high)/2;
if(a[i].h>=tail[mid]) low=mid+1;
else high=mid;
}
tail[low]=a[i].h;
}
}
printf("%d\n",len);
}
bool cmp(Node a,Node b)
{
if(a.w!=b.w)return a.w>b.w;
else return a.h<b.h;
}
int main()
{
int i,j,k,cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d%d",&a[i].w,&a[i].h);
sort(a+1,a+1+n,cmp);
LIS(n);
}
//system("pause");
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
int k,a[700],tail[800],b[860];
void LIS()
{
int i,j,m,n,len,mid,left,right;
n=1;
for(i=k-1;i>=1;i--) b[n++]=a[i];
n--;
len=1;tail[1]=b[1];
for(i=2;i<=n;++i)
{
if(b[i]>tail[len])
{
len++;
tail[len]=b[i];
}
else
{
left=1;right=len;
while(left<right)
{ //浜屽垎鏌ユ壘鎻掑叆鐨勪綅緗?nbsp;
mid=(left+right)/2;
if(tail[mid]<b[i]) left=mid+1;
else right=mid;
}
tail[left]=b[i]; //鎻掑叆
}
}
printf("%d\n",len);
}
int main()
{
int i,j,m,n;
while(1)
{
k=1;
scanf("%d%d",&i,&j);
if(i==-1&&j==-1) break;
a[k++]=j;
while(scanf("%d%d",&i,&j))
{
if(i==0&&j==0 )
{
LIS();
break;
}
a[k++]=j;
}
}
}