BZOJ2330 SCOI2011 糖果 【查分約束】
BZOJ2330 SCOI2011 糖果
Description
幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的K個要求。幼兒園的糖果總是有限的,lxhgww想知道他至少需要準備多少個糖果,才能使得每個小朋友都能夠分到糖果,並且滿足小朋友們所有的要求。
Input
輸入的第一行是兩個整數N,K。
接下來K行,表示這些點需要滿足的關係,每行3個數字,X,A,B。
如果X=1, 表示第A個小朋友分到的糖果必須和第B個小朋友分到的糖果一樣多;
如果X=2, 表示第A個小朋友分到的糖果必須少於第B個小朋友分到的糖果;
如果X=3, 表示第A個小朋友分到的糖果必須不少於第B個小朋友分到的糖果;
如果X=4, 表示第A個小朋友分到的糖果必須多於第B個小朋友分到的糖果;
如果X=5, 表示第A個小朋友分到的糖果必須不多於第B個小朋友分到的糖果;
Output
輸出一行,表示lxhgww老師至少需要準備的糖果數,如果不能滿足小朋友們的所有要求,就輸出-1。
Sample Input
5 7
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
Sample Output
11
HINT
【資料範圍】
對於30%的資料,保證 N<=100
對於100%的資料,保證 N<=100000
對於所有的資料,保證 K<=100000,1<=X<=5,1<=A, B<=N
貌似是查分約束板子,但我寫的時候就沒看講解自己YY了,調了半天的RE和WA發現時陣列沒開夠和沒有開LL,然後GG,氣死了
把題目中的要求數量關係建成圖,把上、下範圍的約束轉化成邊權,然後就可以發現每一個點的最小值就是最長路,SPFA跑一下就好了
熱愛封裝
//查分約束
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define LL long long
LL read(){
LL ans=0,w=1;char c=getchar();
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')w=-1,c=getchar();
while (isdigit(c))ans=ans*10+c-'0',c=getchar();
return ans*w;
}
struct Edge{LL v,w,next;};
struct CFYS{
Edge E[N<<2];LL head[N],tot;
LL n,f[N],inq[N],vis[N];
CFYS(){
tot=0;
memset(head,0,sizeof(head));
memset(f,0,sizeof(f));
memset(vis,0,sizeof(vis));
}
void add(LL u,LL v,LL w){
E[++tot]=(Edge){v,w,head[u]};
head[u]=tot;
}
LL spfa(){
queue<LL> q;
q.push(0);
while(!q.empty()){
LL u=q.front();q.pop();
inq[u]=0;
for(LL i=head[u];i;i=E[i].next){
LL v=E[i].v;
if(f[v]<f[u]+E[i].w){
f[v]=f[u]+E[i].w;
if(++vis[v]>=n)return -1;
if(!inq[v]){
q.push(v);
inq[v]=1;
}
}
}
}
LL ans=0;
for(LL i=1;i<=n;i++)ans+=f[i];
return ans;
}
}cfys;
LL k;
int main(){
cfys.n=read();k=read();
for(LL i=1;i<=k;i++){
LL op=read(),x=read(),y=read();
if(x==y&&(op==2||op==4)){
printf("-1");
return 0;
}
if(op==1)cfys.add(y,x,0),cfys.add(x,y,0);
if(op==2)cfys.add(x,y,1);
if(op==3)cfys.add(y,x,0);
if(op==4)cfys.add(y,x,1);
if(op==5)cfys.add(x,y,0);
}
for(LL i=cfys.n;i>=1;i--)cfys.add(0,i,1);
printf("%lld",cfys.spfa());
return 0;
}
相關推薦
BZOJ2330 SCOI2011 糖果 【查分約束】
BZOJ2330 SCOI2011 糖果 Description 幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是
BZOJ 2330: [SCOI2011]糖果【差分約束】
2330: [SCOI2011]糖果 【題目描述】 傳送門 【題解】 這題就是差分約束的裸題,建邊然後刷正環就可以了。 程式碼如下 #include<cstdio> #include<cstring> #inclu
[BZOJ2330][SCOI2011]糖果(差分約束)
題目描述 傳送門 題解 差分約束系統,模型是很好建的,求最小值轉化成跑最長路。 把大於小於號都轉化為大於等於和小於等於。對於x=1的情況建立2個不等式就可以解決。 想著剛碼完資料結構就挑了
【差分約束】SCOI2011糖果 P3275 [SCOI2011]糖果
P3275 [SCOI2011]糖果 快noip了我還在幹什麼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 來我們看這道題 根據條件建圖, 因為求得是最小值, 所以要跑最長路qwq(這是我記住的QAQ 不想寫了讓我們直接看看題解吧! P3275 [SCOI2011]糖果(five20的題解) 有環
【差分約束】SCOI2011糖果
from line esp har org alt ans img i++ P3275 [SCOI2011]糖果 快noip了我還在幹什麽啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 來我們看這道題 根據條件建圖, 因為求得是最小值, 所以要跑最長路qwq(這是我記住
【洛谷3275】[SCOI2011] 糖果(差分約束系統入門題)
點此看題面 大致題意: 有\(N\)個小朋友,要求每個人都得到糖果,且每個人的糖果總數滿足一定的關係式,請你求出至少共分給小朋友們多少糖果。 關係式的轉換 首先,我們可以將題目中給定的式子進行轉換: \(A=B\):這個式子可以拆成\(A≥B\)和\(B≥A\),再轉換一下就變成了\(A-B
[luoguP3275] [SCOI2011]糖果(差分約束)
cli open inline none long cst aps ret 糖果 傳送門 差分約束裸題 但是坑! 有一個點是長為10W的鏈,需要逆序加邊才能過(真是玄學) 還有各種坑爹數據 開longlong ——代碼
Luogu - 1993 小K的農場 【差分約束】
判斷 article 分享圖片 比較 輸入輸出 image alt 一個 信息 題目描述 小 K 在 Minecraft 裏面建立很多很多的農場,總共 n 個,以至於他自己都忘記了每個 農場中種植作物的具體數量了,他只記得一些含糊的信息(共 m 個),以下列三種形式描 述
POJ1201 Intervals 【差分約束】
題目 cpp mem als 就是 AR algorithm const display 題目鏈接 POJ1201 題解 差分約束 令\(a[i]\)表示是否選擇\(i\),\(s[i]\)表示\(a[i]\)的前綴和 對\(s[i] \quad i \in [-1,500
bzoj 1731: [Usaco2005 dec]Layout 排隊布局【差分約束】
queue inf getch pac const ace size %d add 差分約束裸題,用了比較蠢的方法,先dfs_spfa判負環,再bfs_spfa跑最短路 註意到“奶牛排在隊伍中的順序和它們的編號是相同的”,所以\( d_i-d_{i-1}>=0 \),
UVA-11478 Halum【二分】【差分約束】
LINK1 LINK2 題目大意 給你一個n個點,m條邊的有向圖 有一種操作把所有到達這個點的邊全部減小d,把所有從從這個點出發的邊加上d 問最後是否可以讓所有邊的邊權最小值最大 如果可以無限大,輸出\(Infinite\),如果不能讓所有邊權非負,輸出\(No\ solution\)
洛谷P3275 [SCOI2011]糖果_差分約束_判負環
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; const int N=300000+3; const int I
【poj3169 Layout】【差分約束】【Bellman-Ford】
【連結】 【題意】 有N個點,其中有ml個限制條件:點a,點b,的最長距離為d,有md個限制條件,點a,點b,的最短距離為d;點按序號順序排,求第一個點到最後一個點的最長距離。 【思路】 記錄第i號牛的位置d[i],首先,牛是按標號排序的,有d[i]<=d[
【差分約束】POJ3159 Candies
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 39165 Accepted: 11023 Description During the kindergarte
【差分約束】POJ1201/LG SP116 Intervals
題意翻譯 區間取數 題目描述 有n個區間,在區間[ai,bi]中至少取任意互不相同的ci個整數。求在滿足n個區間的情況下,至少要取多少個正整數。 輸入輸出格式 輸入格式 多組資料。 第一行的一個整數T表示資料個數。對於每組資料,第一行包含一個整數
【差分約束】POJ1364/LG UVA515 king
這道題是個差分約束 King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14901 Accepted: 5248 Description Once, in one kin
bzoj 2330: [SCOI2011]糖果(差分約束)
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5172 Solved: 1658 [Submit][Sta
poj3169Layout【差分約束】
Language: Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9049 Accepted: 4327 Description Like everyone else, co
SCOI2011 糖果(差分約束)
【題目描述】 幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的K個要求。幼兒園的糖果總是有
【BZOJ2330】【SDOI2012】糖果(差分約束,SPFA)
【BZOJ2330】【SDOI2012】糖果 題面 題目描述 幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在