首页 > 其他 > 详细

Codeforces Round #402 (Div. 2) E 大模拟,递推

时间:2017-02-27 01:21:46      阅读:271      评论:0      收藏:0      [点我收藏+]

Codeforces Round #402 (Div. 2)

E. Bitwise Formula

题意:n个变量,每个变量都是二进制m位的数。给出n个变量的递推式,如技术分享。 ?表示要另外选择的一个变量。求n个变量的和最小时?最小取什么,n个变量的和最大时?最小取什么。

tags:很考码力的题,有时间再做一遍。。一个变量有m位,按每一位来求,如第 i 位,当 ? 取0时n个变量第 i 位的和与 ? 取1时n个变量第 i 位的和,哪个大哪个小。 当然重点是中间的记录过程,把每一个变量的操作运算以及映射关系都用数组记下来。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,b,a) for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 1e5+10, M = 1e3+10;

int n, m, x, y;
int a[N][M], t[N], ta[N], tb[N], aa[N], bb[N], f[N];
string s;
map<string , int > mp;
int check(int p, int k)
{
    int sum=0;
    f[0]=k;
    rep(i,1,n) {
        if(t[i]==0) f[i]=a[i][p];
        if(t[i]==1) f[i]=f[ta[i]]&f[tb[i]];
        if(t[i]==2) f[i]=f[ta[i]]|f[tb[i]];
        if(t[i]==3) f[i]=f[ta[i]]^f[tb[i]];
        sum+=f[i];
    }
    return sum;
}
int main()
{
    mp["?"]=0;
    scanf("%d %d", &n, &m);
    rep(i,1,n) {
        cin>>s;  mp[s]=i;
        cin>>s;  cin>>s;
        if(s[0]==0 || s[0]==1) {
            rep(j,0,m-1) a[i][j]=s[j]-0;
            continue;
        }
        ta[i]=mp[s];
        cin>>s;
        if(s[0]==A) t[i]=1;
        if(s[0]==O) t[i]=2;
        if(s[0]==X) t[i]=3;
        cin>>s;
        tb[i]=mp[s];
    }
    rep(i,0,m-1) {
        x=check(i, 0),  y=check(i, 1);
        aa[i]=y<x, bb[i]=x<y;       // 这里取值被坑了一下,注意题目最大最小要求区别
    }
    rep(i,0,m-1) printf("%d", aa[i]); puts("");
    rep(i,0,m-1) printf("%d", bb[i]); puts("");

    return 0;
}

Codeforces Round #402 (Div. 2) E 大模拟,递推

原文:http://www.cnblogs.com/sbfhy/p/6464143.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!