首页 > 其他分享 >CF1107F Vasya and Endless Credits

CF1107F Vasya and Endless Credits

时间:2024-07-14 22:40:43浏览次数:19  
标签:Vasya slack int rep Credits while vy lx Endless

KM 做法这么简单好想为什么都在 dp?我第一次过也是用的 dp。

建模非常好想,每天只能收一次钱,最简单的思路是我们枚举第几天开车跑路,但是再一想我们不关心是第几天,只关心每次贷款离开车跑路还差几天,于是我们从 \(i\) 向 \(j\) 连边,边权是 \(a_i+b_i\times\min(k_i,j)\),意义为第 \(i\) 种贷款离买车还差 \(j\) 天对答案的贡献,当然我们实现时需要对 \(0\) 取最大值,因为取 \(0\) 的意义为不参与答案贡献,然而我们并不要求在最后一天开车,所以对 \(0\) 取最大值是必要的。

并且,容易证明我们不可能在某一天没有进行任何操作。

所以建完模直接跑 KM 算法即可,时间复杂度 \(\mathcal{O(n^3)}\)。

代码:

#include <bits/stdc++.h>
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; ++ i)
#define rrp(i, l, r) for (int i = r; i >= l; -- i)
#define eb emplace_back
#define inf 1000000000
#define linf 10000000000000000
#define pii pair <int, int>
using namespace std;
constexpr int N = 505, P = 1e9 + 7;
inline int rd ()
{
	int x = 0, f = 1;
	char ch = getchar ();
	while (! isdigit (ch)) { if (ch == '-') f = -1; ch = getchar (); }
	while (isdigit (ch)) { x = (x << 1) + (x << 3) + ch - 48; ch = getchar (); }
	return x * f;
}
int n, sum, ans;
int e[N][N];
int lx[N], ly[N], px[N], py[N], pre[N], slack[N];
bool vx[N], vy[N], flag;
int a[N], b[N], k[N];
queue <int> q;
void aug (int v)
{
  while (v)
  {
    int t = px[pre[v]];
    px[pre[v]] = v;
    py[v] = pre[v];
    v = t;
  }
}
void bfs (int s)
{
  memset (vx, 0, sizeof vx);
  memset (vy, 0, sizeof vy);
  memset (slack, 127, sizeof slack);
  while (! q.empty ()) q.pop ();
  q.push (s);
  while (true)
  {
    while (! q.empty ())
    {
      int u = q.front ();
      q.pop ();
      vx[u] = 1;
      rep (i, 1, n)
      {
        if (vy[i]) continue;
        if (lx[u] + ly[i] - e[u][i] < slack[i])
        {
          slack[i] = lx[u] + ly[i] - e[u][i];
          pre[i] = u;
          if(! slack[i])
          {
            vy[i] = 1;
            if (! py[i])
            {
              aug (i); return ;
            } else q.push (py[i]);
          }
        }  
      } 
    }
    int d = linf;
    rep (i, 1, n) if (! vy[i]) d = min (d, slack[i]);
    rep (i, 1, n)
    {
      if (vx[i]) lx[i] -= d, sum -= d;
      if (vy[i]) ly[i] += d, sum += d;
      else slack[i] -= d;
    }
    rep (i, 1, n)
    {
      if (vy[i]) continue;
      if(! slack[i])
      {
        vy[i] = 1;
        if (! py[i])
        {
          aug (i); return ;
        } else q.push (py[i]);
      }
    }
  }
}
void solve ()
{
  memset (lx, -127, sizeof lx);
  sum = 0;
  rep (i, 1, n) rep (j, 1, n) lx[i] = max (lx[i], e[i][j]);
  rep (i, 1, n) sum += lx[i];
  
  rep (i, 1, n)
    bfs (i);
}
signed main ()
{
  n = rd ();
  rep (i, 1, n)
  {
    a[i] = rd (), b[i] = rd (), k[i] = rd ();
  }
  rep (i, 1, n)
    rep (j, 1, n)
      e[i][j] = max (0ll, a[i] - min (k[i], j - 1) * b[i]);
  solve ();
  printf ("%lld\n", sum);
}
/*

*/

