首页 > 其他分享 >G. Lights

G. Lights

时间:2024-01-17 15:33:20浏览次数:29  
标签:int 100005 Lights state solve ind

原题链接

太巧妙了!!

关键1:把开着的灯当成黑点看待
关键二:如图

更多细节请看代码

code

#include<bits/stdc++.h>
using namespace std;
int to[100005];//代表会被我影响的灯,抽象成边
void solve()
{
        int n;
        int state[100005]={0};//代表每个灯的状态
        int ind[100005]={0};//代表入度
        string s;
        cin>>n>>s;
        vector<int> ans;//代表答案,需要关掉灯的编号
        for(int i=1;i<=n;i++)
        {
            cin>>to[i];
            ind[to[i]]++;
            if(s[i-1]=='1')state[i]=1;//用数组代替,方便计算
        }

        queue<int> q;
        for(int i=1;i<=n;i++) if(!ind[i]) q.push(i);//从入度为零的点开始消除,即消除链

        while(q.size())
        {
            int now=q.front();
            q.pop();
            if(--ind[to[now]]==0)q.push(to[now]);
            if(state[now])//把开着的灯想象成黑色的点,开关后,黑点会向下移动,且黑点遇到黑点时会消除
            {
                ans.push_back(now);
                state[to[now]]^=1;
                state[now]=0;
            }
        }

        for(int i=1;i<=n;i++)
        {
            if(ind[i])//现在把链全部去掉了,环可能有多个
            {
                int x=i,len=0,half=0,curstate=0;
                while(ind[x]--)
                {
                    curstate^=state[x];
                    half+=curstate;
                    len++;
                    x=to[x];
                }
                if(curstate)
                {
                    cout<<"-1"<<endl;//如果环上的黑点奇数个,肯定无法消除
                    return;
                }

                for(int i=1;i<=len;i++)//这一段判断环上需要关掉灯的方法太巧妙了!!
                {
                    curstate^=state[x];
                    if(curstate==(2*half<=len))ans.push_back(x);
                    x=to[x];
                }
            }
        }

        cout<<ans.size()<<endl;
        for(int i:ans)cout<<i<<" ";
        cout<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--) solve();
    return 0;
}

标签:int,100005,Lights,state,solve,ind
From: https://www.cnblogs.com/pure4knowledge/p/17970142

相关文章

  • P9017 [USACO23JAN] Lights Off G 题解
    一次操作相当于把\(a\)异或上\(b\),修改开关的一位相当于将这一位异或上\(1\)。会发现一个很神奇的性质:初始开关对灯的影响和改变开关状态对灯的影响是独立的。而前者的影响是固定的,所以我们可以只考虑改变开关状态对灯的影响。假设一共需要\(k\)次操作能使所有灯关闭,如果我......
  • [CF958F3] Lightsabers (hard)
    题目链接对于一种元素\(v\),假设它在给出可重集合中出现了\(t\)次,那么容易把它表示成基础的生成函数形式:\(1+x+x^2+x^3+\dots+x^t\)。显然,把所有元素的生成函数卷一下就是答案。但是这样最坏情况为\(O(nm\logn)\)的,不能通过这道题。在思考优化方式时,容易想到启发式合并来优......
  • G. Lights
    G.LightsIntheendoftheday,Annaneedstoturnoffthelightsintheoffice.Thereare$n$lightsand$n$lightswitches,buttheiroperationschemeisreallystrange.Theswitch$i$changesthestateoflight$i$,butitalsochangesthestateofso......
  • 谁可以从使用 Amazon Lightsail 进行 VPS 托管中受益?
    文章作者:Libai介绍在当今数字化的环境中,拥有可靠和高效的托管解决方案对于企业和个人来说至关重要。由于其灵活性、可扩展性和成本效益,虚拟专用服务器(VPS)托管已经在市场上获得了巨大的流行。AmazonLightsail 正是市场上备受瞩目的一种 VPS 托管解决方案。亚马逊云科技开发......
  • Lightsail VPS 实例在哪些方面胜过 EC2 实例?
    文章作者:Libai引言LightsailVPS 实例和 EC2 实例是云计算领域中两种受欢迎的技术。虽然两者都提供虚拟服务器解决方案,但了解 LightsailVPS 实例在哪些方面胜过 EC2 实例非常重要。在本文中,我们将探讨这两种技术之间的关键区别,并突出使用 LightsailVPS 实例的优势。......
  • 什么是 Amazone LightSail 中的 Tags 概念
    AmazonLightsail允许您将标签作为标签分配给资源。每个标签都是由一个键和一个可选值组成的标签,可以高效地管理、搜索和过滤资源。尽管没有固有的标签类型,但它们允许您按用途、所有者、环境或其他标准对Lightsail资源进行分类。当您拥有许多相同类型的资源时,这非常有用。......
  • 什么是 Amazon Lightsail
    AmazonLightsail是亚马逊(Amazon)推出的一项基于云端的轻量级计算服务,它旨在使用户能够轻松快速地建立虚拟专用服务器(VPS),提供简便、经济实惠的云计算解决方案。AmazonLightsail的主要特点包括:1.简易性:用户友好的界面:提供直观的控制台,使用户能够快速部署服务器和应用程序。快......
  • Lightsail CDN 现已对 Lightsail Container Services 作为来源进行支持
    AmazonLightsail 现在通过将LightsailCDN与您的LightsailContainerServices结合使用,为您提供了优化向全球受众交付容器化应用程序的功能。只需从Lightail控制台点击几下,Lightail容器就可以配置为LightsailCDN分配的来源。亚马逊云科技开发者社区为开发者们提供全......
  • Amazon Lightsail 宣布为域注册和 DNS 自动配置提供支持
    您现在可以在 AmazonLightsail 上注册域名和自动配置域名系统(DNS)。对于需要安全、高性能且可靠的虚拟专用服务器(VPS) 解决方案的用户来说,AmazonLightsail 是开始使用亚马逊云科技的一种最简单方法,它具有简单的管理界面和可预测的定价。通过增加域注册,Lightsail 用户......
  • [CF576D] Flights for Regular Customers
    CF576D把矩阵定义为\(f_{t,i,j}\)表示恰好t步后i,j是否可达,则广义乘法为\[f_{t+1,i,j}=\sum_{k=1}^{n}f_{t,i,k}\wedgef_{1,k,j}\]因为是或操作,所以\(f_{i,j}=1\)时答案或上另一个乘数的第j行即可,bitset优化。从小到大扩展d,这时从恰好d步数可达的点bfs即......