当前位置: 首页 > news >正文

Codeforces Round #369 (Div. 2)

A:水,直接遍历就好了

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 20090717
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-12;
const int N=3000+10,maxn=10000+10,inf=0x3f3f3f3f;

string s[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=0;i<n;i++)cin>>s[i];
    for(int i=0;i<n;i++)
    {
        if(s[i][0]=='O'&&s[i][1]=='O')
        {
            cout<<"YES"<<endl;
            s[i][0]=s[i][1]='+';
            for(int j=0;j<n;j++)cout<<s[j]<<endl;
            return 0;
        }
        if(s[i][3]=='O'&&s[i][4]=='O')
        {
            cout<<"YES"<<endl;
            s[i][3]=s[i][4]='+';
            for(int j=0;j<n;j++)cout<<s[j]<<endl;
            return 0;
        }
    }
    cout<<"NO"<<endl;
    return 0;
}
/********************

********************/
A

B:一个矩阵里只有一个0,找一个正整数填上去,使每行每列和两个对角线之和相同

坑点:忘记判断最后是正数的情况

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 20090717
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-12;
const int N=3000+10,maxn=10000+10,inf=0x3f3f3f3f;

string s[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=0;i<n;i++)cin>>s[i];
    for(int i=0;i<n;i++)
    {
        if(s[i][0]=='O'&&s[i][1]=='O')
        {
            cout<<"YES"<<endl;
            s[i][0]=s[i][1]='+';
            for(int j=0;j<n;j++)cout<<s[j]<<endl;
            return 0;
        }
        if(s[i][3]=='O'&&s[i][4]=='O')
        {
            cout<<"YES"<<endl;
            s[i][3]=s[i][4]='+';
            for(int j=0;j<n;j++)cout<<s[j]<<endl;
            return 0;
        }
    }
    cout<<"NO"<<endl;
    return 0;
}
/********************

********************/
B

C:1到n每个为0的格子填充1到m的颜色,求连续区间有k个的最小权值填充情况

看了好久没有一点思路= =, 然后发现居然是O(n^4)的dp。。

转移方程:dp[i][j][k]代表从1到i已经填充好了,i是填j的颜色,有k个连续区间的最小权值

if(c[i]==0)dp[i][j][k]=min(hh,dp[i-1][j][k])+cost[i][j]
else dp[i][c[i]]][k]=min(dp[i-1][c[i]]][k],hh)
hh=dp[i-1][!j][k-1]

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-12;
const int N=100+10,maxn=10000+10,inf=0x3f3f3f3f;

int c[N],p[N][N];
ll dp[N][N][N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)cin>>c[i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>p[i][j];
    for(int i=0;i<=n;i++)
        for(int j=0;j<=m;j++)
            for(int u=0;u<=k;u++)
                dp[i][j][u]=1e15;
    if(!c[1])
    {
        for(int i=1;i<=m;i++)dp[1][i][1]=p[1][i];
    }
    else dp[1][c[1]][1]=0;
    for(int i=2;i<=n;i++)
    {
        if(c[i]!=0)
        {
            for(int j=1;j<=m;j++)
            {
                for(int u=1;u<=i&&u<=k;u++)
                {
                    if(j==c[i])dp[i][c[i]][u]=min(dp[i][c[i]][u],dp[i-1][c[i]][u]);
                    else dp[i][c[i]][u]=min(dp[i][c[i]][u],dp[i-1][j][u-1]);
                }
            }
        }
        else
        {
            for(int j=1;j<=m;j++)
            {
                for(int u=1;u<=m;u++)
                {
                    for(int v=1;v<=k&&v<=i;v++)
                    {
                        if(j==u)dp[i][j][v]=min(dp[i][j][v],dp[i-1][j][v]+p[i][j]);
                        else dp[i][j][v]=min(dp[i][j][v],dp[i-1][u][v-1]+p[i][j]);
                    }
                }
            }
        }
    }
    ll ans=1e15;
    for(int i=1;i<=m;i++)
     //   cout<<dp[n][i][k]<<endl,
        ans=min(ans,dp[n][i][k]);
    if(ans>=1e15)cout<<-1<<endl;
    else cout<<ans<<endl;
    return 0;
}
/********************
if(c[i]==0)dp[i][j][k]=min(hh,dp[i-1][j][k])+cost[i][k]
else dp[i][j][c[i]]=min(dp[i-1][j][c[i]],hh)
hh=dp[i-1][j-1][!k]
2 2 2
0 0
1 2
2 1
********************/
C