标签:Vasya,slack,int,rep,Credits,while,vy,lx,Endless
From: https://www.cnblogs.com/lalaouyehome/p/18302149

相关文章

  • ENDLESS vs INFINITE coca 搭配
       WORD 1: ENDLESS  WORDW1W2  PARADE1270  MEETINGS830  DISCUSSIONS590  DEBATE1071  HOURS3045  MILES571  SPECULATION561  STREAM3226  WAR2685  SUMMER1755  WARS1755......
  • go gin web服务器使用fvbock/endless优雅地重启或停止
    gin使用fvbock/endlessgin正常使用注册路由时:packagemainimport"github.com/gin-gonic/gin"funcmain(){ r:=gin.Default() r.GET("/ping",func(c*gin.Context){ c.JSON(200,gin.H{ "message":"pong", }) }) r.Run......
  • Codeforces 832E Vasya and Shifts
    考虑到这个操作实际上就是\(5\)进制的不进位加法,其实也就是\(5\)进制下的异或。同时因为是\(5\)进制,对于\(x\in[1,4]\),\(x\times0,\cdots,x\times4\)刚好可以表示出\(0\sim4\)。于是可以考虑类似\(2\)进制的线性基弄个\(5\)进制的线性基。即令\(w_i\)为......
  • 使用 endless 库实现不停服更新 demo
    packagemainimport("github.com/fvbock/endless""github.com/gin-gonic/gin""log")funcmain(){router:=gin.Default()router.GET("/",func(c*gin.Context){c.JSON(200,gin.H{"......
  • CF1016D Vasya And The Matrix Solution
    题目传送门做法因为是异或运算,可以按位考虑。先预处理出行(\(a[i]\))异或和\(suma\),与列(\(b[i]\))的异或和\(sumb\)。如果\(suma\nesumb\),那就说明无解,因为\(suma\)和\(sumb\)最后都代表着整个矩阵的异或和,如果两者不相等,那就说明矛盾,无解。否则就一定......
  • CF1051C Vasya and Big Integers 题解
    Problem-1051E-CodeforcesVasyaandBigIntegers-洛谷感谢女队提交记录推荐给我的一道题\(Orz\)首先\(O(n^2)\)的\(dp\)是simple的,如果你没看出来你可能是像我一样把题目看错了设\(dp_i\)表示考虑前\(i\)个的方案数,转移枚举长度后比较字典序。虽然看......
  • Credits
    鸣谢@tkth点击查看歌词fundingforthisprogramwasmadepossiblebybybybyFun-di-di-di-di-dingfo-o-o-ofortheprogramprogrampro-o-o-gramFundingforthethewapossib-leviewerslikeyoulikeyoulikeyoulikeyoulikeyoulikeyoulikeyouFu-fu......
  • [题解]AT_abc245_f [ABC245F] Endless Walk
    思路首先我们可以发现,在任意一个节点数量大于\(1\)的强连通分量中的点都满足条件。所以,我们可以对这张图跑一边TarJan。但是这样是错的,因为我们还需要考虑节点数量为\(1\)的强连通分量。如果这种连通分量能够到达任意一个节点数量大于\(1\)的强连通分量,那么,这个连通分......
  • CF249E Endless Matrix 题解
    @目录Description前置芝士SolutionCodeDescription构造一类矩形:先构造矩形\(M_1=\begin{bmatrix}1\end{bmatrix}\)。对于\(i\geq1\),\(T_{i+1}\)从\(T_i\)构造而来,方法为在最右侧和最下侧插入新的一行一列,自右上到左下\(2i+1\)个数分别填入\(i^2+1,i^2+2\dots(i+1)^2\)......
  • 【大联盟】20230706 Interesting DS Problem(interesting) QOJ2559 【Endless Road】
    题目描述here。题解首先,我们对所有区间离散化,删除一个区间时,我们暴力删除内部还存在的子区间。如果没有区间包含是好做的,因为我们删除一个子区间时,将区间按照左端点排序,可发现包含这个子区间的区间是连续的一个区间。现在考虑有区间包含怎么做。我们考虑维护出当前所有不包含......