2016 Multi-University Training Contest 2 题解(待续)

Acperience

公式题
考场贪心乱搞版本:

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
#define MAXN (100000+10)
int w[MAXN],w2[MAXN],b[MAXN];
ll Abs(ll x) {
    if (x<0) return -x; return x;
}
ll gcd(ll a,ll b){if (!b) return a;return gcd(b,a%b);}
int main()
{
//  freopen("A.in","r",stdin);
//  freopen(".out","w",stdout);
    int T=read();
    while(T--) {
        int n=read();
        ll c=0;
        For(i,n) {
            w[i]=read();
            if (w[i]<0) w[i]=-w[i];
            c+=w[i]*w[i];
        }
        c*=4*n;
        sort(w+1,w+1+n);
        ll p=0;

        ForD(i,n) {
            if (Abs(4*(p-w[i])*(p-w[i])-c)<Abs(4*(p+w[i])*(p+w[i])-c)) p-=w[i];
            else p+=w[i];
        }       
        p=Abs(p*p*4-c);
        ll q=4*n;
        ll g=gcd(p,q);
        p/=g,q/=g;
        printf("%lld/%lld\n",p,q);      

    }


    return 0;
}

Born Slippy

树形dp
fx=max(fy+wx opt wy)
opt 是and ,or ,xor中的一个
题目保证 wx216
和冬令营的某题类似(然而还是不会做)
g[a][b] 表示 wy 前8位为 a 时,opt(wx,wy)后8位 +fy 的最大值

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef unsigned int uint;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
#define MAXN (65540+10)
char s[10];
uint w[MAXN];
vi edges[MAXN];
ll ans=0;
inline uint opt(uint a,uint b) {
    if (s[0]=='X') return a^b;
    if (s[0]=='A') return a&b;
    return a|b;
}
int v[MAXN]={0};
uint g[256][256]={0},h[MAXN][256]={0};
void dfs(int x,int fa){ 
    uint dp=0,A=w[x]>>8,B=w[x]&(255);
    Rep(i,256) if (v[i]) dp=max(dp,g[i][B]+(opt(A,i)<<8));

    ans=(ans+(ll)x*((ll)dp+w[x])) %F;

    Rep(i,256) h[x][i]=g[A][i];
    v[A]++;
    Rep(i,256) g[A][i]=max(g[A][i] , dp + opt(B,i) );

    int sz=edges[x].size();
    Rep(i,sz) if (edges[x][i]!=fa) dfs(edges[x][i],x);

    Rep(i,256) g[A][i] = h[x][i];
    v[A]--;
}
int main()
{
//  freopen("B.in","r",stdin);
//  freopen(".out","w",stdout);
    int T=read();
    while(T--) {
        int n=read();
        cin>>s;
        For(i,n) cin>>w[i];
        ans=0;
        Fork(i,2,n) {
            int p=read();
            edges[p].pb(i);
            edges[i].pb(p);
        }
        dfs(1,-1);
        cout<<ans<<endl;
        For(i,n) edges[i].clear();      
    }   
    return 0;
}

Call It What You Want

挖坑

Differencia

挖坑

Eureka

极角排序,注意精度

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007LL)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
ll sqr(ll a){return a*a;}
ld sqr(ld a){return a*a;}
double sqr(double a){return a*a;}

ld PI = 3.141592653589793238462643383;
class P{
public:
    double x,y;
    P(double x=0,double y=0):x(x),y(y){}

    friend P operator- (P A,P B) { return P(A.x-B.x,A.y-B.y); }
    friend P operator+ (P A,P B) { return P(A.x+B.x,A.y+B.y); }
    friend P operator* (P A,double p) { return P(A.x*p,A.y*p); }
    friend P operator/ (P A,double p) { return P(A.x/p,A.y/p); }
    friend bool operator< (const P& a,const P& b) {return a.x<b.x||(a.x==b.x&& a.y<b.y);}

}; 
const double eps=1e-15;
int dcmp(double x) {
    if (fabs(x)<eps) return 0; else return x<0 ? -1 : 1; 
}
bool operator==(const P& a,const P& b) {
    return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y) == 0;
} 
typedef P V;

