首页 > 其他分享 >Gym102994M Travel Dream

Gym102994M Travel Dream

时间:2023-09-08 23:11:09浏览次数:35  
标签:ch int Travel tp maxn inline Gym102994M Dream void

题意:\(n\) 个点的图,找一个有 \(k\) 个点的的简单环,使其边权和最大。

随机黑白染色,拆成两条颜色不同的不相交链,做 \(300\) 次即可。链的情况是好做的,做完后,预处理 \(f_{x,y}\) 表示 \(x\) 到 \(y\) 的最大距离,枚举两条端点颜色不同的边可以直接合并。

链点数 \(\leq 4\) 都是可以直接暴力枚举的,现在考虑 \(5\) 的情况。预处理 \(h_{x,y}\) 表示 \(x,y\) 间加一个点的最大链长,预处理前三大,剩下再暴力枚举即可。

#include <bits/stdc++.h>
using namespace std;
namespace FastIO {
	struct IO {
	    char ibuf[(1 << 20) + 1], *iS, *iT, obuf[(1 << 20) + 1], *oS;
	    IO() : iS(ibuf), iT(ibuf), oS(obuf) {} ~IO() { fwrite(obuf, 1, oS - obuf, stdout); }
		#if ONLINE_JUDGE
		#define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20) + 1, stdin), (iS == iT ? EOF : *iS++) : *iS++)
		#else
		#define gh() getchar()
		#endif
		inline bool eof (const char &ch) { return ch == ' ' || ch == '\n' || ch == '\r' || ch == 't' || ch == EOF; }
	    inline long long read() {
	        char ch = gh();
	        long long x = 0;
	        bool t = 0;
	        while (ch < '0' || ch > '9') t |= ch == '-', ch = gh();
	        while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gh();
	        return t ? ~(x - 1) : x;
	    }
	    inline void read (char *s) {
	    	char ch = gh(); int l = 0;
	    	while (eof(ch)) ch = gh();
	    	while (!eof(ch)) s[l++] = ch, ch = gh();
	    }
	    inline void read (double &x) {
	    	char ch = gh(); bool t = 0;
	    	while (ch < '0' || ch > '9') t |= ch == '-', ch = gh();
	    	while (ch >= '0' && ch <= '9') x = x * 10 + (ch ^ 48), ch = gh();
	    	if (ch != '.') return t && (x = -x), void(); ch = gh();
	    	for (double cf = 0.1; '0' <= ch && ch <= '9'; ch = gh(), cf *= 0.1) x += cf * (ch ^ 48);
	    	t && (x = -x);
	    }
	    inline void pc (char ch) {
	    	#ifdef ONLINE_JUDGE
	    	if (oS == obuf + (1 << 20) + 1) fwrite(obuf, 1, oS - obuf, stdout), oS = obuf; 
	    	*oS++ = ch;
	    	#else
	    	putchar(ch);
	    	#endif
		}
		template<typename _Tp>
	    inline void write (_Tp x) {
	    	static char stk[64], *tp = stk;
	    	if (x < 0) x = ~(x - 1), pc('-');
			do *tp++ = x % 10, x /= 10;
			while (x);
			while (tp != stk) pc((*--tp) | 48);
	    }
	    inline void write (char *s) {
	    	int n = strlen(s);
	    	for (int i = 0; i < n; i++) pc(s[i]);
	    }
	} io;
	inline long long read () { return io.read(); }
	template<typename Tp>
	inline void read (Tp &x) { io.read(x); }
	template<typename _Tp>
	inline void write (_Tp x) { io.write(x); }
}
using namespace FastIO;
#define int long long 
const int maxn=305,inf=1e18;
int n,m,k;
vector< tuple<int,int,int> > G[maxn];
bool col[maxn];
int f[6][maxn][maxn],up[maxn],vp[maxn],wp[maxn],h[maxn][maxn][3],idh[maxn][maxn][3];
mt19937 rnd(231232134);
void init1()
{
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[1][i][j]=-inf;
    for(int i=1;i<=n;i++)f[1][i][i]=0;
}
void init2()
{
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[2][i][j]=-inf;
    for(int i=1;i<=m;i++)
        if(col[up[i]]==col[vp[i]])f[2][up[i]][vp[i]]=f[2][vp[i]][up[i]]=max(f[2][up[i]][vp[i]],wp[i]);
}
inline void init3()
{
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[3][i][j]=-inf;
    for(int i=1;i<=n;i++)
        for(auto [j,w1,id1]:G[i])
            for(auto [k,w2,id2]:G[i])
                if(col[i]==col[j]&&col[i]==col[k]&&j!=k)
                    f[3][k][j]=f[3][j][k]=max(f[3][j][k],w1+w2);
}
inline void init4()
{
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[4][i][j]=-inf;
    for(int i=1;i<=m;i++)
    {
        if(col[up[i]]!=col[vp[i]])continue;
        for(auto [j,w1,id1]:G[up[i]])
            for(auto [k,w2,id2]:G[vp[i]])
                if(col[up[i]]==col[j]&&col[vp[i]]==col[k]&&up[i]!=k&&vp[i]!=j&&k!=j)
                    f[4][j][k]=f[4][k][j]=max(f[4][j][k],w1+w2+wp[i]);
    }
}
inline void upd(int v,int id,int i,int j)
{for(int t=0;t<3;t++)if(v>h[i][j][t]){swap(v,h[i][j][t]);swap(id,idh[i][j][t]);}}
inline int findminsec(int idn1,int idn2,int i,int j)
{for(int t=0;t<3;t++)if(idn1!=idh[i][j][t]&&idn2!=idh[i][j][t])return h[i][j][t];return -inf;}
inline void init5()
{
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[5][i][j]=h[i][j][0]=h[i][j][1]=h[i][j][2]=-inf;
    for(int i=1;i<=n;i++)
        for(auto [j,w1,id1]:G[i])
            for(auto [k,w2,id2]:G[i])
                if(col[i]==col[j]&&col[i]==col[k]&&j!=k)
                {
                    upd(w1+w2,i,j,k);
                    upd(w1+w2,i,k,j);
                }
    for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)
        {
            if(col[up[i]]!=col[vp[i]]||col[up[i]]!=col[up[j]]||col[up[i]]!=col[vp[j]]||col[up[j]]!=col[vp[j]]||up[i]==up[j]||up[i]==vp[j]||vp[i]==up[j]||vp[i]==vp[j])continue;
            f[5][up[i]][vp[j]]=max(f[5][up[i]][vp[j]],wp[i]+wp[j]+findminsec(up[i],vp[j],vp[i],up[j]));
            f[5][up[i]][up[j]]=max(f[5][up[i]][up[j]],wp[i]+wp[j]+findminsec(up[i],up[j],vp[i],vp[j]));
            f[5][vp[i]][vp[j]]=max(f[5][vp[i]][vp[j]],wp[i]+wp[j]+findminsec(vp[i],vp[j],up[i],up[j]));
            f[5][vp[i]][up[j]]=max(f[5][vp[i]][up[j]],wp[i]+wp[j]+findminsec(vp[i],up[j],up[i],vp[j]));
        }
}
signed main()
{
    n=read(),m=read(),k=read();
    for(int i=1;i<=m;i++)
        up[i]=read(),vp[i]=read(),wp[i]=read();
    for(int i=1;i<=m;i++)
    {
        G[up[i]].push_back({vp[i],wp[i],i});
        G[vp[i]].push_back({up[i],wp[i],i});
    }
    int t1=k/2,t2=k-t1,ans=-inf;
    if(k==3)
    {
        init2();
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                if(j!=up[i]&&j!=vp[i])
                    ans=max(ans,wp[i]+f[2][up[i]][j]+f[2][vp[i]][j]);
    }
    else
    for(int sr=1;sr<=1000;sr++)
    {
        for(int i=1;i<=n;i++)col[i]=rnd()%2;
        if(t1==1||t2==1)init1();
        if(t1==2||t2==2)init2();
        if(t1==3||t2==3)init3();
        if(t1==4||t2==4)init4();
        if(t1==5||t2==5)init5();
        for(int i=1;i<=m;i++)
            for(int j=1;j<=m;j++)
            {
                if(up[i]!=up[j]&&up[i]!=vp[j]&&vp[i]!=up[j]&&vp[i]!=vp[j])
                {
                    
                    if(col[up[i]]==0&&col[vp[i]]==1&&col[up[j]]==0&&col[vp[j]]==1)
                        ans=max(ans,f[t1][up[i]][up[j]]+f[t2][vp[i]][vp[j]]+wp[i]+wp[j]);
                    if(col[up[i]]==0&&col[vp[i]]==1&&col[vp[j]]==0&&col[up[j]]==1)
                        ans=max(ans,f[t1][up[i]][vp[j]]+f[t2][vp[i]][up[j]]+wp[i]+wp[j]);
                    if(col[vp[i]]==0&&col[up[i]]==1&&col[up[j]]==0&&col[vp[j]]==1)
                        ans=max(ans,f[t1][vp[i]][up[j]]+f[t2][up[i]][vp[j]]+wp[i]+wp[j]);
                    if(col[vp[i]]==0&&col[up[i]]==1&&col[vp[j]]==0&&col[up[j]]==1)
                        ans=max(ans,f[t1][vp[i]][vp[j]]+f[t2][up[i]][up[j]]+wp[i]+wp[j]);
                }
            }
    }
    if(ans>0)printf("%lld\n",ans);
    else puts("impossible");
}

