結果
| 問題 |
No.2161 Black Market
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-02-05 13:39:13 |
| 言語 | C# (.NET 8.0.404) |
| 結果 |
AC
|
| 実行時間 | 749 ms / 7,000 ms |
| コード長 | 3,309 bytes |
| コンパイル時間 | 15,170 ms |
| コンパイル使用メモリ | 168,904 KB |
| 実行使用メモリ | 190,128 KB |
| 最終ジャッジ日時 | 2024-07-04 03:25:09 |
| 合計ジャッジ時間 | 16,365 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (115 ms)。 MSBuild のバージョン 17.9.6+a4ecab324 (.NET) main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
using System;
using static System.Console;
using System.Linq;
using System.Collections.Generic;
class Program
{
static int[] NList => ReadLine().Split().Select(int.Parse).ToArray();
static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray();
public static void Main()
{
Solve();
}
static void Solve()
{
var c = NList;
var (n, k, l, p) = (c[0], c[1], c[2], c[3]);
var map = NArr(n);
WriteLine(Market(n, k, l, p, map));
}
static long Market(int n, int k, int l, int p, int[][] map)
{
var leftcnt = n / 2;
var llist = BitList(map.Take(leftcnt).ToList());
var rlist = BitList(map.Skip(leftcnt).ToList());
llist.Sort((l, r) => l.val.CompareTo(r.val));
rlist.Sort((l, r) => r.val.CompareTo(l.val));
var cset = new HashSet<long>();
foreach (var li in llist) if (l - li.cost >= 0) cset.Add(l - li.cost);
foreach (var ri in rlist) cset.Add(ri.cost);
var clist = new List<long>(cset);
clist.Sort();
var cdic = new Dictionary<long, int>();
for (var i = 0; i < clist.Count; ++i) cdic[clist[i]] = i;
var rightcnt = n - n / 2;
var ftlist = new FenwickTree[rightcnt + 1];
for (var i = 0; i < ftlist.Length; ++i) ftlist[i] = new FenwickTree(clist.Count);
var ans = 0L;
var cur = 0;
foreach (var li in llist)
{
while (cur < rlist.Count && li.val + rlist[cur].val >= p)
{
ftlist[rlist[cur].cnt].Add(cdic[rlist[cur].cost], 1);
++cur;
}
if (l - li.cost < 0) continue;
for (var i = 0; i < ftlist.Length && i + li.cnt <= k; ++i)
{
ans += ftlist[i].Sum(cdic[l - li.cost]);
}
}
return ans;
}
static List<(int cnt, long cost, long val)> BitList(List<int[]> map)
{
var ans = new List<(int cnt, long cost, long val)>();
var bitmax = 1 << map.Count;
for (var b = 0; b < bitmax; ++b)
{
var tmp = b;
var cnt = 0;
var cost = 0L;
var val = 0L;
for (var i = 0; i < map.Count; ++i)
{
if (tmp % 2 == 1)
{
++cnt;
cost += map[i][0];
val += map[i][1];
}
tmp >>= 1;
}
ans.Add((cnt, cost, val));
}
return ans;
}
class FenwickTree
{
int size;
long[] tree;
public FenwickTree(int size)
{
this.size = size;
tree = new long[size + 2];
}
public void Add(int index, int value)
{
++index;
for (var x = index; x <= size; x += (x & -x)) tree[x] += value;
}
/// <summary>先頭からindexまでの和(include index)</summary>
public long Sum(int index)
{
++index;
var sum = 0L;
for (var x = index; x > 0; x -= (x & -x)) sum += tree[x];
return sum;
}
}
}