博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

AtCoder Regular Contest 082

我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊……

C - Together

题意:把每个数加1或减1或不变求最大众数。

#include<cstdio>
#include<algorithm>
using namespace std;
 
 
int read_p,read_ca;
inline int read(){
    read_p=0;read_ca=getchar();
    while(read_ca<'0'||read_ca>'9') read_ca=getchar();
    while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
    return read_p;
}
int t[110000],n,a;
int main(){
    n=read();
    for (int i=1;i<=n;i++){
        a=read();
        t[a]++;t[a+1]++;t[a+2]++;
    }
    a=0;
    for (int i=0;i<=100100;i++) if (t[i]>a) a=t[i];
    printf("%d\n",a);
}
View Code

 

D - Derangement

题意:求把一个排列变成错排的最少操作数,操作是交换相邻俩位置。

#include<cstdio>
#include<algorithm>
using namespace std;
 
 
int read_p,read_ca;
inline int read(){
    read_p=0;read_ca=getchar();
    while(read_ca<'0'||read_ca>'9') read_ca=getchar();
    while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
    return read_p;
}
int t[110000],n,a=0;
int main(){
    n=read();
    for (int i=1;i<=n;i++){
        t[i]=read();
    }
    for (int i=1;i<n;i++)
    if (t[i]==i) a++,swap(t[i],t[i+1]);
    if (t[n]==n) a++;
    printf("%d\n",a);
}
View Code

 

E - ConvexScore

题意:一个凸包的价值为其$2^{内部点数}$求所以凸包价值之和。

题解:窝好蠢啊,居然没想到这个……$2^{内部点数}$其实就是把每个集合都统计了一遍,这样就只剩下直线的集合没被统计了。

代码还没写(不想补题)

 

F - Sandglass

题意:一沙漏初始上边那个为a,下边为X-a,每秒上边向下边掉一个,一些时刻会把沙漏倒过来,问某时刻的状态。

题解:反正就是个分段函数,而且只有3段。

#include<cstdio>
#include<algorithm>
#define MN 110000
#define int long long
using namespace std;

int read_p,read_ca;
inline int read(){
    read_p=0;read_ca=getchar();
    while(read_ca<'0'||read_ca>'9') read_ca=getchar();
    while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
    return read_p;
}
int n,m,X,K,T[MN],la=0,Q,t,a,l[MN],r[MN],L[MN],R[MN];
signed main(){
    X=read();
    K=read();
    l[0]=0;L[0]=0;r[0]=X;R[0]=X;
    for (int i=1;i<=K;i++){
        a=read();
        T[i]=a;
        l[i]=l[i-1];r[i]=r[i-1];
        L[i]=L[i-1]-(a-la);
        R[i]=R[i-1]-(a-la);
        if (L[i]<=R[i])
        if (R[i]<=0){
            l[i]=0;L[i]=X;r[i]=0;R[i]=X;
        }else{
            if (L[i]<0)
            l[i]-=L[i],
            L[i]=0;
            
            L[i]=X-L[i];R[i]=X-R[i];
        }else
        if (L[i]<=0){
            l[i]=0;L[i]=X;r[i]=0;R[i]=X;
        }else{
            if (R[i]<0)
            r[i]+=R[i],
            R[i]=0;
            
            L[i]=X-L[i];R[i]=X-R[i];
        }
        la=a;
    }
    
    /*for (int i=0;i<=K;i++)
    printf("%d %d %d %d %d\n",i,l[i],r[i],L[i],R[i]);*/
    Q=read();
    for (int i=1;i<=Q;i++){
        t=read();a=read();
        int _l=0,_r=K,mid;
        while (_l<_r){
            if (T[mid=_l+_r+1>>1]<=t) _l=mid;else _r=mid-1;
        }
        t-=T[_l];
        if (a<=l[_l]) a=L[_l];else if (a>=r[_l]) a=R[_l];else if (L[_l]==R[_l]) a=L[_l];else
        if (L[_l]<R[_l]) a=L[_l]+(a-l[_l]);else a=L[_l]-(a-l[_l]);
        
        a-=t;
        if (a<0) a=0;
        
        if (_l&1) a=X-a;
        
        printf("%lld\n",a);
    }
}
View Code

 

posted @ 2017-09-02 22:28  swm_sxt  阅读(305)  评论(0编辑  收藏  举报