P read_point() {
    P a;
    scanf("%lf%lf",&a.x,&a.y);
    return a;   
} 
double angle(V v) {return atan2(v.y,v.x);}
#define MAXN (1000+10)
P a[MAXN];
double p[MAXN];
ll p2[MAXN];
int main()
{
//  freopen("E.in","r",stdin);
//  freopen(".out","w",stdout);
    int T=read();
    p2[0]=1;
    For(i,1005) p2[i]=mul(p2[i-1],2);
    while(T--) {
        ll ans=0;
        int n=read();
        For(i,n) a[i]=read_point();
        sort(a+1,a+1+n);
        For(i,n-1) {
            int sz=0,m=1;
            Fork(j,i+1,n) {
                if (a[i]==a[j]) m++; 
                else p[++sz]=angle(a[j]-a[i]);
            }
            p[0]=-10000;
            sort(p+1,p+1+sz);
            ll t=0,an=0;
            For(j,sz) {
                if (dcmp(p[j]-p[j-1])==0) {
                    t=(t*2LL%F+1LL)%F;
                } else {
                    upd(an,t);
                    t=1;
                }
            }
            upd(an,t);
            upd(ans,mul(an,sub(p2[m],1)) );
            if (m>1) upd(ans,sub(p2[m],1+m) );
            i=i+m-1;
        }
        cout<<ans<<endl;
    }

    return 0;
}

It’s All In The Mind

贪心

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll gcd(ll a,ll b){if (!b) return a;return gcd(b,a%b);}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
#define MAXN (100+10)
int n;
int a[MAXN];
int main()
{
//  freopen("i.in","r",stdin);
//  freopen(".out","w",stdout);
    int T=read();
    while(T--) {
        cin>>n;
        For(i,n) a[i]=-1;
        a[0]=100;
        a[n+1]=0;
        int m=read();
        while(m--) {
            int p=read(),v=read();
            a[p]=v;
        }
        For(i,2) if (a[i]==-1) {
            a[i]=a[i-1];
        }
        ForkD(i,3,n) if (a[i]==-1) a[i]=a[i+1];
        ll p=0,q=0;
        For(i,2) p+=a[i];
        For(i,n) q+=a[i];
        ll g=gcd(p,q);
        p/=g,q/=g;
        printf("%lld/%lld\n",p,q);
    }


    return 0;
}

Keep On Movin

注意把奇数长度的拆成1和偶数长度

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
ll a[100000+10];
ll st[100000+10];
int sz; 
int main()
{
//  freopen("k.in","r",stdin);
//  freopen(".out","w",stdout);
    int T=read();
    while(T--) {
        int n = read();
        bool fl=0; sz=0;
        ll t=0;
        For(i,n) {
            scanf("%d",&a[i]); 
            if (a[i]&1)  {
                fl=1;
                st[++sz]=a[i];
            } else t+=a[i];
        }
        if (!fl) {
            cout<<t<<endl;
            continue; 
        }
        For(i,sz) if (st[i]>1) {
            t+=st[i]-1;
            st[i]=1;
        }

        ll ans=0,l=0,r=1e9;
        while(l<=r) {
            ll m=(l+r)/2;
            ll m2=2*m+1;
            ll s=0;
            For(i,sz) if (st[i]<m2) s+=m2-st[i];
            if (s<=t) ans=m2,l=m+1;
            else r=m-1;
        }
        cout<<ans<<endl;
    }
    return 0;
}

La Vie en rose

暴力

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
#define MAXN (100000+10)
char s[MAXN],s2[MAXN];
int main()
{
//  freopen("l.in","r",stdin);
//  freopen(".out","w",stdout);
    int T=read();
    while(T--) {
        int n=read(),m=read();
        scanf("%s%s",s,s2);
        Rep(i,n-m+1) {
            bool fl=0,p=0;
            Rep(j,m) {
                if (!p) {
                    if (s[i+j]==s2[j] ) ;
                    else if (s[i+j]==s2[1+j]) p=1;
                    else {
                        fl=1;break;
                    }
                } else {
                    if (s[i+j]==s2[j-1]) p=0;
                    else {
                        fl=1;break;
                    }
                }
            }
            if (fl) putchar('0'); else putchar('1');
        }
        Rep(i,m-1) putchar('0');puts("");
    }


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值