2024.10.10 鲜花(原 I 的交互程序改)

Roads in E City

夜曲
一群嗜血的蚂蚁 被腐肉所吸引
我面无表情 看孤独的风景
失去你 爱恨开始分明
失去你 还有什么事好关心
当鸽子不再象征和平
我终于被提醒
广场上喂食的是秃鹰
我用漂亮的押韵
形容被掠夺一空的爱情
啊 乌云开始遮蔽 夜色不干净
公园里 葬礼的回音 在漫天飞行
送你的白色玫瑰
在纯黑的环境凋零
乌鸦在树枝上诡异的很安静
静静听 我黑色的大衣
想温暖你日渐冰冷的回忆
走过的 走过的 生命
啊 四周弥漫雾气
我在空旷的墓地
老去后还爱你
为你弹奏肖邦的夜曲
纪念我死去的爱情
跟夜风一样的声音
心碎的很好听
手在键盘敲很轻
我给的思念很小心
你埋葬的地方叫幽冥
为你弹奏肖邦的夜曲
纪念我死去的爱情
而我为你隐姓埋名
在月光下弹琴
对你心跳的感应
还是如此温热亲近
怀念你那鲜红的唇印
那些断翅的蜻蜓 散落在这森林
而我的眼睛 没有丝毫同情
失去你 泪水混浊不清
失去你 我连笑容都有阴影
风在长满青苔的屋顶
嘲笑我的伤心
像一口没有水的枯井
我用凄美的字型
描绘后悔莫及的那爱情
为你弹奏肖邦的夜曲
纪念我死去的爱情
跟夜风一样的声音
心碎的很好听
手在键盘敲很轻
我给的思念很小心
你埋葬的地方叫幽冥
为你弹奏肖邦的夜曲
纪念我死去的爱情
而我为你隐姓埋名
在月光下弹琴
对你心跳的感应
还是如此温热亲近
怀念你那鲜红的唇印
一群嗜血的蚂蚁 被腐肉所吸引
我面无表情 看孤独的风景
失去你 爱恨开始分明
失去你 还有什么事好关心
当鸽子不再象征和平
我终于被提醒
广场上喂食的是秃鹰
我用漂亮的押韵
形容被掠夺一空的爱情

给个链接 this

首先考虑询问,发现 \(s\) 的随机性太强了,基本是没有针对 \(s\) 的希望了。

容易想到如何判断一条边桥(包括后面的指将修过的边单拿出来组成的图的桥):将其断开,在左右端点分别算 \(20\) 次判联通,因为至少有一边的概率 \(\ge \frac{1}{2}\),正确率还是很高的。

考虑怎么构造桥,显然是将不是桥的断开,剩下的一定是桥,并且构成了一棵树,因为边一定是 \(1\)

考虑我们断开的边其中的 \(1\),可以先加入,在断掉环上的一个点,判断断掉以后是否联通即可(对于断边的左右端点)。

给一个交互库吧:

Code
#include<bits/stdc++.h> // 交互题什么的最讨厌了
using namespace std;
using llt=long long;
using llf=long double;
using ull=unsigned long long;

mt19937 rnd(ull(new char)*ull(new char));

const int N=1e5+3;
struct Gph{
	int hd[N],to[N<<1],nt[N<<1],wt[N<<1],tot=1;
	void Add(int u,int v,int w){wt[++tot]=w,to[tot]=v,nt[tot]=hd[u],hd[u]=tot;}
	void ADD(int u,int v,int w){Add(u,v,w),Add(v,u,w);}
#define For_to(i,u,v,g) for(int i=g.hd[u],v=g.to[i];i;i=g.nt[i],v=g.to[i])
}g;

bool p[N]; int ss;
int ca[N],cb[N]; bool wt[N],vis[N];
bool Get(int u){
    p[u]=1; bool fg=0;
    if(u==ss) return 1;
    For_to(i,u,v,g) if(!vis[i>>1]&&g.wt[i]&&!p[v]) fg|=Get(v);
    return fg;
}

int main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    cout<<1<<endl;
    int n=6,m=10;
    cout<<n<<' '<<m<<endl;
    for(int i=1;i<n;++i){cb[i]=rnd()%i+1; g.ADD(ca[i]=i+1,cb[i],wt[i]=1); cout<<i+1<<' '<<cb[i]<<endl;}
    for(int i=n;i<=m;++i){while(ca[i]==cb[i]) ca[i]=rnd()%n+1,cb[i]=rnd()%n+1; g.ADD(ca[i],cb[i],wt[i]=rnd()%2),cout<<ca[i]<<' '<<cb[i]<<endl;}
    while(1){
        char opt; cin>>opt;
        if(opt=='-'){int i; cin>>i; assert(!vis[i]); vis[i]=1;}
        else if(opt=='+'){int i; cin>>i; assert(vis[i]); vis[i]=0;}
        else if(opt=='?'){
            int s=rnd()%n+1; cin>>ss;
            memset(p,0,sizeof(p)),cout<<Get(s)<<endl;
        }
        else{
            assert(opt=='!');
            for(int i=1;i<=n;++i){int w; cin>>w; assert(w==wt[i]);}
            return 0;
        }
    }
}

用管道做 OI 交互即可,可以看 this

P

posted @ 2024-10-10 21:39  xrlong  阅读(55)  评论(1编辑  收藏  举报