codeforces round 261

来源:互联网 发布:日本历史地震数据统计 编辑:程序博客网 时间:2024/06/07 12:55

A :给出正方形的两个点求出另外两个点,没有的话输出-1

B:数列的最大差,以及最大差的组合数量。如果最小和最大的数不同,数量直接相乘就是组合数量,如果两个数相同的话,数量为C(2,n)=n*(n-1)/2.

C:安排每个人的出行坐车情况,是没有两个人同坐一辆车d天。

    输出是一个n*d 的数列, 每一列代表一个学生的出行坐车情况。可以用K进制模拟,这样就保证任何两个人的情况不同,最大值为K^d.

   

/*************************************************************************    > File Name: 1003.cpp    > Author: cy    > Mail: 1002@qq.com     > Created Time: 2014/8/16 0:07:53 ************************************************************************/#include<iostream>#include<cstring>#include <algorithm>#include<cstdlib>#include<vector>#include<cmath>#include<stdlib.h>#include<iomanip>#include<list>#include<deque>#include<map>#include <stdio.h>#include <queue>#define maxn 50000+5#define inf 0x3f3f3f3f  #define INF 0x3FFFFFFFFFFFFFFFLL#define rep(i,n) for(i=0;i<n;i++) #define reP(i,n) for(i=1;i<=n;i++)#define ull unsigned long long #define ll long long#define cle(a) memset(a,0,sizeof(a))using namespace std;int val[1005][1005];int main(){freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int n,k,d;int i,j;   while( cin>>n>>k>>d){   int temp=1;   for(i=1;i<=d;i++){   temp*=k;   if(temp>=n)break;   }   if(temp<n){   cout<<-1<<endl;   }   else    {              cle(val);  k--;  for(i=2;i<=n;i++)  {  val[d][i]=val[d][i-1];  val[d][i]++;  int ip=0;  if(val[d][i]>k)  {  val[d][i]=0;  ip=1;  }  for(j=d-1;j>=1;j--)  {  val[j][i]=val[j][i-1];  val[j][i]+=ip;  if(val[j][i]>k)  {  val[j][i]=0;  }  else ip=0;  }  }  for(i=1;i<=d;i++)  {  for(j=1;j<=n;j++)  {  cout<<val[i][j]+1<<" ";  }  cout<<endl;  }   }   }   return 0;}


D:找出多少组的i,j,使得前i个数和a(i)相同的数的数量大于后j,和a(j)相同的数的数量。

    树状数组。

    从后往前,先统计(这个位置向前的值)后插入(这个位置向后的值),树状数组快速求比这个值小的数的数量就好了。

    但是我的程序莫名其妙用了,离散,表示很没用。

    

/*************************************************************************    > File Name: 1004.cpp    > Author: cy    > Mail: 1002@qq.com     > Created Time: 2014/8/16 1:21:38 ************************************************************************/#include<iostream>#include<cstring>#include <algorithm>#include<cstdlib>#include<vector>#include<cmath>#include<stdlib.h>#include<iomanip>#include<list>#include<deque>#include<map>#include <stdio.h>#include <queue>#define maxn 1111110+5#define inf 0x3f3f3f3f  #define INF 0x3FFFFFFFFFFFFFFFLL#define rep(i,n) for(i=0;i<n;i++) #define reP(i,n) for(i=1;i<=n;i++)#define ull unsigned long long #define ll long long#define cle(a) memset(a,0,sizeof(a))using namespace std;ll val[maxn];struct node{int v;int ip;int newv;int numm;int numn;};node tree[maxn];int sum1[maxn];int sum2[maxn];int lowbit(int x){return x&(-x);}void update(int x){for(int i=x;i<maxn;i+=lowbit(i)){val[i]+=1;}}ll getsum(int x){ll sum=0;int i=x;i--;for(;i>0;i-=lowbit(i)){sum+=val[i];}return sum;}int num[maxn];bool cmp(node a,node b){return a.v<b.v;}bool cm(node a,node b){return a.ip<b.ip;}map<int,int>mp;int main(){#ifndef ONLINE_JUDGE    freopen("in.txt", "r", stdin);    //freopen("out.txt", "w", stdout);#endifint i,j,k;int n,m;//freopen("in.txt","r",stdin);    cle(val),cle(num);while(cin>>n){mp.clear();m=0;rep(i,n){scanf("%d",&tree[i].v);tree[i].ip=i;}sort(tree,tree+n,cmp);rep(i,n){if(mp[tree[i].v]==0){mp[tree[i].v]=++m;tree[i].newv=m;}else{tree[i].newv=mp[tree[i].v];}}sort(tree,tree+n,cm);cle(sum1),cle(sum2);rep(i,n){sum1[tree[i].newv]++;tree[i].numm=sum1[tree[i].newv];}for(i=n-1;i>=0;i--){sum2[tree[i].newv]++;tree[i].numn=sum2[tree[i].newv];}update(tree[n-1].numn);ll ans=0;for(i=n-2;i>=0;i--){ans+=getsum(tree[i].numm);if(tree[i].numn==0)continue;update(tree[i].numn);}cout<<ans<<endl;}return 0;}


E:找出一条路径,路径满足权值增大的顺序,求最长的路径数量。

   dp比较弱,这个题就算是学习了。

   对路径进行dp,看别人代码也学习了不少的技巧~不错,

  

/*************************************************************************    > File Name: 1005.cpp    > Author: cy    > Mail: 1002@qq.com     > Created Time: 2014/8/17 10:30:01 ************************************************************************/#include<iostream>#include<cstring>#include <algorithm>#include<cstdlib>#include<vector>#include<cmath>#include<stdlib.h>#include<iomanip>#include<list>#include<deque>#include<map>#include <stdio.h>#include <queue>#define maxn 500000+5#define inf 0x3f3f3f3f  #define INF 0x3FFFFFFFFFFFFFFFLL#define rep(i,n) for(i=0;i<n;i++) #define reP(i,n) for(i=1;i<=n;i++)#define ull unsigned long long #define ll long long#define cle(a) memset(a,0,sizeof(a))#define mp make_pairusing namespace std;typedef pair<int,int>p;typedef pair<int,p>pi;vector <int>V;int dp1[maxn];int dp[maxn];pi val[maxn];int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);#endif    int i,j,k;    int n,m;while(cin>>n>>m){cle(dp1),cle(dp);rep(i,m){int u,v,c;cin>>u>>v>>c;u--,v--;val[i]=mp(c,mp(u,v));}sort(val,val+m);rep(i,m){j=i;while(j<m&&val[i].first==val[j].first){j++;}V.clear();for(k=i;k<j;k++){int u,v;u=val[k].second.first;v=val[k].second.second;dp1[v]=max(dp1[v],dp[u]+1);V.push_back(v);}int len=V.size();rep(k,len){dp[V[k]]=max(dp[V[k]],dp1[V[k]]);}i=j-1;}cout<<*max_element(dp,dp+n)<<endl;}    return 0;}

 

0 0
原创粉丝点击