懒得复制,戳我戳我

Solution:

  • 首先考虑\(X=1\)的情况,我们其实只用用一下并查集把相等的点合为一个点
  • 然后后面的四个式子我们就可以用差分约束了,就拿\(X=2\)的情况来说吧,我们用\(S[i]\)表示\(i\)号小朋友要拿多少糖果,如果X=2, 表示第A个小朋友分到的糖果必须少于第B个小朋友分到的糖果,我们就可以写出式子\(S[A]<S[B]\),等价于\(S[A]+1<=S[B]\),这样我们就可以从\(A\)向\(B\)连一条权值为\(1\)的边。另外,如果是\(S[A]<=S[B]\),等价于\(S[A]+0<=S[B]\),连一条\(0\)边就可以
  • 还要注意的就是,数据有可能为几个联通块,所以我们要将没有进行过SPFA/Dijkstra的边为初始点开始单元最长路,还有要在最长路操作中注意判断正环,有正环输出\(-1\)
  • SPFA/Dijkstra里面不要memset,会超时到死,可以传递一个下表表示这是哪一次开始SPFA/Dijkstra,这样就不会了(就是因为这个错误我TLE的好惨)

    不过从5000ms到88ms超级爽啊
1. void SPFA(int k,int cs){}
2. vis[k]=cs;
3. if(vt[v]!=cs)TT[v]=1,vt[v]=cs;
else{
TT[v]++; if(TT[v]==n){wr=true;return;}
}

Code:

//It is coded by Ning_Mew on 3.28
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define RG register
using namespace std; const int maxn=1e5+10; int n,K;
int color[maxn];
int head[maxn],cnt=0;
struct Edge{
int nxt,to;LL dis;
}edge[maxn];
int ct=0;
LL dist[maxn],ans=0;
bool wr=false,be[maxn];
struct Pro{
int pl,x,y;
}pro[maxn]; int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x;
}
inline void add(int from,int to,LL dis){
edge[++cnt].nxt=head[from];
edge[cnt].to=to;
edge[cnt].dis=dis;
head[from]=cnt;
} inline int getf(int k){
if(color[k]==k)return color[k];
color[k]=getf(color[k]);
return color[k];
}
int TT[maxn],vt[maxn],vis[maxn],Q[maxn+7],front=0,tail=1,again=0;
inline void SPFA(int k,int cs){
front=0;tail=1;
Q[front]=k;
vis[k]=cs; dist[k]=1;be[k]=false;
while(front<tail+maxn*again){
if(front>maxn){front%=maxn;again--;}
int u=Q[front];front++;vis[u]=cs-1;
for(int i=head[u];i!=0;i=edge[i].nxt){
int v=edge[i].to;be[v]=false;
if(dist[v]<dist[u]+edge[i].dis){
dist[v]=dist[u]+edge[i].dis;
if(vis[v]!=cs){
if(dist[v]>dist[ Q[front] ]&&front-1>=0){
front--;Q[front]=v;
}else{
if(tail>maxn){again++;tail%=maxn;}
Q[tail]=v;tail++;
}
//if(tail>maxn){again++;tail%=maxn;}
//Q[tail]=v;tail++;
vis[v]=cs;
if(vt[v]!=cs)TT[v]=1,vt[v]=cs;
else{
TT[v]++; if(TT[v]==n){wr=true;return;}
}
}
}
}
}
}
int main(){
//scanf("%d%d",&n,&K);
n=read();K=read();
for(int i=1;i<=n;i++)color[i]=i;
for(RG int i=1;i<=K;i++){
int pl,x,y;
pl=read();x=read();y=read();
//scanf("%d%d%d",&pl,&x,&y);
if(pl==1){
int color1=getf(x),color2=getf(y);
if(color1!=color2)color[color1]=color2;
continue;
}
pro[++ct].pl=pl;pro[ct].x=x;pro[ct].y=y;
}
memset(be,false,sizeof(be));
for(RG int i=1;i<=n;i++){
color[i]=getf(i);
//cout<<i<<" color="<<color[i]<<endl;
be[color[i]]=true;
}
for(RG int i=1;i<=ct;i++){
int A=color[pro[i].x],B=color[pro[i].y];
if(pro[i].pl==2){add(A,B,1);continue;}
if(pro[i].pl==3){add(B,A,0);continue;}
if(pro[i].pl==4){add(B,A,1);continue;}
if(pro[i].pl==5){add(A,B,0);continue;}
}
memset(dist,-0x5f,sizeof(dist));
int INF=dist[0],cs=0;;
for(RG int i=1;i<=n;i++){
if(be[i]){cs++;SPFA(i,cs);}
//cout<<i<<endl;
if(wr==true){printf("-1\n");return 0;}
}
for(RG int i=1;i<=n;i++){
if(dist[color[i]]!=INF)ans+=dist[color[i]];
}
printf("%lld\n",ans);
return 0;
}

