Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:再跪求这题的程序,高手救命啊!!!!! 我看了李的论文,没有离散化啊In Reply To:再跪求这题的程序,高手救命啊!!!!! 我看了李的论文,没有离散化啊 Posted by:pepsi_tju at 2005-08-04 00:18:11 > 我的邮箱是 tju87896001@163.com ,请把程序发给我看看吧(WA的也行,只要结构对) > 我绝对是为了学习线段树,不会COPY你的程序的!! > 再再跪啊啊~~~~~~~~~~~~~ > > > 线段树,你真的好难啊!!! 要好好消化~~~ 以下为我第一次ac的线段树,消化不完全产品,离散部分用了stl的map,所以比较慢 #include<cstdio> #include<cstdlib> #include<algorithm> #include<map> using namespace std; map<int,int>mp; struct node{int s,t,c;}t[61000]; int n,ct,i,j,ans,k,tn,xn,txn; int d[10010][2],x[21000]; char hash[10010]; void make_tree(int nd,int st,int ed) { if (nd>tn) tn=nd; //printf("nd=%d st=%d ed=%d\n",nd,st,ed); t[nd].s=st;t[nd].t=ed;t[nd].c=0; if (ed-st>1){ make_tree(nd+nd,st,(st+ed)/2); make_tree(nd+nd+1,(st+ed)/2,ed); } return ; } void insert_tree(int nd,int st,int ed,int col) { // printf("nd=%d st=%d ed=%d col=%d\n",nd,st,ed,col); if (t[nd].c!=col){ if (t[nd].s==st&&t[nd].t==ed){ t[nd].c=col; // printf("t[%d].c=%d\n",nd,col); return ;} int m=(t[nd].s+t[nd].t)/2; if (t[nd].c>0){ t[nd+nd].c=t[nd+nd+1].c=t[nd].c; // printf("t[%d].c=%d t[%d].c=%d\n",nd+nd,t[nd].c,nd+nd+1,t[nd].c); t[nd].c=-1; } if (m<=st) insert_tree(nd+nd+1,st,ed,col);else if (m>=ed) insert_tree(nd+nd,st,ed,col);else{ insert_tree(nd+nd,st,m,col); insert_tree(nd+nd+1,m,ed,col); } } return ; } void count_tree(int nd) { if (t[nd].c>0){ hash[t[nd].c]=1; // printf("hash[%d]=%d\n",t[nd].c,hash[t[nd].c]); } else{ if (nd+nd<=tn) count_tree(nd+nd); if (nd+nd+1<=tn) count_tree(nd+nd+1); } return ; } int main() { scanf("%d",&ct); while (ct--){ memset(d,0,sizeof(d));memset(x,0,sizeof(x)); memset(hash,0,sizeof(hash)); scanf("%d",&n);tn=xn=0;mp.clear(); for (i=0;i<n;i++){ scanf("%d%d",&d[i][0],&d[i][1]); x[xn++]=--d[i][0];x[xn++]=d[i][1]; } sort(x,x+xn);txn=0; for (i=0;i<xn;i++) if (mp.find(x[i])==mp.end()) mp[x[i]]=txn++; ans=0;xn=txn; make_tree(1,0,xn-1); // for (i=0;i<n;i++) printf("%d:%d %d:%d\n",d[i][0],mp[d[i][0]],d[i][1],mp[d[i][1]]); for (i=0;i<n;i++) insert_tree(1,mp[d[i][0]],mp[d[i][1]],i+1); count_tree(1); for (i=1;i<=n;i++) if (hash[i])ans++; printf("%d\n",ans); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator