1. 程式人生 > >Codeforces Round #516 (Div. 1) 題解

Codeforces Round #516 (Div. 1) 題解

直線 () force ans ces 相互 wap col efi

A.Oh Those Palindromes

直接排序之後輸出就行了。

證明的話直接跟據同一種字符最多能在多少個回文串中貢獻答案就行了。

#include <bits/stdc++.h>
#define for1(a,b,i) for(int i=a;i<=b;++i)
#define FOR2(a,b,i) for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll;
#define M 500005
int n;
char s[M];
int cnt[M];

int main () {
    //freopen("a.in","r",stdin);
scanf("%d%s",&n,s+1); for1(1,n,i) ++cnt[s[i]-a]; for1(0,25,i) for1(1,cnt[i],j) putchar(a+i); puts(""); }

B.Labyrinth

顯然如果向左走的多,向右走一定多,直接最短路就行了。

#include <bits/stdc++.h>
#define for1(a,b,i) for(int i=a;i<=b;++i)
#define FOR2(a,b,i) for(int i=a;i>=b;--i)
using namespace
std; typedef long long ll; #define M 2005 int n,m; char s[M]; bool vis[M][M]; int ax,ay,x_,y_,a[M][M]; int f[4]={0,0,1,-1},g[4]={1,-1,0,0}; struct node {int x,y;}dis[M][M]; int main () { // freopen("a.in","r",stdin); scanf("%d%d%d%d%d%d",&n,&m,&ax,&ay,&x_,&y_); for1(1,n,i) { scanf(
"%s",s+1); for1(1,m,j) a[i][j]=s[j]==.; } queue <node> q; q.push((node){ax,ay}); for1(1,n,i) for1(1,m,j) dis[i][j].x=2e9,dis[i][j].y=2e9; dis[ax][ay]=(node){0,0}; while (!q.empty()) { node t=q.front(); q.pop(); vis[t.x][t.y]=0; FOR2(3,0,i) { int tox=t.x+f[i]; int toy=t.y+g[i]; if(!tox||!toy||tox>n||toy>m||!a[tox][toy]) continue; if(dis[tox][toy].x<=dis[t.x][t.y].x+(i==1)) continue; dis[tox][toy]=dis[t.x][t.y]; if(i==0) ++dis[tox][toy].y; if(i==1) ++dis[tox][toy].x; if(!vis[tox][toy]) vis[tox][toy]=1,q.push((node){tox,toy}); } } int cnt=0; for1(1,n,i) for1(1,m,j) if(a[i][j]) { cnt+=dis[i][j].x<=x_&&dis[i][j].y<=y_; } cout<<cnt<<endl; }

C.Dwarves,Hats and Extrasensory Abilities

直接找個軸二分點就行了。

註意最後輸出直線的時候就不能過這個軸上的整點了,會重。

#include <bits/stdc++.h>
#define for1(a,b,i) for(int i=a;i<=b;++i)
#define FOR2(a,b,i) for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll;
inline int read() {
    int f=1,sum=0;
    char x=getchar();
    for(;(x<0||x>9);x=getchar()) if(x==-) f=-1;
    for(;x>=0&&x<=9;x=getchar()) sum=sum*10+x-0;
    return f*sum;
}

#define M 1000005
int n;
char s[10];

int main () {
    //freopen("a.in","r",stdin);
    cin>>n;
    cout<<"1 0"<<endl;
    cin>>(s+1);
    int co=s[1];
    int l=0,r=1e9,mid;
    for1(2,n,i) {
        mid=l+r>>1;
        cout<<1<<" "<<mid<<endl;
        cin>>(s+1);
        if(s[1]==co) l=mid;
        else r=mid;
    }
    mid=l+r>>1;
    cout<<0<<" "<<l<<" "<<2<<" "<<r<<endl;
}
/*
30 
0 1 1 0 1 1 0 0 0 0 
1 0 0 0 1 1 0 1 0 1 
0 0 0 1 1 1 0 1 1 1
*/

D.Candies for Children

沒想到可以按照$sqrt(n)$分類。

就是吃兩個的個數和吃的輪數是相互限制的。

所以就分這個討論就好了,最後一個人可以吃不完直接$++s$然後強制最後一個人吃兩個就行了。

#include <bits/stdc++.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define for1(a,b,i) for(int i=a;i<=b;++i)
#define FOR2(a,b,i) for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll;

ll n,k,x,y;

int main () {
//    freopen("a.in","r",stdin);
    cin>>n>>x>>y>>k;
    x=y-x+1+(y<x?n:0);
    y=n-x;
    
    
    if(x>k) return puts("-1"),0;
    if(k/n>n) {
        if(!y) swap(x,y);
        int ans=-1;
        for1(0,n,i) {
            int s=k%(n+i);
            if(s>=x&&s<=2*x&&i-s+x>=0&&i-s+x<=y) ans=i;
        }
        ++k;
        for1(ans+1,n,i) {
            int s=k%(n+i);
            if(s>x&&s<=2*x&&i-s+x>=0&&i-s+x<=y) ans=i;
        }
        printf("%d\n",ans);
    }
    else {
        ll ans=-1;
        if(k<=2*x) ans=min(k-x+1,x)+y;
        FOR2((k-x)/n,1,i) {
            ll c=k-x-n*i;
            ll a=c,b=-c,t;
            t=(c-1)/(i+1)+1;
            a-=i*t,b+=(i+1)*t;
            if(a<0||b>y) continue;
            t=min((y-b)/(i+1),a/i);
            a-=i*t,b+=(i+1)*t;
            if(a<=x) ans=a+b;
        }
        ++k;
        FOR2((k-x)/n,1,i) {
            ll c=k-x-n*i;
            ll a=c,b=-c,t;
            t=(c-1)/(i+1)+1;
            a-=i*t,b+=(i+1)*t;
            if(a<=0||b>y) continue;
            t=min((y-b)/(i+1),(a-1)/i);
            a-=i*t,b+=(i+1)*t;
            //這裏取max啊-_-
            if(a<=x) ans=max(ans,a+b);
        }
        printf("%lld\n",ans);
    }
}

Codeforces Round #516 (Div. 1) 題解