[Topcoder SRM 499]【Solution】

55555,当时在学校没法捉……

250

有n只兔子,其中k(k<=n)只说了话,说话的形式如:和我一样颜色的有A[i]只!

然后问,满足这些话的情况下,n最小能是多少。

就是A[i]一样的贪心组合在一起即可。

550

给定一个数组A[i](i=0~n-1),假设你操作的序列是B[i](i=0~m-1)。

初始时m=1,B[0]=0

然后有3种操作:

1、将某个B[i] +1

2、将某个B[i] -1

3、选一个i然后

for (int j=m;j>i;j–) B[j]=B[j-1];

m++;

然后问最少进行多少操作,B[i]能和A[i]一样。

只要注意到复制以后,i和后面就可以断绝联系,这个区间dp的形式还是很明显的,F[i,j,k]表示区间[i,j]由一个初始时B[i]=k的复制而成至少需要多少次操作,然后枚举复制的位置和复制的长度就可以转移了。O(n^5) TC服务器无压力T_T

还有一种神贪心:

int getMinimum(vector

int ret=lines[0]+lines.size()-1;

for (int i=1;i

 if (lines[i]>lines[i-1]) ret+=lines[i]-lines[i-1];

return ret;

}

暂时只证明了他的充分性,必要性不会证T_T

 

1000

这个我觉得是我见过最简单的1000了啊啊啊T_T。

注意它可以交换相邻两个,那么你想想冒泡排序吧,于是所有的顺序都可以排出来了。所以用数量就可以描述一个点。

Tarjan缩环(注意缩完以后已经是拓扑序的了),然后dp求最长路就行了。每个点权就是k!/(pA! * pB! *pC! *pD!) pA表示’A’的数量……

 

[POJ2451 Uyuw’s Concert]【例题】【半平面交】

给定一个10000*10000的区域,然后给出一些向量,要找一个最大的区域,区域中的点都满足在这个大区域内,并且对每个向量满足在其左手边。

就是裸的半平面交啊……看了ZZY的论文跟着写WA到半死。后来由叉姐精心指导下,围观了神奇的优化版,不再需要上下凸壳合并T_T(这就是ZZY那算法最容易错的地方了)

记录一下算法的流程:

一开始按atan2来极角排序,极角一样的两个半平面选择那个限制得最紧的那个,其它删掉。

然后就按顺序枚举每一个半平面把它们尝试都交起来,并用一个双端队列保存有效的半平面。

可见如果当前半平面如图所示,那么队列就要pop_back了。这个判定的标准是队尾两个半平面的交点不在当前半平面所需要的平面内。

而如果出现如图的半平面,队列就要pop_front了。这个的判定标准是队头两个半平面的交点在当前半平面所的需求之外。

然后还有一堆疑问。

1、G++ WA C++ AC

2、中间枚举删边时还必须先做pop_back再做pop_front,否则会WA。影响这个只有一种可能,就是队中只剩两个半平面,并且它们的交点在当前半平面的需求之外,先pop_front会是前面的被删掉,而先pop_back会是后面的被删掉。那么围观此图,容易发现pop_back才是正确的。

差不多就这样。

【CODE】

 constdouble eps=1e-9;
inline
int sign(double x){
    if (x<-eps) return -1;
    if (x> eps) return  1;
    return0;
}
struct TPoint{
    double x,y;
    inline
    TPoint operator + (TPoint oth){
        TPoint ret;
        ret.x=x+oth.x;
        ret.y=y+oth.y;
        return ret;
    }
    inline
    TPoint operator – (TPoint oth){
        TPoint ret;
        ret.x=x-oth.x;
        ret.y=y-oth.y;
        return ret;
    }
    inline
    doubleoperator ^ (TPoint oth){
        return x*oth.y-y*oth.x;
    }
};
struct TLine{
    TPoint p1,p2;
    double angle;
};

struct abcLine{
    double a,b,c;
};

inline
abcLine Get_Line(TPoint A,TPoint B){
    abcLine ret;
    ret.a=A.y-B.y;
    ret.b=B.x-A.x;
    ret.c=B.y*A.x-B.x*A.y;
    return ret;
}
inline
TPoint jiao(TLine AA,TLine BB){
    TPoint ret;
    abcLine A=Get_Line(AA.p1,AA.p2);
    abcLine B=Get_Line(BB.p1,BB.p2);
    ret.x=(A.b*B.c-A.c*B.b)/(A.a*B.b-B.a*A.b);
    ret.y=(A.c*B.a-A.a*B.c)/(A.a*B.b-B.a*A.b);
    return ret;
}

deque deque inline
bool cmp(TLine A,TLine B){
    int ret=sign(A.angle-B.angle);
    if (ret>0) returntrue;
    if (ret<0) returnfalse;
    if (sign((B.p2-B.p1)^(A.p1-B.p1))>=0) returntrue;
                                     elsereturnfalse;
}
inline
bool check(TLine p0,TLine p1,TLine p2){
    TPoint cross=jiao(p0,p1);
    return sign((p2.p2-p2.p1)^(cross-p2.p1))>0;
}

void solve(){
    int i;
    for (i=0;i    #define S Q.size()
    Q.clear();
    sort(L.begin(),L.end(),cmp);
    for (i=0;i      if (i==0 || sign(L[i].angle-L[i-1].angle)!=0) Q.push_back(L[i]);
    L=Q; Q.clear();
    for (i=0;i        while (S>=2 && !check(Q[S-2],Q[S-1],L[i])) Q.pop_back();
        while (S>=2 && !check(Q[0],Q[1],L[i]))     Q.pop_front();
        Q.push_back(L[i]);
    }
    while (S>=2 && !check(Q[S-2],Q[S-1],Q[0])) Q.pop_back();
    while (S>=2 && !check(Q[0],Q[1],Q[S-1])) Q.pop_front();
    #undef S
    convex.clear();
    if (Q.size()<2) return;
    for (int i=0;i      convex.push_back(jiao(Q[i],Q[(i+1)%Q.size()]));
}
inline
void add(double x1,double y1,double x2,double y2){
    TLine ret;
    ret.p1.x=x1;
    ret.p1.y=y1;
    ret.p2.x=x2;
    ret.p2.y=y2;
    L.push_back(ret);
}

int main(){
    double x1,y1,x2,y2;
    int n;
    scanf("%d",&n);
    L.clear();
    for (int i=0;i        scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
        add(x1,y1,x2,y2);
    }
    add(    0,    0,10000,    0);
    add(10000,    0,10000,10000);
    add(10000,10000,    0,10000);
    add(0,    10000,    0,    0);
    solve();
    double ans=0;
    if (Q.size()>2){
      for (int i=0;i        ans+=convex[i]^convex[(i+1)%convex.size()];
    }
    ans/=2;
    if (ans<0) ans=-ans;
    printf("%.1lfn",ans);
}

[UVA11408 Count DePrimes]【线性筛】【例题】

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2403

一个数认定为DePrimes当且仅当该数的所有素因子之和为素数。

比如说n=p1^k1 * p2^k2 * p3^k3 那么就要求p1+p2+p3为素数。

然后给出询问a,b,问[a,b]内有多少个这个数。2<=a,b<=5000000

当然这个题目本身暴力O(n lg n)的筛预处理,顺便算出因子和就可以过。

然后记得上次看到JZP神犇blog上的有提到线性筛( O(n) ),那么考虑用到这里。

这个线性筛的基本思想是让每个数字只被它的最小素因子筛到。

下面利用本题代码写个小介绍以防忘记。

void init(){

    int i,j;

    memset(low,0,sizeof(low));    //low[i]里存的是i的最小素因子,特别地,若i是素数,那么low[i]=0

    memset(sum,0,sizeof(sum));    //储存i的素因子和

    low[0]=low[1]=1;

    for (i=2;i<=5000000;i++){

        if (!low[i]) {pl[cnt++]=i; sum[i]=i;}  //i为素数,那么加入素数表,并令它的素因子和为i

        for (j=0;j

/*

这里(!low[i] || pl[j]<=low[i])就是最精髓的地方

这样保证了每次筛的新数pl[j]*i,其最小素因子是pl[j],

所以假如x不是素数,令low为x的最小素因子,则x只能以x/low * low这种形式被筛到

*/

            low*i]=pl[j];

            sum*i]=sum[i];

            if ((low[i] && pl[j]!=low[i]) || (!low[i] && i!=pl[j])) sum*i]+=pl[j];

        }

    }

    ret[0]=ret[1]=0;

    for (i=2;i<=5000000;i++) ret[i]=ret[i-1]+(!low[sum[i]]);

}

 

int main(){

    init();

    int a,b;

    while (1){

        scanf("%d",&a);

        if (a==0) break;

        scanf("%d",&b);

        printf("%dn",ret[b]-ret[a-1]);

    }

}

有了low这个数组,分解素因子也将能在O(lg n)的时间内完成。

气死我了……SRM498

哎,前两题应当都做出来了嘛。以为这次要涨rating了。

在插件里run了一下,对了就交了……谁知道他交的是之前编译的。

然后结束以后一看……发现程序怎么都不是那个样……

于是果断爆0。

5555555555555555555555555555555

5555555555555555555555555555555555555555555555555555555

55555555555555555555555555555555555555555555555555555555555

白做了……

今晚我估计都要失眠了……

RP+=INF.

坐等变灰。

 

【AC_CWJ_LCC】WF 2011 Practice #2 (坑爹比赛……)

这场比赛太过坑爹……

E题全世界(我指的是真的全世界)只有OpenGL Y。而且是1Y。

这个题目就是个约瑟夫问题,问最后3个死的是谁……

题目限定n>=5,实际上却有n=1以及n=2的情况……纯粹坑爹……

完全不知道如何输出。

经我们开小号暴力乱搞尝试各种输出未果……

我捉了3个题目。

A:属于送分模拟题,1Y了。好像除了小号,来参加的都Y了。

C:有两个通道,中间连着一个起飞跑道。输入n,接下来n个时间单位里两个通道会先分别加Ai,Bi部飞机。然后再飞走飞走一步飞机。问这两个通道最少要开多大。

n^2 dp 但是我的dp对那种通道上没飞机的情况下会疼……T_T,于是各种修修补补,总算Y了。

D:给定一个01串,求一个长度大于等于lower_bound的区间,使得Sum(s[i]=1)/区间长度 最大。

很Orz的题目。与斜率有很大关联……我看到有O(n)的,我n lg n的就算了>_<。反正真正理解斜率优化的,YY着就出来(其实我不理解都YY出来了)。

其实C和D都是不错的题目……

后来J题据lcc说又是坑爹数据

今晚SRM  O_O 又要被虐啦~

题目:

http://acm.hust.edu.cn:8080/judge/contest/standing2.action?cid=999