QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#420224 | #7012. Rikka with An Unnamed Temple | Lynkcat | WA | 1377ms | 10000kb | C++20 | 3.5kb | 2024-05-24 15:33:36 | 2024-05-24 15:33:37 |
Judging History
answer
#include<bits/stdc++.h>
#define poly vector<int>
#define IOS ios::sync_with_stdio(false)
#define ll long long
#define mp make_pair
#define mt make_tuple
#define pa pair < int,int >
#define fi first
#define se second
#define inf 1e18
#define mod 1000000007
#define sz(x) ((int)((x).size()))
#define int ll
// #define N
using namespace std;
const int N=200005;
pa pre[100005][105],suf[100005][105];
pa tr[N<<2];
int n,m;
int w[N],c[N];
poly G[N],rG[N];
int p[N],ip[N];
int cnt;
int K,T;
pa E[N];
int ru[N];
void trans(pa &x,pa &y,int w)
{
if (x.se==0) return;
if (x.fi+w==y.fi) y.se=(y.se+x.se)%mod;
else if (x.fi+w>y.fi) y.fi=x.fi+w,y.se=x.se;
}
void build(int k,int l,int r)
{
tr[k]=mp(-inf,0);
if (l==r) return;
int mid=l+(r-l)/2;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
}
void update(int k,int l,int r,int L,int R,pa x)
{
if (L<=l&&r<=R)
{
trans(x,tr[k],0);
return;
}
int mid=l+(r-l)/2;
if (L<=mid) update(k<<1,l,mid,L,R,x);
if (R>mid) update(k<<1|1,mid+1,r,L,R,x);
}
pa query(int k,int l,int r,int L)
{
if (l==r) return tr[k];
int mid=l+(r-l)/2;
pa res=tr[k];
if (L<=mid)
{
pa x=query(k<<1,l,mid,L);
trans(x,res,0);
} else
{
pa x=query(k<<1|1,mid+1,r,L);
trans(x,res,0);
}
return res;
}
void BellaKira()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
cin>>w[i]>>c[i];
for (int i=1;i<=m;i++)
{
cin>>E[i].fi>>E[i].se;
G[E[i].fi].push_back(E[i].se);
rG[E[i].se].push_back(E[i].fi);
}
cin>>K>>T;
queue<int>q;
for (int i=1;i<=n;i++)
for (int j=0;j<K;j++)
pre[i][j]=suf[i][j]=mp(-inf,0);
for (int i=1;i<=n;i++) ru[i]=0;
for (int i=1;i<=m;i++)
ru[E[i].se]++;
for (int i=1;i<=n;i++)
if (!ru[i]) q.push(i);
pre[1][w[1]%K]=mp(c[1],1);
// cerr<<ru[n]<<endl;
while (!q.empty())
{
int u=q.front();q.pop();
p[++cnt]=u;ip[u]=cnt;
// for (int j=K-1;j>=0;j--)
// {
// if (pre[u][j].se)
// {
// cerr<<u<<","<<j<<": "<<pre[u][j].fi<<" "<<K<<" "<<T<<" "<<ru[300]<<endl;
// break;
// }
// }
for (auto v:G[u])
{
ru[v]--;
for (int j=0;j<K;j++)
trans(pre[u][j],pre[v][(j+w[v])%K],c[v]);
if (!ru[v]) q.push(v);
}
}
for (int i=1;i<=n;i++) ru[i]=0;
for (int i=1;i<=m;i++)
ru[E[i].fi]++;
for (int i=1;i<=n;i++)
if (!ru[i]) q.push(i);
suf[n][w[n]%K]=mp(c[n],1);
while (!q.empty())
{
int u=q.front();q.pop();
for (auto v:rG[u])
{
ru[v]--;
for (int j=0;j<K;j++)
trans(suf[u][j],suf[v][(j+w[v])%K],c[v]);
}
}
build(1,1,n);
for (int i=1;i<=m;i++)
{
auto [x,y]=E[i];
int l=ip[x],r=ip[y];
pa now=mp(-inf,0);
for (int j=0;j<K;j++)
{
if (pre[x][j].se==0||suf[y][(T-j+K)%K].se==0) continue;
pa tmp;
tmp.fi=pre[x][j].fi+suf[y][(T-j+K)%K].fi;
tmp.se=pre[x][j].se*suf[y][(T-j+K)%K].se%mod;
// cout<<x<<" "<<y<<" "<<tmp.fi<<".."<<tmp.se<<" "<<endl;
if (now.fi==tmp.fi) now.se=(now.se+tmp.se)%mod;
else
if (now.fi<tmp.fi) now.fi=tmp.fi,now.se=tmp.se;
}
if (l+1<=r-1) update(1,1,n,l+1,r-1,now);
}
for (int i=1;i<=n;i++)
{
pa now=query(1,1,n,ip[i]);
if (now.se==0) cout<<"-1\n";
else cout<<now.fi<<" "<<now.se<<'\n';
}
cnt=0;
for (int i=1;i<=n;i++) poly().swap(G[i]),poly().swap(rG[i]),ru[i]=0;
}
signed main()
{
// freopen("1.out","w",stdout);
IOS;
cin.tie(0);
int T=1;
cin>>T;
while (T--)
{
BellaKira();
}
}
/*list:
1.mod 998244353 or 1e9+7 or ???
2.N
3.duipai shuju xingtai duoyidian
...
*/
详细
Test #1:
score: 100
Accepted
time: 3ms
memory: 10000kb
input:
1 4 5 1 2 2 3 3 4 4 2 1 2 1 3 2 4 3 4 1 4 5 3
output:
-1 8 1 -1 -1
result:
ok 4 lines
Test #2:
score: -100
Wrong Answer
time: 1377ms
memory: 8832kb
input:
840 300 2000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1...
output:
-1 26 19069 26 496 26 39848 26 4480599 26 362321 26 2196607 26 987972 26 1691477 -1 26 480938 26 3131998 26 4480599 26 39848 26 59401 26 3924855 26 29476 -1 26 2497033 26 5885768 26 1914003 26 6529 26 4480599 26 19069 26 5885768 26 480938 26 52 26 502046 -1 26 362321 26 502046 26 208886 26 583196 26...
result:
wrong answer 2nd lines differ - expected: '26 4598303', found: '26 19069'