|  | 
				
					
			  
	
	
 
			
			
			     摘要: 题目大意:        输入给出三种操作:              1、add     x     y&n...  阅读全文 
			
			
			题目大意:有N头牛,站在X轴上,没有共点的情况,每个牛有一个听力值V(i),他们交流所消耗的最少volume为abs(X(i)-(X(j)))*MAX{V(i),V(j)}
 最后再求总和。
 由于数据量最大为20000,显然O(n^2)的算法会超时。先按V值进行从小到大排序可解决MAX的问题,最后就是对每头牛求V值小于他的权值了。
 对于第i个牛,在0~i-1中,用两个数状数组,a表示坐标小于x[i]的个数,b表示坐标小于x[i]的牛的坐标之和,另外c表示0~i-1中所有牛的坐标之和。
 
   1
  long long solve() 2
    { 3
  long long ans=0,c=dd[0].id; 4
  5
  update(a,dd[0].id,1); 6
  update(b,dd[0].id,dd[0].id); 7
   8
  long long p,q; 9
   for(int i=1;i<n;i++)  { 10
  p=get_sum(a,dd[i].id); 11
  q=get_sum(b,dd[i].id); 12
  ans+=dd[i].v*(dd[i].id*p-q+(c-q)-dd[i].id*(i-p)); 13
  update(a,dd[i].id,1); 14
  update(b,dd[i].id,dd[i].id); 15
  c+=dd[i].id; 16
  } 17
  return ans; 18
  } 
			
			
			     摘要: 题目大意:      有N个工件要在M个机器上加工,有一个N*M的矩阵描述其加工时间。      同一时间内每个机器只能加工一个工件,问加工完所有工件后,使得平均加工时间最小。   将工件作为二分图中X部的点,总共N个。   将每个机器拆成...  阅读全文 
			
			
			     摘要: 这是我有史以来写得最长的一个程序,前段时间就看了这个题,在网上搜了一下算法,当时看得还有点不太明白,大牛也都说这题代码太长不好写,开始写了一些,后面发现不会写了,就放下了。昨天又来看这个题,居然写出来了,不过还是花了我一个晚上的时间来调试,开始交一次结果就RE了,后来在网上找来了官方数据一个一个的运行才发现找圈DFS的时候陷入了死循环,加了一个标志变量,还是WA,后来反复看解思路才知道换边的时候每...  阅读全文 
			
			
			题目大意:从一点经过所有的边两次,且两次的方向不同,又回到起始点,典型的欧拉回路题
   1
  #include<iostream> 2
  using namespace std; 3
  #define N 10005 4
   struct node  { 5
  int v; 6
  bool flag; 7
  node *next; 8
  }; 9
  10
  node *dd[N]; 11
  node set[10*N]; 12
  int n,m; 13
  14
  void init() 15
    { 16
  memset(dd,0,sizeof(dd)); 17
  scanf("%d%d",&n,&m); 18
  int u,v; 19
   for(int i=1;i<=m;i++)  { 20
  scanf("%d%d",&u,&v); 21
  set[i].v=v; 22
  set[i].flag=false; 23
  set[i].next=dd[u]; 24
  dd[u]=&set[i]; 25
  26
  set[i+m].v=u; 27
  set[i+m].flag=false; 28
  set[i+m].next=dd[v]; 29
  dd[v]=&set[i+m]; 30
  } 31
  } 32
  33
  void dfs(int k) 34
    { 35
  node *p=dd[k]; 36
   while(p)  { 37
   if(p->flag==false)  { 38
  p->flag=true; 39
  dfs(p->v); 40
  } 41
  p=p->next; 42
  } 43
  printf("%d\n",k); 44
  } 45
  46
  int main() 47
    { 48
  init(); 49
  dfs(1); 50
  return 0; 51
  } 
			
			
			这是一道典型的欧拉回路的题,第一次做这种题,参考了一下别人的代码,结果WA了一晚上,最后照着别人的代码一步一步的改,最后才发现有存在x==y的情况真是杯具,浪费了一晚上的时间
 
   1
  #include<iostream> 2
  #include<algorithm> 3
  using namespace std; 4
  5
   struct node  { 6
  int v; 7
  int str; 8
  }; 9
  10
  node dd[50][2000]; 11
  bool mark[2000]; 12
  int stack[2000]; 13
  int d[50]; 14
  int size; 15
  int end; 16
  17
  18
  void dfs(int k) 19
    { 20
   for(int i=1;i<=dd[k][0].v;i++)  { 21
   if(!mark[dd[k][i].str])  { 22
  mark[dd[k][i].str]=true; 23
  dfs(dd[k][i].v); 24
  stack[++size]=dd[k][i].str; 25
  } 26
  } 27
  } 28
  29
  int main() 30
    { 31
  int x,y,z,start; 32
   while(cin>>x>>y&&y)  { 33
  memset(mark,false,sizeof(mark)); 34
  memset(stack,0,sizeof(stack)); 35
  memset(d,0,sizeof(d)); 36
  size=0; 37
  start=x,end=x; 38
  39
  start=min(x,start); 40
  41
  end=max(x,end); 42
  43
  for(int i=0;i<50;i++) 44
  dd[i][0].v=0; 45
   do  { 46
  end=max(end,x); 47
  end=max(end,y); 48
  cin>>z; 49
  d[x]++; 50
  d[y]++; 51
   52
  dd[x][0].v++; 53
  dd[x][dd[x][0].v].v=y; 54
  dd[x][dd[x][0].v].str=z; 55
  56
  dd[y][0].v++; 57
  dd[y][dd[y][0].v].v=x; 58
  dd[y][dd[y][0].v].str=z; 59
  }while(cin>>x>>y&&y); 60
  bool flag=false; 61
  for(int i=1;i<=end;i++) 62
  if(d[i]%2)    flag=true; 63
  if(flag) printf("Round trip does not exist.\n"); 64
   else  { 65
  dfs(start); 66
  67
  for(int i=size;i>0;i--) 68
  printf("%d ",stack[i]); 69
  putchar('\n'); 70
  } 71
  } 72
  return 0; 74
  } 75
  76
  
			
			
			题目大意:给定一个二叉树,求让它成为孩子结点值不大于父亲结点值,同时左孩子结点值小于右孩子结点值。用广搜建立二叉树,再后序遍历,求最长不下降子序列,我做了一点变化,将左右孩子交换后先序遍历后求最长不上升子序列。
 开始超时了,后来把队列用数组实现就行了,不过注意一下没有右孩子时,左孩子可以和父亲结点值相等。
 
   1
  //poj 3214 2
  #include<iostream> 3
  #include<queue> 4
  using namespace std; 5
  #define N 10000000 6
  7
   struct Tree  { 8
  int v; 9
  Tree *left; 10
  Tree *right; 11
   void init()  { 12
  left=0; 13
  right=0; 14
  } 15
  }; 16
  17
  Tree set[N],*p; 18
  int n,m,cot,len=1; 19
  int b[N]; 20
  Tree *myque[N]; 21
  22
  void dfs(Tree *q) 23
    { 24
  int x; 25
  x=q->v+cot,m++; 26
  //LIS 27
  int low=1,high=len,mid; 28
   while(low<=high)  { 29
  mid=(low+high)/2; 30
  if(b[mid]<x) high=mid-1; 31
  else low=mid+1; 32
  } 33
  b[low]=x; 34
  if(low>len) len++; 35
  36
  if(q->right) 37
  dfs(q->right); 38
   if(q->left)  { 39
  if(q->right) cot++; //存在左孩子时才将cot++ 40
  dfs(q->left); 41
  } 42
  } 43
  44
  int main() 45
    { 46
  int v; 47
  int low=0,high=0; 48
  n=0; 49
  scanf("%d",&m); 50
  set[0].init(); 51
  scanf("%d",&set[0].v); 52
  myque[high++]=&set[0]; 53
   while(scanf("%d",&v)!=EOF)  { 54
  p=myque[low++]; 55
  set[++n].init(); 56
  set[n].v=v; 57
  p->left=&set[n]; 58
  myque[high++]=p->left; 59
   if(scanf("%d",&v)!=EOF)  {  //注意可能不是满二叉树 60
  set[++n].init(); 61
  set[n].v=v; 62
  p->right=&set[n]; 63
  myque[high++]=p->right; 64
  } 65
  else break; 66
  } 67
  m=0,cot=0; 68
  dfs(&set[0]); 69
  printf("%d\n",m-len); 70
  return 0; 71
  } 72
  
			
			
			     摘要: 前段时间学会了trie树之后,今天终于学习了一下AC自动机,这个还是挺难学的,现在我还是有点不太懂,参照了网上的代码才把这道题给A了。让我自己背着写出来还不一定会写。这里有一篇比较好的介绍AC自动机的文章http://www.cppblog.com/mythit/archive/2009/04/21/80633.html先看一下这道题吧,大意是给我们一部字典和一个模式串,让我们求出字典中有多少个单...  阅读全文 
			
			
			又贡献了一版的WA和TLE一道题,本来不是很难,但是由于初始化有问题,一直RE。先说说这道题的思路吧,两次dfs进行缩点,缩点之后再深搜一次找出最长路径与缩点之后的顶点数相比,
 相等则输出Yes,否则输出No。
 
  #include<iostream> 
  using namespace std; 
  
   struct node  { 
  int v; 
  node *next; 
  }; 
  
  node pp[6005],qq[6005]; 
  node *dd[1005],*rd[1005]; 
  bool mark[1005]; 
  bool map[1005][1005]; 
  int cal[1005]; 
  int ret[1005]; 
  int n,m,ti; 
  
  void init() 
    { 
  memset(mark,false,sizeof(mark)); 
  memset(cal,0,sizeof(cal)); 
  memset(dd,0,sizeof(dd)); 
  memset(rd,0,sizeof(rd)); 
  memset(ret,0,sizeof(ret)); 
  memset(map,false,sizeof(map)); 
  } 
  
  void input() 
    { 
  int u,v,i; 
  scanf("%d%d",&n,&m); 
   for(i=0;i<m;i++)  { 
  scanf("%d%d",&u,&v); 
  pp[i].v=v; 
  pp[i].next=dd[u]; 
  dd[u]=&pp[i]; 
   
  qq[i].v=u; 
  qq[i].next=rd[v]; 
  rd[v]=&qq[i]; 
  } 
  } 
  
  void dfs(int k) 
    { 
  mark[k]=true; 
  node *p=dd[k]; 
   while(p)  { 
  if(!mark[p->v]) 
  dfs(p->v); 
  p=p->next; 
  } 
  cal[++ti]=k; 
  } 
  
   void rdfs(int k)  { 
  ret[k]=ti; 
  node *p=rd[k]; 
   while(p)  { 
  if(!ret[p->v]) 
  rdfs(p->v); 
   else if(ti!=ret[p->v])  { 
  map[ti][ret[p->v]]=true; 
  } 
  p=p->next; 
  } 
  } 
  
   int dfsr(int k)  { 
  int ans=0; 
   for(int i=1;i<=ti;i++)  { 
   if(map[k][i])  { 
  if(!cal[i]) 
  dfsr(i); 
  ans=max(ans,cal[i]); 
  } 
  } 
  cal[k]=ans+1; 
  return cal[k]; 
  } 
  
  int main() 
    { 
  int t,i; 
  scanf("%d",&t); 
   while(t--)  { 
  init(); 
  input(); 
  ti=0; 
  for(i=1;i<=n;i++) 
  if(!mark[i]) 
  dfs(i); 
   for(ti=0,i=n;i>0;i--)  { 
   if(!ret[cal[i]])  { 
  ti++; 
  rdfs(cal[i]); 
  } 
  } 
  int ans=0; 
  memset(cal,0,sizeof(cal)); 
   for(i=1;i<=ti;i++)  { 
  if(!cal[i]) 
  dfsr(i); 
  ans=max(ans,cal[i]); 
  } 
  if(ans==ti) printf("Yes\n"); 
  else printf("No\n"); 
  } 
  return 0; 
  } |