QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#51056#859. CivilizationstricyzhkxAC ✓1524ms47440kbC++142.8kb2022-09-30 13:06:002022-09-30 13:06:02

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-09-30 13:06:02]
  • 评测
  • 测评结果:AC
  • 用时:1524ms
  • 内存:47440kb
  • [2022-09-30 13:06:00]
  • 提交

answer

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,mx[500010],mn[500010],a[510][510],p[510][510],sum[250010],cnt[250010],len[250010],t[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
multiset<int> st[500010];
struct Arr
{
	vector<int> legal;
	int tot,c[500010],pos[500010];
	void init(int t)
	{
		tot=t;legal.clear();
		for(int i=0;i<=tot;i++) pos[i]=-1,c[i]=0;
	}
	void Inc(int i)
	{
		if(!c[i]) pos[i]=legal.size(),legal.push_back(i);
		c[i]++;
	}
	void Dec(int i)
	{
		if(c[i]==1)
		{
			swap(legal[pos[i]],legal.back());pos[legal[pos[i]]]=pos[i];
			legal.pop_back();pos[i]=-1;
		}
		c[i]--;
	}
}Ar;
void pushup(int i)
{
	if(st[i].empty()) mn[i]=1e9,mx[i]=-1e9;
	else mn[i]=*st[i].begin(),mx[i]=*--st[i].end();
}
void Insert(int i)
{
	if(!cnt[i]) return;
	Ar.Inc(len[i]);st[len[i]].insert(sum[i]);
	pushup(len[i]);
}
void Erase(int i)
{
	if(!cnt[i]) return;
	Ar.Dec(len[i]);st[len[i]].erase(st[len[i]].find(sum[i]));
	pushup(len[i]);
}
ll query(ll A,ll B,ll C)
{
	ll ans=-1e18;
	for(int l:Ar.legal)
	{
		if(st[l].empty()) continue;
		ll k=A+C*l,b=B*l;
		ans=max(ans,max(k*mn[l]+b,k*mx[l]+b));
	}
	return ans;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				scanf("%d",&a[i][j]);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				scanf("%d",&p[i][j]),cnt[p[i][j]]++,sum[p[i][j]]+=a[i][j];
		for(int i=1;i<n;i++)
			for(int j=1;j<=n;j++)
				if(p[i][j]!=p[i+1][j])
					len[p[i][j]]++,len[p[i+1][j]]++;
		for(int i=1;i<=n;i++)
			for(int j=1;j<n;j++)
				if(p[i][j]!=p[i][j+1])
					len[p[i][j]]++,len[p[i][j+1]]++;
		Ar.init(2*n*n);
		for(int i=0;i<=2*n*n;i++) st[i].clear(),mn[i]=1e9,mx[i]=-1e9;
		for(int i=0;i<n*n;i++) Insert(i);
		int q;
		scanf("%d",&q);
		while(q--)
		{
			int x,y,z;
			ll A,B,C;
			scanf("%d%d%d%lld%lld%lld",&x,&y,&z,&A,&B,&C);
			vector<int> vec={p[x][y],z};
			for(int i=0;i<4;i++)
			{
				int tx=x+t[i][0],ty=y+t[i][1];
				if(tx>=1 && tx<=n && ty>=1 && ty<=n) vec.push_back(p[tx][ty]);
			}
			sort(vec.begin(),vec.end());
			vec.erase(unique(vec.begin(),vec.end()),vec.end());
			for(int i:vec) Erase(i);
			for(int i=0;i<4;i++)
			{
				int tx=x+t[i][0],ty=y+t[i][1];
				if(tx<1 || tx>n || ty<1 || ty>n) continue;
				if(p[tx][ty]!=p[x][y]) len[p[tx][ty]]--,len[p[x][y]]--;
			}
			sum[p[x][y]]-=a[x][y];cnt[p[x][y]]--;
			p[x][y]=z;
			sum[p[x][y]]+=a[x][y];cnt[p[x][y]]++;
			for(int i=0;i<4;i++)
			{
				int tx=x+t[i][0],ty=y+t[i][1];
				if(tx<1 || tx>n || ty<1 || ty>n) continue;
				if(p[tx][ty]!=p[x][y]) len[p[tx][ty]]++,len[p[x][y]]++;
			}
			for(int i:vec) Insert(i);
			printf("%lld%c",query(A,B,C)," \n"[!q]);
		}
		for(int i=0;i<=2*n*n;i++) sum[i]=cnt[i]=len[i]=0;
	}
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 3ms
memory: 27212kb

input:

1
2
1 2
3 4
1 1
2 2
6
2 2 1 1 -1 0
1 2 2 1 2 -1
2 1 3 0 1 -1
1 2 3 2 0 0
1 1 3 1 1 1
2 2 3 -1 -1 -1

output:

5 -7 -2 10 20 -10

result:

ok 6 numbers

Test #2:

score: 0
Accepted
time: 290ms
memory: 27392kb

input:

5000
13
58 69 -65 -29 -100 3 26 -29 73 -29 -93 33 73
-77 -76 69 19 -77 -61 59 -15 85 81 -20 73 72
60 -46 -100 -59 -79 -74 -94 41 -24 -28 -5 36 70
-49 -59 -11 44 26 38 -73 92 -16 -37 -84 86 90
-19 9 -30 19 -24 88 46 -80 98 -75 14 -77 55
-41 22 -71 -75 78 -97 9 -99 95 30 41 -30 72
-31 -15 14 99 -98 -1...

output:

42103747013412 35680188991650 -6713336103808 -11059164282756 -1668545181184 -8186426524853 39582599038173 38802048647760 5920723833015 -21684163594486 -16595070672095 -11701923512925 -3008229643548 -18937722770187 56407046298711 71796328172997 -6315561061725 -24088994837750 -22482313580650 545583443...

result:

ok 174760 numbers

Test #3:

score: 0
Accepted
time: 1524ms
memory: 47440kb

input:

2
500
34 47 -56 82 -99 2 82 11 39 -97 60 -10 -100 -55 -35 10 -40 60 -28 -77 -6 50 -44 -89 54 -41 -10 -97 -99 84 32 70 -4 8 65 -63 -35 82 49 -54 14 86 8 -89 -80 53 39 88 0 -21 66 -64 -95 13 22 -71 55 100 -47 25 -99 -48 20 96 -51 -36 -69 -25 -75 12 -52 32 90 -15 2 0 80 -16 -6 -37 -4 86 77 1 99 -45 98 ...

output:

3803944835096 14643945957494 86844324396 14134081642428 23365258674231 14366240146112 16003972712236 -1312148321120 15052574522629 -1038900390882 -1844962440900 -1547048075848 -709863397534 -933621408796 18767756935516 8688763765136 -1159725720058 -975612623034 -516745232422 -657752127188 1274638936...

result:

ok 200000 numbers

Test #4:

score: 0
Accepted
time: 726ms
memory: 40032kb

input:

2
500
-32 97 -40 -3 -56 71 59 -46 -65 -35 34 96 31 23 -13 -49 -36 -52 -26 -25 -47 -5 -100 -15 87 -31 -56 -67 62 -98 -91 21 73 -98 7 100 -37 93 67 100 -84 -15 -87 -37 24 41 97 -66 -62 72 76 87 -56 -5 77 51 -41 -37 -38 -23 -46 -9 46 -84 100 82 75 -69 -31 54 50 93 75 0 72 -21 31 73 95 -48 -49 28 72 87 ...

output:

-760483926664 -1131478165059 1078736685982509 -1579623130444 140300847961300 1308301091342367 356660126273 -1621398232494 -540496041768 -1250956947650 103312925756 1704298676270655 1570063066892932 -1595534318544 506841370045292 -302881470126 1137224507971245 1271191760711178 721644233650750 1874110...

result:

ok 200000 numbers

Test #5:

score: 0
Accepted
time: 832ms
memory: 40072kb

input:

2
500
57 88 82 38 56 82 23 15 39 39 30 61 4 52 8 77 25 14 64 88 76 59 12 48 7 87 17 9 77 20 51 17 52 50 63 45 41 12 3 90 63 33 81 96 4 60 77 6 62 24 38 81 91 5 73 13 14 41 70 59 28 12 65 53 20 8 26 80 11 22 10 41 65 39 67 56 74 76 88 32 82 26 63 46 21 99 13 82 83 63 9 61 38 96 85 85 75 63 20 43 100 ...

output:

986726997524044 510026146409654 1381034794876828 -925451281152 492247257135690 -1514433152120 23920898919391 174527347582808 -2435233882210 -3120004262886 -1833248353986 1027045228680394 1303004696907326 -1618235558654 -1044009435046 1322885462977946 8628545303575 1238031457650414 -2973521363059 -20...

result:

ok 200000 numbers