Codeforces Round #431 (Div. 2)

来源:互联网 发布:房卡 娄底放炮罚 源码 编辑:程序博客网 时间:2024/06/05 12:48

A题水题
B题 题意:给你一些点,问有没有两条平行线,所有点都在线上。
分析:鸽巢原理,因为一共有两条线,所以前三个点中,至少有两个点是一条线上的。所以我们分析讨论一下前面三个点就行了
c题 题目难懂?
题意:
给你个值,求合成的字符串为(多解)
比如s串aa ,t串aa要组成aaaa, 那么把这两个字符串拼接的花费为
∑c∈(′a′,′b′,′c′..′z′)f(s,c)*f(t,c)
f(s,c)为c字符在s中出现的次数。
这个题看懂题目之后就好做了,字符先选a,然后b…
d题
题意;在一个笛卡尔坐标系中,边界为(0,0),(w,0),(0,h),(w,h).x轴y轴上有一些点,他们会在t单位时间后沿垂直于相应坐标轴的正方向前进(如Y轴上的点,沿X轴的正方向前进),每个单位时间前进一个单位距离,如果两个点相撞,他们就改变成对方的方向。到边界之后会停下来,问最后点的坐标

分析:我们知道如果p-t相同的话,那么就一定会相撞。能不能直接排序,然后暴力呢?这样是不行的,因为如果y轴上的点和x轴上的点都可以相撞,时间复杂度就为5e4*5e4,,gg
画图可知,其实点的位置是可以确定下来的

PS:一定要头脑清晰。。

#include <iostream>#include <cstring>#include <cmath>#include <cstdio>#include <algorithm>#include <vector>using namespace std;const int maxn = 200005;int c[maxn];struct node{    int id,p;};struct point{    int x,y;}ans[maxn];vector <node> a[2][maxn];bool cmp(node a1,node a2){    return a1.p<a2.p;}int main(){    int n,w,h;    scanf("%d %d %d",&n,&w,&h);    for(int i=0;i<n;i++)    {        int g,p,t;        scanf("%d %d %d",&g,&c[i],&t);        node temp;        temp.id=i,temp.p=c[i];        a[g-1][c[i]-t+100000].push_back(temp);    }    for(int i=0;i<=200001;i++)    {        sort(a[0][i].begin(),a[0][i].end(),cmp);//x        sort(a[1][i].begin(),a[1][i].end(),cmp);//y        for(int j=0;j<a[0][i].size();j++)        {            if((a[0][i].size()-j-1)>=(a[1][i].size()))            {                point t1;                t1.x=a[0][i][j+a[1][i].size()].p;t1.y=h;                ans[a[0][i][j].id]=t1;            }            else {                int right = a[0][i].size()-j-1;                point t;t.x=w,t.y=a[1][i][right].p;                ans[a[0][i][j].id]=t;            }        }        for(int j=0;j<a[1][i].size();j++)        {            if((a[1][i].size()-j-1)<a[0][i].size()){                point t1;t1.x=a[0][i][a[1][i].size()-j-1].p;t1.y=h;                ans[a[1][i][j].id]=t1;            }            else            {                int heng=a[0][i].size();                point t;t.x=w,t.y=a[1][i][heng+j].p;                ans[a[1][i][j].id]=t;            }        }    }    for(int i=0;i<n;i++)        printf("%d %d\n",ans[i].x,ans[i].y);    return 0;}
原创粉丝点击