【题解】 [SCOI2011]糖果 (差分约束)的更多相关文章

  1. BZOJ 2330 SCOI2011糖果 差分约束

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2819  Solved: 820 题目连接 http://www ...

  2. P3275 [SCOI2011]糖果 && 差分约束(二)

    学习完了差分约束是否有解, 现在我们学习求解最大解和最小解 首先我们回想一下是否有解的求解过程, 不难发现最后跑出来任意两点的最短路关系即为这两元素的最短路关系. 即: 最后的最短路蕴含了所有元素之间 ...

  3. BZOJ2330:[SCOI2011]糖果(差分约束)

    Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...

  4. bzoj 2330 [SCOI2011]糖果 差分约束模板

    题目大意 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配 ...

  5. 洛谷P3275 [SCOI2011]糖果(差分约束)

    题目描述 幼儿园里有 $N$ 个小朋友,$lxhgww $老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...

  6. BZOJ 2330: [SCOI2011]糖果( 差分约束 )

    坑爹...要求最小值要转成最长路来做.... 小于关系要转化一下 , A < B -> A <= B - 1 ------------------------------------ ...

  7. [SCOI2011]糖果 (差分约束)

    题目链接 Solution 差分约束乱搞就好了. 需要注意的地方: 对于大于等于的直接联等于,应为等于,因为对于我满足条件而言,等于总是最好的. 对于等于的,注意要建双向边. 然后要开 \(long~ ...

  8. 【BZOJ2330】【SCOI2011】糖果 [差分约束]

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 幼儿园 ...

  9. BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status ...

  10. bzoj2330糖果——差分约束

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束,再建立一个源点0,向所有点连边权为1的边,表示每个人都会分到糖果: 答案较大 ...

随机推荐

  1. ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值

    用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器.最近才发现IActionFilter的OnActionExecuting方法,甚 ...

  2. kettle学习笔记(七)——kettle流程步骤与应用步骤

    一.概述 流程主要用来控制数据流程与数据流向 应用则是提供一些工具类 二.流程步骤 1.ETL元数据注入 类似Java中的反射,在设计时不知道文件名.文件位置等,在真正执行时才知道具体的一些配置等信息 ...

  3. 20155237 2016-2017-2《Java程序设计》课程总结

    20155237 2016-2017-2<Java程序设计>课程总结 预备作业1 刚接触Markdown的写法,初写博客,简单了解娄老师的教学方式. 预备作业2 怎么将学习java像学习一 ...

  4. 20155334 曹翔 Exp3 免杀原理与实践

    20155334 曹翔 Exp3 免杀原理与实践 小记:这次实验,困难重重,失败练练,搞得我们是心急如焚,焦头烂额,哭爹喊娘 一.基础问题回答 杀软是如何检测出恶意代码的? 每个杀软都有自己的检测库, ...

  5. 阿里云ECS服务器源配置

    前段时间领取了阿里云ECS免费试用6个月的福利,此处记录一下服务器源配置过程和服务器用户创建过程. 一.CentOS源配置 1.备份 mv /etc/yum.repos.d/CentOS-Base.r ...

  6. 《unity 3D 游戏开发 第二版》宣雨松 分享 pdf下载

    链接:https://pan.baidu.com/s/1LfRTGUmaE_lGdcmd6QiZkg 提取码:e2sn

  7. CentOS 7 Apache服务的安装与配置

    原文出处:http://blog.51cto.com/13525470/2070375 一.Apache简介 Apache 是一个知名的开源Web服务器.早期的Apache服务器由Apache Gro ...

  8. 【SE】Week3 : 四则运算式生成评分工具Extension&Release Version(结对项目)

    Foreword 此次的结对项目终于告一段落,除了本身对软件开发的整体流程有了更深刻的了解外,更深刻的认识应该是结对编程对这一过程的促进作用. 在此想形式性但真心地啰嗦几句,十分感谢能端同学能够不厌其 ...

  9. [2017BUAA软工助教]个人得分总表(至alpha结束)

    一.表 学号 第0次 week1 week2 week3 个人项目 附加1 结对项目 附加2 a团队 a团队得分 a贡献分 总分(不计) 总分(记) 15061119 7 9.5 12 9 45.75 ...

  10. 审评(HelloWorld团队)

    炸弹人:我觉得炸弹人的构想很不错,很像以前玩的qq堂,不过上课时讲的不够深入,我没有找到项目的思路,项目的介绍也很粗糙,后面说的目标很大,希望你可以实现,我觉得越多的功能,就意味着越多的工作量,总的来 ...