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;}
树状数组。
从后往前,先统计(这个位置向前的值)后插入(这个位置向后的值),树状数组快速求比这个值小的数的数量就好了。
但是我的程序莫名其妙用了,离散,表示很没用。
/************************************************************************* > 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
- codeforces round 261
- Codeforces Round #261 (Div. 2)
- Codeforces Round #261 (Div. 2)
- Codeforces Round #261 (Div. 2)
- Codeforces Round #261 (Div. 2)
- Codeforces Round #261 (Div. 2)
- Codeforces Round #261 (Div. 2)
- 【codeforces】Codeforces Round #363
- Codeforces Round #261 (Div. 2)总结
- Codeforces Round #261 (Div. 2)[ABCDE]
- 【索引】Codeforces Round #261 (Div. 2)
- Codeforces Round #261 (Div. 2) A
- Codeforces Round #261 (Div. 2) B
- Codeforces Round #261 (Div. 2) C
- Codeforces Round #261 (Div. 2)小记
- Codeforces Round #261 (Div. 2) D
- Codeforces Round #261 (Div. 2) E
- Codeforces Round #261 (Div. 2)题解
- hadoop在ubuntu 12.04系统上的安装
- C++ 基本类型(Primitive Type) 的(const reference type) 参数有何用处?
- linux设备驱动——输入子系统
- hdu 4902 Nice boat(树形结构-线段树)
- Java1.5若干新特性
- codeforces round 261
- spoj7258 Lexicographical Substring Search(SUBLEX),后缀自动机
- 关于SQL server的Update用法
- POJ 1185 炮兵阵地 (状态压缩DP)
- 指针函数与函数指针的区别
- 系统的移植小感
- Qt-时间
- KMP算法求next数组
- C++ STL相关容器详解