码迷,mamicode.com
首页 > 其他好文 > 详细

cf#261 div2 解题报告

时间:2014-08-17 03:45:11      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:blog   os   io   数据   for   ar   div   代码   

.....代码没什么可说的,主要是学习各路大神姿势

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;
}

  

cf#261 div2 解题报告,布布扣,bubuko.com

cf#261 div2 解题报告

标签:blog   os   io   数据   for   ar   div   代码   

原文地址:http://www.cnblogs.com/xuesu/p/3917284.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!