暑假集训day1

其实这是前天的事了。(现在时间回到两天前)

今天的主要内容是最短路和2-SAT

最短路我做了一题:水灾;题目详情见9018-1452

先bfs求出洪水漫延到每一个点的时间。

然后再跑一遍bfs求出最短路即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int INF=0x7fffffff;
int n,m,sx,sy,dx,dy,h=0,now=0;
int t[51][51],map[51][51]={0};
char c[51];
struct hs{int x,y,s;}q[10010];
int xx[4]={-1,0,0,1},yy[4]={0,-1,1,0};
void bfs(){
    while(now!=h){
        int x=q[now].x,y=q[now].y;now++;
        for(int i=0;i<4;i++){
            int nx=x+xx[i],ny=y+yy[i];
            if(nx>n||ny>m||nx<1||ny<1||map[nx][ny])continue;
            if((nx==dx&&ny==dy)||t[nx][ny]!=INF)continue;
            t[nx][ny]=t[x][y]+1;q[h].x=nx;q[h].y=ny;h++;
        }
    }
}
void BFS(){
    now=0;h=1;q[0].x=sx;q[0].y=sy;q[0].s=0;
    while(now!=h){
        int x=q[now].x,y=q[now].y,s=q[now].s;now++;
        for(int i=0;i<4;i++){
            int nx=x+xx[i],ny=y+yy[i];
            if(nx>n||ny>m||nx<1||ny<1||map[nx][ny]||s+1>=t[nx][ny])continue;
            map[nx][ny]=1;
            if(nx==dx&&ny==dy){printf("%d",s+1);return;}
            q[h].x=nx;q[h].y=ny;q[h].s=s+1;h++;
        }
    }
    printf("ORZ hzwer!!!");
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)t[i][j]=INF;
    for(int i=1;i<=n;i++){
        scanf("%s",c);
        for(int j=1;j<=m;j++){
            if(c[j-1]==‘D‘)dx=i,dy=j;
            else if(c[j-1]==‘S‘)sx=i,sy=j;
            else if(c[j-1]==‘X‘)map[i][j]=1;
            else if(c[j-1]==‘*‘){q[h].x=i;q[h].y=j;t[i][j]=0;h++;}
        }
    }
    bfs();BFS();
    return 0;
}

关于2-SAT有这样一题:Astronauts;题目详情见UVA1391或UVALive3713

这题就是简单的2-SAT模板

详情见代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
inline int read(){
    int num=0,t=1;char c=getchar();
    while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();}
    return num*t;
}
const int maxn=100010;
int n,m,mark[maxn*2],s[maxn*2],c;
vector<int> g[maxn*2];
void add(int x,int a,int y,int b){
    x=x*2+a;y=y*2+b;
    g[x^1].push_back(y);g[y^1].push_back(x);
}
bool dfs(int x){
    if(mark[x^1])return 0;
    if(mark[x])return 1;
    mark[x]=1;s[c++]=x;
    for(int i=0;i<g[x].size();i++)if(!(dfs(g[x][i])))return 0;
    return 1;
}
bool solve(){
    for(int i=0;i<n*2;i+=2){
        if(!mark[i]&&!mark[i+1]){
            c=0;
            if(!dfs(i)){
                while(c>0)mark[s[--c]]=0;
                if(!(dfs(i+1)))return 0;
            }
        }
    }
    return 1;
}
int tot,age[maxn];
int is_young(int x){
  return age[x]*n<tot;
}
int main() {
    while(1) {
    n=read();m=read();if(n+m==0)break;
    tot=0;for(int i=0;i<2*n;i++)g[i].clear();memset(mark,0,sizeof(mark));
    for(int i=0;i<n;i++)age[i]=read(),tot+=age[i];
        for(int i=1;i<=m;i++){
        int a,b;a=read();b=read();a--;b--;if(a==b)continue;
        add(a,1,b,1);if(is_young(a)==is_young(b))add(a,0,b,0);
    }
    if(!solve())puts("No solution.");
    else for(int i=0;i<n;i++)
        if(mark[i*2])puts("C");
        else if(is_young(i))puts("B");
        else puts("A");
    }
    return 0;
}

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

时间: 2024-10-11 12:37:13

暑假集训day1的相关文章

2019暑假集训DAY1(problem3.play)(单调栈思想)

