Codeforces Avito Code Challenge 2018

CF981A Antipalindrome(字符串+模拟)

#include 
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100
int n;
char s[N];
inline bool jud(int l,int r){
    for(int i=l,j=r;i<=j;i++,j--) if(s[i]!=s[j]) return 0;return 1;
}
int main(){
//  freopen("a.in","r",stdin);
    scanf("%s",s+1);n=strlen(s+1);
    for(int i=n;i>=2;--i)
        for(int j=1;j<=n;++j){
            if(j+i-1>n) break;
            if(!jud(j,j+i-1)){printf("%d\n",i);return 0;}
        }
    puts("0");
    return 0;
}

CF981B Businessmen Problems(map)

#include 
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,m;ll ans=0;
map<int,int>mp;
int main(){
//  freopen("a.in","r",stdin);
    n=read();
    for(int i=1;i<=n;++i){
        int x=read(),y=read();mp[x]=y;
    }m=read();
    for(int i=1;i<=m;++i){
        int x=read(),y=read();
        if(mp[x]) mp[x]=max(mp[x],y);
        else mp[x]=y;
    }map<int,int>::iterator it=mp.begin();
    while(it!=mp.end()){
        ans+=it->second;++it;
    }printf("%lld\n",ans);
    return 0;
}

CF981C Useful Decomposition(树+模拟)

#include 
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,du[N],cnt=0,x;
int main(){
//  freopen("a.in","r",stdin);
    n=read();
    for(int i=1;iint x=read(),y=read();
        du[x]++;du[y]++;
    }for(int i=1;i<=n;++i) if(du[i]>2) ++cnt,x=i;
    if(cnt>1){puts("No");return 0;}puts("Yes");
    if(cnt==0){
        for(int i=1;i<=n;++i) if(du[i]==1) x=i;puts("1");
        for(int i=1;i<=n;++i) if(du[i]==1){printf("%d %d\n",i,x);return 0;}
    }cnt=0;for(int i=1;i<=n;++i) if(du[i]==1) ++cnt;
    printf("%d\n",cnt);
    for(int i=1;i<=n;++i) if(du[i]==1) printf("%d %d\n",x,i);
    return 0;
}

CF981D Bookshelves(按位贪心+dp)

把n个正整数分成恰好k部分,使得每部分的和按位与起来最大。
从高往低按位贪心,f[i][j]表示前i位分j部分能否满足。
复杂度 O(n4) O ( n 4 )

#include 
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline ll read(){
    ll x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,K;
ll a[N],sum[N],bin[N],ans=0;
bool f[N][N];
int main(){
//  freopen("a.in","r",stdin);
    n=read();K=read();bin[0]=1;
    for(int i=1;i<=n;++i) a[i]=read(),sum[i]=sum[i-1]+a[i];
    for(int i=1;i<60;++i) bin[i]=bin[i-1]<<1;
    for(int ii=59;ii>=0;--ii){
        ans|=bin[ii];memset(f,0,sizeof(f));
        for(int i=1;i<=n;++i) f[i][1]=((sum[i]&ans)==ans);
        for(int j=2;j<=K;++j)
            for(int i=j;i<=n;++i)
                for(int k=j-1;kif(((sum[i]-sum[k])&ans)!=ans) continue;
                    f[i][j]|=f[k][j-1];
                }
        if(!f[n][K]) ans^=bin[ii];
    }printf("%I64d\n",ans);
    return 0;
}   

CF981E Addition on Segments(bitset+线段树)

有n个数,一开始均为0,给定m个区间加操作。
你可以任选一个操作的子集来操作,最后能得到的最大值有多少种呢?(1~n以内)
就是维护区间内的不同数。可以线段树+bitset来暴力搞。
但是不好下放,注意到操作之间的顺序是无所谓的,于是我们把操作都离线到每个节点上,最后从下往上做一遍。
复杂度 O(nlognn/32) O ( n l o g n n / 32 )

#include 
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 10010
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,m;
struct node{
    vector<int>a;
    bitset<10001>b;
}tr[N<<2];
inline void change(int p,int l,int r,int x,int y,int val){
    if(x<=l&&r<=y){tr[p].a.push_back(val);return;}
    int mid=l+r>>1;
    if(x<=mid) change(p<<1,l,mid,x,y,val);
    if(y>mid) change(p<<1|1,mid+1,r,x,y,val);
}
void dfs(int p,int l,int r){
    tr[p].b[0]=1;
    if(l!=r){
        int mid=l+r>>1;dfs(p<<1,l,mid);dfs(p<<1|1,mid+1,r);
        tr[p].b=tr[p<<1].b|tr[p<<1|1].b;
    }for(int i=0;iint x=tr[p].a[i];
        tr[p].b|=tr[p].b<int main(){
//  freopen("a.in","r",stdin);
    n=read();m=read();
    while(m--){
        int x=read(),y=read(),val=read();
        change(1,1,n,x,y,val);
    }dfs(1,1,n);int ans=0;
    for(int i=1;i<=n;++i) if(tr[1].b[i]) ++ans;
    printf("%d\n",ans);
    for(int i=1;i<=n;++i) if(tr[1].b[i]) printf("%d ",i);puts("");
    return 0;
}

你可能感兴趣的:(codeforces,暴力,模拟,STL,线段树,贪心,-----树-------)