QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#196333#6962. Far Away from Homeyiyiyi#AC ✓1120ms162052kbC++142.5kb2023-10-01 15:59:072023-10-01 15:59:07

Judging History

你现在查看的是最新测评结果

  • [2023-10-01 15:59:07]
  • 评测
  • 测评结果:AC
  • 用时:1120ms
  • 内存:162052kb
  • [2023-10-01 15:59:07]
  • 提交

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