题面 play 题目大意 这个位面存在编号为1~2N的2N个斗士,他们正为争夺斗士大餐展开R轮PVP,每个斗士i都有一个固有APM ai,和一个初始斗士大餐储量 bi.每轮开始前以及最后一轮结束之后,2N个斗士会重新按照各自斗士大餐的储量进行排序(斗士大餐储量相同时编号小的靠前),每轮中,第1名和第2名PVP,第3名和第4名PVP,……第2k-1名和第2k名PVP,第2N-1名和第2N名PVP.而每场一对一的PVP都非常无聊,总是两个斗士中APM高的获胜,另一方失败:或者APM相同的两方取得平手

2017暑假集训前总结和规划

距离大一进来已经一年了啊,感觉还是啥也不会,哎,太差了,总结一下这一年都学了写什么吧! 大一寒假开始专题,刷过的有:dp,dfs和bfs,数论(gcd拓展gcd,欧拉定理等等,但是中国剩余定理没学,等复习的时候再学吧),并查集,最短路(bellman-fprd,dijkstra,floyd-warshall,spfa),最小生成树(prim,kruskal),线段树,二分三分 大一下学期有:拓扑排序,基础计算几何(直线线段相交,快速排除实验,跨立实验),矩阵快速幂,博弈基础(nim博弈,威佐夫博

暑假集训0815

最近打了两场多校和一场中期比赛 中期比赛的话也就那么回事= =水题集合(从各种意义上 两场多校被各种虐,已经弱到谁都可以上(rbq)的程度了TOT 团队配合还要慢慢磨合,毕竟刚刚组队不久 这两次比赛有好几题都是差一点就想出来,毕竟还是图样 继续加油(shui)吧 还有就是一定要好好读题啊!最好读完题之后就手算一下数据,以防理解错题意.如果理解错了不会做就罢了,像中期比赛的时候读完题愉悦的打完代码才发现理解错题意了简直不能忍(论坑队友的正确姿势) Multi-University Training

暑假集训7.11 字符串回文暴力

#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned long long ull; #define MM(a,b) memset(a,b,sizeof(a)); const double eps = 1e-10; const int i

暑假集训0808

来HIT参加暑假集训也有将近一周了,一直什么都没写= =. 记一下今天的比赛吧,以后争取每天更新一篇总结. 我是弱比.只能出6题. A:POJ1417 很容易发现yes表示两个人是同一类,no是不同类,然后怎么判断方案是否唯一我就不会了...我是有多么的弱...类似于背包DP,就是用前i个大类填满j个人数的方案. B:HDU1711 裸KMP C:POJ 2503 一个字典的实现.很显然的Trie.(我就想说出题人就不能给个n么..读入麻烦死..) D:POJ2828  比赛的时候还是想的有问题

2017暑假集训~心路历程

2017年暑假集训的个人赛阶段已经结束了. 回想这7场比赛,前几场发挥的还可以. 但是第4场之后开始状态开始下滑.第4场是在TOJ上做的,题数马马虎虎,就是罚时有点多. 第5场的FOJ的比赛打得十分糟糕.因为并不熟悉这个OJ, 赛前测试工作也没有作足. 比赛的时候各种意想不到的CE,WA.这样一来我前两小时只过了一题. 不过最后两小时至少翻到了不至于垫底的位置…… 第6场发挥也不好,被一道树形DP搞住了(这应该是我的强项),卡了一个半小时发现自己题目读错了.结果还是想不出来……然后另一道贪心因为

暑假集训(2)第五弹 ----- Who&#39;s in the Middle(poj2388)

G - Who's in the Middle Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description FJ is surveying his herd to find the most average cow. He wants to know how much milk this 'median

暑假集训练习赛题解

比赛链接:http://acm.nyist.net/JudgeOnline/problemset.php?cid=205 对于第一道题 UFS(Union  Find  Set) ,请参见http://blog.csdn.net/u011632342/article/details/37814289,题目大意一样,解法一样,不过后台测试数据还没整太多,数据比较弱... 对于第二道题STR(STRing),本来是想着给大家"送福利"呢,可能由于我的题目表述能力不太好或者样例数据的特殊性或

ACM暑假集训总结

暑假集训总结 回想去年暑假集训,和boblee.yyd组队时,他们为了复习考研,只有我一人默默的在基地训练,再到今年和yj.cq组队,三人能在基地一起刷题训练.再回想去年暑假自己作为新人,只能抱着两位队友的大腿,到今年作为一队的成员,要挑起集训队的大梁.从去年的全俱乐部开黑只能压线过几场网络赛,再到今年的队伍间各自做题,照样能没什么压力的通过网赛.亲眼见证俱乐部由弱到强,由不为人知到众所周知,自己不仅感触颇多,也同样敬佩起当初办起这个俱乐部的创始人们. 作为一个刚刚接触OI就要面临高考的人,才刚