Codeforces Round #402 (Div. 2) E 大模拟,递推
Codeforces Round #402 (Div. 2)
题意: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; }