QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#196333 | #6962. Far Away from Home | yiyiyi# | AC ✓ | 1120ms | 162052kb | C++14 | 2.5kb | 2023-10-01 15:59:07 | 2023-10-01 15:59:07 |
Judging History
answer
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<bitset>
#include<set>
#define int long long
#define lowbit(x) x&(-x)
#define mp make_pair
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define per(i,n,x) for(int i=n;i>=x;i--)
#define forE(i,x) for(int i=head[x];i;i=nxt[i])
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int maxn=2e6+5;
const int maxm=2e6+5;
const int mod=998244353;
const int INF=1e18;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+(c-'0');
c=getchar();
}
return x*f;
}
struct BIT {
vector<int> s; int sz;
void clear(int SZ) {for(int i=0;i<=SZ+2;i++) s[i]=0;}
void build(int SZ) {sz = SZ + 5, s.resize(sz); return;}
void add(int x, int v) {for (; x < sz; x += (x & -x)) s[x] += v; return;}
int ask(int x) {int ret = 0; for (; x; x -= (x & -x)) ret += s[x]; return ret;}
}S,Q;
struct node{
int x;
vector<int> e;
}a[maxn];
vector<int> pos[maxn];
inline bool cmp(node x,node y) {return x.x<y.x;}
signed main()
{
int T=read();
while(T--)
{
int n=read(),m=read();
S.build(n);Q.build(n);
S.clear(n);Q.clear(n);
rep(i,1,n)
{
a[i].e.clear();
a[i].x=read();
int p=read();
rep(j,1,p) a[i].e.push_back(read());
}
rep(i,1,m) pos[i].clear();
sort(a+1,a+n+1,cmp);
rep(i,1,n) for(auto u:a[i].e) pos[u].push_back(i);
rep(i,1,m)
{
int siz=pos[i].size();
for(int j=0;j<siz-1;j++)
{
int l=pos[i][j],r=pos[i][j+1]-1;
if(l>r) continue;
int p1=l,p2=r+1,res=l;
while(l<=r)
{
int mid=(l+r)/2;
if(a[mid].x-a[p1].x<=a[p2].x-a[mid].x) l=mid+1,res=mid;
else r=mid-1;
}
S.add(p1,-a[p1].x);S.add(res+1,a[p1].x);
Q.add(p1,1);Q.add(res+1,-1);
S.add(res+1,a[p2].x);S.add(p2,-a[p2].x);
Q.add(res+1,-1);Q.add(p2,1);
// printf("%lld %lld %lld : %lld\n",i,p1,p2,res);
}
int p0=pos[i][0];
S.add(1,a[p0].x);S.add(p0,-a[p0].x);
Q.add(1,-1);Q.add(p0,1);
int p=pos[i][siz-1];
S.add(p,-a[p].x);S.add(n+1,a[p].x);
Q.add(p,1);Q.add(n+1,-1);
// printf("%lld : %lld %lld\n",i,Q.ask(4),S.ask(4));
}
int ans=INF;
rep(i,1,n)
{
// printf("%lld : %lld %lld\n",i,Q.ask(i),S.ask(i));
ans=min(ans,S.ask(i)+Q.ask(i)*a[i].x);
}
printf("%lld\n",ans);
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1120ms
memory: 162052kb
input:
5 99674 20 763240852 6 13 12 1 19 14 15 907986528 9 9 13 2 3 10 5 8 11 20 405330475 5 8 20 18 19 7 350664157 3 14 7 11 866108800 7 5 15 19 17 7 1 16 243752093 3 5 6 16 957293963 7 6 2 7 12 3 8 11 87866078 8 8 15 2 10 16 4 5 18 599501459 4 15 20 10 13 75898433 3 15 1 13 634860118 3 4 10 12 931882462 ...
output:
8461 225014484653807 4191726 32192409196439 2242332818199
result:
ok 5 lines