首页 > 代码库 > cf#261 div2 解题报告
cf#261 div2 解题报告
.....代码没什么可说的,主要是学习各路大神姿势
A题 化简化简水题,都告诉平行坐标轴了,数据还出了对角线,后面两个点坐标给的范围也不错
........和最优代码相比姿势有点混乱
#include <cstdio>int x[4],y[4];int abs(int n){ return n<0?-n:n;}int main(){ scanf("%d%d%d%d",x,y,x+1,y+1); int dx=abs(x[0]-x[1]); int dy=abs(y[0]-y[1]); if(dx*dy==0&&dx!=dy){ printf("%d %d %d %d\n",x[0]+dy,y[0]+dx,x[1]+dy,y[1]+dx); } else if(dx==dy&&dx!=0){ printf("%d %d %d %d\n",x[1],y[0],x[0],y[1]); } else printf("-1\n"); return 0;}
B:不愧我大s神,速度全球第一啊哈哈
#include <cstdio>#include <algorithm>using namespace std;int n;int maxt=-1,mint=0x7fffffff;long long maxn=0,minn=0;int main(){ scanf("%d",&n); long long ans; for(int i=0;i<n;i++){ int temp; scanf("%d",&temp); if(temp>maxt){ maxt=temp; maxn=1; } else if(temp==maxt)maxn++; if(temp<mint){ mint=temp;minn=1; } else if(temp==mint)minn++; } if(maxt==mint)ans=maxn*(minn-1)/2;//这句胡乱改对了 else ans=minn*maxn; printf("%d %I64d\n",maxt-mint,ans); return 0; }
被hack的一次出在long long
C:纯鸽笼,就是看看有没有n>k的情况就好,每次看这次分到一个鸽笼的数目
#include <cstdio>using namespace std;int n,k,d;int ind[1001];int main(){ scanf("%d%d%d",&n,&k,&d); for(int i=1;i<=1000;i++)ind[i]=i; int tn=1; for(int td=0;td<d;td++){tn*=k;if(tn>n)break;}//为了防爆int if(tn<n)puts("-1"); else for(int td=0;td<d;td++){ for(int i=0;i<n;i++){ printf("%d%c",ind[i]%k+1,i==n-1?‘\n‘:‘ ‘); ind[i]=(ind[i]+k-1)/k; } tn=(tn+k-1)/k; } return 0;}
D:
map统计+树状数组就好,看到了大神们各种姿势,排序是很不错的思路,但是其实用不着啦
太过注重于ij了所以赛中没a
每从右边(f(j)小)更新答案(sum(f(i)-1)到1)的时候把f(j)加进树状数组就行了
#pragma pack(1)#include <cstdio>#include <map>using namespace std;map<int,int> mp;int a[1000000],bit[1000000],pr[1000000];//看成1e5错一回long long ans;int n;int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",a+i); pr[i]=mp[a[i]]++; } for(int i=n-1;i>-1;i--){ for(int j=pr[i];j!=0;j-=(j&-j))ans+=bit[j]; for(int j=mp[a[i]]-pr[i];j<n;j+=(j&-j)){bit[j]++;} } printf("%I64d\n",ans); return 0;}
E:想用dij+判断条件水过去,其实是dp就好啦,要注意的是同一个cost值可能发生相互修改的情况,所以拷贝出来再拷贝回去
#include <cstdio>#include <algorithm>using namespace std;const int maxn=3e5+1;struct edge{ int f,t,c; bool operator <(const edge & e2) const { return c<e2.c; }}e[maxn];int n,m;int dp[maxn],tt[maxn],pre[maxn];int main(){ scanf("%d%d",&n,&m); for(int i=0;i<m;i++)scanf("%d%d%d",&e[i].f,&e[i].t,&e[i].c); sort(e,e+m); int j; for(int i=0;i<m;i=j){ int cnt=0; for(j=i;j<m&&e[j].c==e[i].c;j++){ pre[cnt]=dp[e[j].f]+1; tt[cnt++]=e[j].t; } while(cnt-->=0){ dp[tt[cnt]]=max(dp[tt[cnt]],pre[cnt]); } } int ans=0; for(int i=1;i<=n;i++)ans=max(ans,dp[i]); printf("%d\n",ans); return 0;}
这是更好的姿势,边dp,点更新
#include <cstdio>#include <algorithm>using namespace std;const int maxn=3e5+1;const int maxm=3e5+1;struct edge{ int f,t,c; bool operator <(const edge & e2) const { return c<e2.c; }}e[maxm];int n,m;int dp[maxm],tc[maxn];int main(){ scanf("%d%d",&n,&m); for(int i=0;i<m;i++)scanf("%d%d%d",&e[i].f,&e[i].t,&e[i].c); sort(e,e+m); int j=0; for(int i=0;i<m;i++){ while(e[j].c<e[i].c){ tc[e[j].t]=max(dp[j],tc[e[j].t]),j++; } dp[i]=tc[e[i].f]+1;//learning } int ans=0; for(int i=0;i<m;i++)ans=max(ans,dp[i]); printf("%d\n",ans); return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。