标签:ati members tput href logs www. turn pen seve
InputThere are several test cases.
In each test case:
The first line is a integer n (0 <n <=100,000),meaning the number of monks who joined Shaolin after the master did.(The master is not included).Then n lines follow. Each line has two integer k and g, meaning a monk‘s id and his fighting grade.( 0<= k ,g<=5,000,000)
The monks are listed by ascending order of jointing time.In other words, monks who joined Shaolin earlier come first.
The input ends with n = 0.
OutputA fight can be described as two ids of the monks who make that fight. For each test case, output all fights by the ascending order of happening time. Each fight in a line. For each fight, print the new monk‘s id first ,then the old monk‘s id.Sample Input
3 2 1 3 3 4 2 0
Sample Output
2 1 3 2 4 2
treap错误代码:
#include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=100010; int ans1,ans2,cnt; struct in { int L,R,V,rnd,pos; }tree[maxn]; void rturn(int &u) { int tmp=tree[u].L; tree[u].L=tree[tmp].R; tree[tmp].R=u; u=tmp; } void lturn(int &u) { int tmp=tree[u].R; tree[u].R=tree[tmp].L; tree[tmp].L=u; u=tmp; } void insert(int &u,int v,int ps) { if(u==0){ u=++cnt; tree[cnt].V=v; tree[cnt].pos=ps; tree[cnt].rnd=rand(); return ; } if(tree[u].V>v){ insert(tree[u].L,v,ps); if(tree[tree[u].L].rnd>tree[u].rnd) rturn(u); } else { insert(tree[u].R,v,ps); if(tree[tree[u].R].rnd>tree[u].rnd) lturn(u); } } void query(int u,int v) { if(u==0) return ; if(tree[u].V>v){ ans2=u;//大 query(tree[u].L,v); } else { ans1=u;//小 query(tree[u].R,v); } } int main() { int i,j,n,ps,v,root=1; while(scanf("%d",&n)){ if(n==0) return 0; memset(tree,0,sizeof(tree)); cnt=0; insert(root,1000000000,2); for(i=1;i<=n;i++){ scanf("%d%d",&ps,&v); v++; ps++; printf("%d ",ps-1); ans1=ans2=0; query(root,v); if(ans1!=0) j=ans1; else if(ans2!=0) j=ans2; if(ans1!=0&&ans2!=0){ if(v-tree[ans1].V<=tree[ans2].V-v) j=ans1; else j=ans2; } printf("%d\n",tree[j].pos-1); insert(root,v,ps); } } return 0; }
因为前两天用set实现了这道treap题,今天还是想偷懒。
#include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<set> #include<map> using namespace std; const int maxn=5000010; int a[maxn],b[maxn]; set<int>q; map<int,int>Map; int main() { int i,n,j,m,ps,u,v; while(~scanf("%d",&n)){ if(n==0) return 0; q.clear(); Map.clear(); q.insert(1000000000); Map[1000000000]=1; for(i=1;i<=n;i++) { scanf("%d%d",&u,&v); set<int> ::iterator it=q.lower_bound(v); if(it==q.begin()) ps=Map[*it]; else { j=*it; it--; if(j-v>=v-*it) j=*it; ps=Map[j]; } q.insert(v); Map[v]=u; printf("%d %d\n",u,ps); } } return 0; }
然后发现map居然也是排好序了的,黑人脸。
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> using namespace std; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); map<int,int>mp; int n; while(scanf("%d",&n) == 1 && n) { mp.clear(); mp[1000000000] = 1; int u,v; while(n--) { scanf("%d%d",&u,&v); printf("%d ",u); map<int,int>::iterator it = mp.lower_bound(v); if(it == mp.end()) { it--; printf("%d\n",it->second); } else { int t1 = it->first; int tmp = it->second; if(it != mp.begin()) { it--; if(v - it->first <= t1 - v) { printf("%d\n",it->second); } else printf("%d\n",tmp); } else printf("%d\n",it->second); } mp[v] = u; } } return 0; }
标签:ati members tput href logs www. turn pen seve
原文地址:http://www.cnblogs.com/hua-dong/p/7827822.html