D:给你一个数组,i从i到a【i】有一条边,对于一个有向图如果有环,那么我们叫他混乱的,要求所有翻转边的情况来使得该图不混乱

题解:em首先可以注意到,该图中的环一定是简单环,而且每个联通块一定只有一个环,然后我们分别考虑每一个环(n个点),我们一定有2^n-2种翻转情况,因为需要排除正向环和反向环的情况,然后对于不是环的边,分别乘上去就好了

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-12;
const int N=200000+10,maxn=10000+10,inf=0x3f3f3f3f;

vector<int>v[N];
int a[N],pre[N];
int sz,en,be;
void dfs(int u,int f)
{
  //  cout<<u<<" "<<f<<endl;
    pre[u]=f;sz++;
    for(int i=0;i<v[u].size();i++)
    {
        int x=v[u][i];
        if(x==f)continue;
        if(!pre[x])dfs(x,u);
        else
        {
            be=u;en=x;
        }
    }
}
ll quick(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;
        b/=2;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        v[i].pb(a[i]);
        v[a[i]].pb(i);
    }
    ll ans=1;
    for(int i=1;i<=n;i++)
    {
        if(!pre[i])
        {
            sz=en=be=0;
            dfs(i,n+1);
     //       cout<<en<<" "<<be<<endl;
            if(en!=0)
            {
                int res=1;
                for(int p=en;p!=be;p=pre[p])res++;
                ans=ans*(quick(2,res)-2)%mod*quick(2,sz-res)%mod;
            }
            else ans=ans*quick(2,sz)%mod;
        }
    }
    cout<<ans<<endl;
    return 0;
}
/********************
5
2 3 1 5 4
********************/
D

E。。。待补

转载于:https://www.cnblogs.com/acjiumeng/p/7859783.html

相关文章:

  • oracle的下载地址,ORACLE 资源包下载地址
  • Ubuntu 16.04 安装NodeJs
  • oracle 集中度函数,提高品牌集中度为企业谋取更多利益
  • TreeMap按照key排序
  • oracle 分区表外键建索引,INFORMIX 表分区及索引
  • [loj#115] 无源汇有上下界可行流 网络流
  • php程序设计形成性手册,PHP动态网站设计(专,2020春)形成性考核_第6章 单元测试0...
  • linux命令行动态输出,Linux top实时显示process的动态命令详解
  • 我的cheatsheet
  • linux文件赋予用户权限,Linux 给用户赋予操作权限
  • Ubuntu 16.04安装JAD反编译工具(Java)
  • 查询linux命令位置,查看登录过Linux的IP的地理位置(基于last命令)
  • [poj] 3974 Palindrome
  • linux遍历目录删除指定文件,shell脚本删除目录下的指定文件
  • 【转】VC++计算当前时间点间隔N天的时间(不使用CTimeSpan类)
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java 网络编程(2):UDP 的使用
  • Java到底能干嘛?
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • nginx 负载服务器优化
  • python docx文档转html页面
  • Spring Cloud中负载均衡器概览
  • Vue.js源码(2):初探List Rendering
  • 编写高质量JavaScript代码之并发
  • 电商搜索引擎的架构设计和性能优化
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 如何合理的规划jvm性能调优
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 异步
  • 1.Ext JS 建立web开发工程
  • NLPIR智能语义技术让大数据挖掘更简单
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • $().each和$.each的区别
  • (2)STL算法之元素计数
  • (ZT)一个美国文科博士的YardLife
  • (八)Spring源码解析:Spring MVC
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (接口自动化)Python3操作MySQL数据库
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (原創) 物件導向與老子思想 (OO)
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • *Django中的Ajax 纯js的书写样式1
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 材料检测系统崩溃分析
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值