1. 程式人生 > >BZOJ2330 SCOI2011 糖果 【查分約束】

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個要求。幼兒園的糖果總是有

BZOJ2330SDOI2012糖果(差約束,SPFA)

【BZOJ2330】【SDOI2012】糖果 題面 題目描述 幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在