UOJ 209 UER 6 票數統計

2021-07-14 13:53:25 字數 2093 閱讀 2400

原題鏈結

妹滋滋是乙個善於程式設計的女孩子。

但是某一天,她一不小心把 uoj 後台的票數統計程式寫錯了。

本來嘛在這種根本沒有什麼用的功能上出了 bug 也沒有什麼大關係,但是又有某一天,uoj 突然就開始搞全民公投了。

這可怎麼辦呢?如果這個訊息讓別人知道的話自己肯定會被查表,更不要說讓所有使用者重新來投一次票了。

作為乙個要強的女孩子,妹滋滋決定自力更生。

通過一些奧妙重重的方式,妹滋滋知道了一些關於這次全民公投的資訊。

這次全民公投一共有 n 位使用者排隊參加,編號為 1 到 n。每一位使用者要麼投了通過,要麼投了不通過。

有 mm 個二元組 (xi,yi),每個二元組給出這樣乙個資訊: 「前 xi位使用者中,恰好 yi 位投了通過」 和 「後 yi 位使用者中,恰好有 xi 位投了通過」 這兩句話中,至少有一句是成立的。

作為分析的第一步,她想要知道有多少種投票情況是滿足她所得到的資訊的。當然,可能所有投票情況都不滿足條件。

很顯然,當x>y時就是第二種情況,

而對於所有的x=y的情況,只有最大x是有用的,

所有我們列舉所有投票的人,這樣所有的對字尾的限制就變成了字首,

於是可以愉快的用c公式搞,

對於x=y,只要符合字首的情況+符合字尾的情況-兩個多符合的情況即可,

複雜度:o(

n2)

#include

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fod(i,a,b) for(int i=a;i>=b;i--)

using namespace std;

typedef long long ll;

const int n=5555,mxlongint=2147483640,mo=998244353;

int read(int &n)

int n,m,m1,c;

ll ans;

struct qqww

a[n];

ll c[n][n];

bool px(qqww a,qqww b)

ll ss(int m1)

}else

}if(a[i].s==-1)

if(w<0||q<0)return

0; if(!c[q-l][w-l1])return

0; l=q,l1=w;

}if(l1<=c&&l1+q-l>=c)

if(n-l

<0||m1-l1<0)ans=0;else ans=(ans*c[n-l][m1-l1])%mo;

ans=ans;

if(!ans)c1=0;

}else c1=0;

if(!c)return ans;

l=n+1,l1=e=0;

fod(i,m,1)if(a[i].s!=-1)

}else

}if(a[i].s==2)

if(w-l1<0||q<0)return

0; if(!c[l-q][w-l1])return

0; l=q,l1=w;

}if(l1<=c&&l1+l-q>=c)

if(n-l

<0||m1-l1<0)ans=0;else ans=(ans*c[l][m1-l1])%mo;

ans+=ans;

}else c2=0;

if(ans&&c1&&c2)

if(c*2>=n)ans-=(m1==n);

else

if(m1>=c*2)

ans=(ans*c[n-c-l][m1-l1-c])%mo;

ans-=ans;

}return ans%mo;

}int main

() read(_);

while(_--)

fo(i,mx,n)ans=(ans+ss(i))%mo;

printf("%d\n",(ans+mo)%mo);

}return

0;}

uoj 209 UER 6A 票數統計

給出n個數,每個數是0或1.再給出m個限制,每個限制 x,y 表示 前x個數中有y個1 或 後y個數中有x個1 求這樣的序列的個數。n 5000,m 1000 再一次被uer給虐了。其實這道題劼鏼爺已經講的很清楚了。撲通撲通跪下來 當x y的時候,很顯然已經確定這個限制是限制字首還是字尾的。當x y...