标签:ch,int,Travel,tp,maxn,inline,Gym102994M,Dream,void
From: https://www.cnblogs.com/hikkio/p/17688732.html

相关文章

  • 「Dreamweaver安装包大全下载」DW软件安装包 新功能介绍
    AdobeDreamweaver2022是Adobe公司全新发布的可视化网页制作编辑软件,DreamweaverCC包含实时检查和CSS设计工具等多项增强功能,可以帮助用户更加轻松地创建和更新桌面平台和移动设备的网页内容,另外,新的元素快速检查功能可以帮助网页设计师速检查、预览及编辑众多的HTML标记等。使......
  • DreamWeaver+WebDav(IIS)配置团队协作开发
    作者:fbysssbasicauthentication因为如果是远程,肯定不能使用windows集成。这时的用户,应该是服务器上自行建立分配的用户(控制面板->用户).  可以通过目录的"安全"来指定每个用户的访问权限. 在Dreamweaver中新建一个站点.设置站点名称/本地根文件夹;远程信息->访问,选WebDav,然......
  • 8.30 模拟赛 光和影(dream) 题解
    概括:大分类讨论。首先有个重要结论,无论是三种操作中的哪一种,他的左儿子仍然在他的左子树内,右儿子在右子树内。同时,旋转一个点一次,对他更上面的点的深度没有影响。以此,我们预处理出一个\(up_{u,0/1}\)表示将\(u\)splay到根上,对左子树和右子树深度的影响,由于上面的结论,这个东......
  • Dreamweaver2021设计DW2021下载安装 中文版直装
    Dreamweaver2021版是一款非常专业的网页设计工具,设计功能强大,集网页制作和网站管理于一体,强大的编辑器让您的工作更轻松!功能介绍:可视化界面:Dreamweaver提供了可视化界面,使得用户可以直接在界面上操作,无需编写代码。代码编辑器:Dreamweaver也提供了代码编辑器,方便用户编辑和调试代码......
  • BanG Dream! It's MyGO!!!!! 短评
    BanGDream!It'sMyGO!!!!!小众佳作原创番3d略劝退“低气压美少女乐队番”,不得不说,这个“低气压”可太精髓了整个剧情笼罩在已死乐团CRYCHIC的阴云下,太窒息了Tomori:本作重女,要“组一辈子的乐队”,总是给我一种自闭、不善交流的印象,然而内心活动丰富,有时会把他人的过错归......
  • P9342 Bitaro's Travel 题解
    模拟赛做到的题,赛后看了Y2hlbnlpa2Fp的题解,感觉没讲清楚,这里做下补充,提供自己的理解。基本思路:对每个\(A_i\)的答案进行预处理,对于每个询问,只需要找到第一个到达的景点即可。那么如何预处理每个点的答案呢?有一条很重要的性质:最多转向\(\log{X}\)次。要证明这个结论,先放......
  • Adobe Dreamweaver 2022官方版_最新免费版下载安装 官方版特色
    AdobeDreamweaver2021亮点1.快速.灵活的编码借助简化的智能编码引擎,轻松创建.编码和管理动态网站。访问代码提示,用于快速理解和编辑HTML.CSS和其他Web标准。利用视觉辅助功能减少错误,提高网站开发速度。2.通过较少的步骤轻松设置网站使用起始模板更快地启动和运行您的网站,您可以通......
  • #轮廓线dp#HDU 1400 Mondriaan's Dream
    题目传送门分析状压dp会TLE,考虑用轮廓线dp,设\(dp[i][j][S]\)表示现在处理到\((i,j)\)这个位置轮廓线上状态为\(S\)的情况二进制位为1表示左边或者上方有骨牌跨过轮廓线,然后分类讨论转移一下即可代码#include<cstdio>#include<cstring>usingnamespacestd;con......
  • AI 赚钱:PhantaDream 对 Web3 时代 AIGC 的愿景
    AIGC作为一种工具,消除了艺术表达技巧的门槛,任何人都可以充分参与艺术的创作,这可能是艺术史上前所未有的时代,我们都是这个时代的见证者和参与者。S进入AIGC迷人的世界,这条技术赛道正在着火,彻底改变我们体验艺术的方式。2022年<>月,一位没有绘画技巧的参赛者提交了AIGC制作的......
  • UVA10702 Travelling Salesman 题解
     UVA10702TravellingSalesman题解题面:有个旅行的商人,他每到一个的新城市,便卖掉所有东西再购买新东西,从而获得利润。从某城市A到某城市B有固定利润(B 到A 的利润可能不同)。已知城市可以重复到达,从S 点出发,经过T 个城市,有E个城市能作为终点,求最大的利润。先定义......