Problem A UVALive 7214 Arithmetical CAPTCHA
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
int a[33];
char op[33];
bool dfs(int i, int flag, int sum, int val)
{
if(i == 4)
{
if(flag && sum == val)
{
printf(" %d", a[0]);
for(int j = 1; j < 4; j ++)
printf(" %c %d", op[j], a[j]);
puts("");
return true;
}
return false;
}
op[i] = '+';
if(dfs(i + 1, flag, sum + a[i], val)) return true;
op[i] = '-';
if(dfs(i + 1, flag, sum - a[i], val)) return true;
op[i] = '=';
if((!flag || sum == val) && dfs(i + 1, flag | 1, a[i], flag ? val : sum)) return true;
}
int main()
{
int T, cas = 1;
scanf("%d", &T);
while(T --)
{
for(int i = 0; i < 4; i ++)
scanf("%d", &a[i]);
printf("Case #%d:", cas ++);
dfs(1, 0, a[0], 0);
}
return 0;
}
Problem B UVALive 7215 Udin and Ucok
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define eps 1e-8
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
int sg[100];
int vis[100];
void init() {
memset(sg, 0, sizeof sg);
sg[0] = 0;
sg[1] = sg[2] = 1;
for(int i = 2; i <= 200; i ++) {
memset(vis, 0,sizeof vis);
for(int j = 1; j <= i; j ++) {
vis[sg[max(j - 2, 0)] ^ sg[max(i - (j + 1), 0)]] = 1;
}
for(int j = 0; ; j ++) if(!vis[j]) {
sg[i] = j;
break;
}
if(sg[i] == 0)
printf("i = %d sg = %d\n", i, sg[i]);
}
}
int main() {
// init();
int t, cas = 1, n;
cin >> t;
while(t --) {
cin >> n;
printf("Case #%d: ", cas ++);
if(n < 54) {
if(n == 4 || n == 8 || n == 14 || n == 20 || n == 24 || n == 28 || n == 34 || n == 38 || n == 42) {
puts("UCOK");
continue;
}
puts("UDIN");
continue;
}
n = (n - 54) % 34;
if(n == 0 || n == 4 || n == 8 || n == 18 || n == 22) {
puts("UCOK");
continue;
}
puts("UDIN");
continue;
}
return 0;
}
Problem D UVALive 7217 An ICPC Problem without Statement
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn=100100;
int cnt[10],t[maxn];
vector<int> vec[10],ans,ans2;
int main(){
// freopen("in.txt","r",stdin);
int T;scanf("%d",&T);
for(int cas=1;cas<=T;cas++){
int n,a,b;scanf("%d%d%d",&n,&a,&b);
memset(cnt,0,sizeof(cnt));
for(int i=0;i<10;i++) vec[i].clear();
for(int i=0;i<n;i++){
int tmp;scanf("%d",&tmp);t[i]=tmp;
cnt[tmp+2]++;
vec[tmp+2].push_back(i+1);
}
ans.clear();ans2.clear();
if(cnt[0] + cnt[1] == n && a==b&&a%2)
{
for(int i=0;i<vec[1].size()&&ans.size()<a;i++) ans.push_back(vec[1][i]);
for(int i=0;i<vec[0].size()&&ans.size()<a;i++) ans.push_back(vec[0][i]);
printf("Case #%d:\n",cas);
printf("%d\n",ans.size());
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++) printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
continue;
}
if(cnt[4]>=b){
for(int i=0;i<b;i++) ans.push_back(vec[4][i]);
}else if(cnt[4]>=a){
for(int i=0;i+1<vec[0].size()&&ans.size()+2<=b;i+=2) ans.push_back(vec[0][i]),ans.push_back(vec[0][i+1]);
for(int i=0;i<vec[4].size()&&ans.size()<b;i++) ans.push_back(vec[4][i]);
if(ans.size()+2<=b&&(cnt[0]%2)&&cnt[1]){
ans.push_back(vec[1][0]);
ans.push_back(vec[0][vec[0].size()-1]);
}
}else{
int flag=0;
for(int i=0;i+1<vec[0].size()&&ans.size()+2<=b;i+=2) ans.push_back(vec[0][i]),ans.push_back(vec[0][i+1]);
for(int i = 0; i < ans.size(); i ++)
{
ans2.push_back(ans[i]);
}
for(int i=0;i<vec[4].size()&&ans.size()<b;i++) ans.push_back(vec[4][i]);
if(ans.size()+2<=b&&vec[0].size()%2==1&&cnt[1]) flag=1,ans.push_back(vec[0][vec[0].size()-1]),ans.push_back(vec[1][0]);
if(ans.size()<a){
for(int i=flag;i+1<vec[1].size()&&ans.size()+2<=b;i+=2,flag=i) ans.push_back(vec[1][i]),ans.push_back(vec[1][i+1]);
}
if(ans.size()<a){
for(int i=0;i<vec[3].size()&&ans.size()<a;i++) ans.push_back(vec[3][i]);
}
if(ans.size()<a){
for(int i=0;i<vec[2].size()&&ans.size()<a;i++) ans.push_back(vec[2][i]);
}
int ope = 1;
if(ans.size()<a && flag < vec[1].size()){
ope *= -1;
for(int i=flag;i<vec[1].size()&&ans.size()<a;i++) ans.push_back(vec[1][i]);
}
if(ans.size()<a&&(cnt[0]%2))
{
ans.push_back(vec[0][vec[0].size()-1]);
ope *= -1;
// puts("-------");
}
if(ope == -1 && cnt[4] && a != n)
{
for(int i=0;i+1<vec[4].size()&&ans2.size()<b;i++) ans2.push_back(vec[4][i]);
if(ans2.size()+2<=b&&vec[0].size()%2==1&&cnt[1]) flag=1,ans2.push_back(vec[0][vec[0].size()-1]),ans2.push_back(vec[1][0]);
if(ans2.size()<a){
for(int i=flag;i+1<vec[1].size()&&ans2.size()+2<=b;i+=2,flag=i) ans2.push_back(vec[1][i]),ans2.push_back(vec[1][i+1]);
}
if(ans2.size()<a){
for(int i=0;i<vec[3].size()&&ans2.size()<a;i++) ans2.push_back(vec[3][i]);
}
if(ans2.size()<a){
for(int i=0;i<vec[2].size()&&ans2.size()<a;i++) ans2.push_back(vec[2][i]);
}
if(ans2.size()<a){
for(int i=flag;i<vec[1].size()&&ans2.size()<a;i++) ans2.push_back(vec[1][i]);
}
ans.clear();
for(int i = 0; i < ans2.size(); i ++)
{
ans.push_back(ans2[i]);
}
}
}
// LL tmp=1;
// for(int i=0;i<ans.size();i++) tmp*=1ll*t[ans[i]-1];
// printf("%lld\n",tmp);
// if(ans.size()<a) while(1);
printf("Case #%d:\n",cas);
printf("%d\n",ans.size());
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++) printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
}
}
/*
4
16
0
16
8
32
0
2
1616
8 7 7
-2 -2 2 2 2 2 -1 -1
8 7 7
-2 -2 -2 -2 -2 -2 -1 -1
8 6 6
-2 -2 -2 -2 -2 -2 -1 -1
*/
Problem F UVALive 7219 Problem on Group Trip
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = 222;
struct Node
{
int a[4], id, now;
bool operator < (const Node& rhs) const
{
return id > rhs.id;
}
};
int ed[4];
int main()
{
int T, cas = 1, n;
scanf("%d", &T);
while(T --)
{
scanf("%d", &n);
priority_queue<Node> Q[4];
for(int i = 0; i < n; i ++)
{
int c = -1, a[4];
Node tmp;
tmp.id = i; tmp.now = 0;
for(int j = 0; j < 3; j ++)
{
scanf("%d", &a[j]);
if(c == -1 && a[j]) c = j;
tmp.a[j] = a[j];
}
if(c != -1) Q[c].push(tmp);
}
int ans = 0;
CLR(ed, 0);
priority_queue<Node> Ql[4];
while(!Q[0].empty())
{
Node tmp = Q[0].top();
Q[0].pop();
ed[0] += tmp.a[0];
tmp.now = tmp.id;
tmp.id = ed[0];
if(tmp.a[1]) Ql[1].push(tmp);
else if(tmp.a[2]) Ql[2].push(tmp);
}
while(!Q[1].empty() || !Ql[1].empty())
{
// printf("%d -> %d %d\n", Q[1].top().id, Q[1].top().now, ed[1]);
if(!Q[1].empty())
{
Node tmp = Q[1].top();
Q[1].pop();
ed[1] += tmp.a[1];
tmp.now = tmp.id;
tmp.id = ed[1];
if(tmp.a[2]) Ql[2].push(tmp);
}
while(!Ql[1].empty() && Ql[1].top().id <= ed[1])
{
Node tmp = Ql[1].top();
Ql[1].pop();
swap(tmp.now, tmp.id);
Q[1].push(tmp);
}
if(Q[1].empty())
{
if(Ql[1].empty()) break;
// puts("-----");
ed[1] = Ql[1].top().id;
Node tmp = Ql[1].top();
swap(tmp.now, tmp.id);
Q[1].push(tmp);
Ql[1].pop();
}
}
// puts("----");
while(!Q[2].empty() || !Ql[2].empty())
{
if(!Q[2].empty())
{
Node tmp = Q[2].top();
Q[2].pop();
ed[2] += tmp.a[2];
}
while(!Ql[2].empty() && Ql[2].top().id <= ed[2])
{
Node tmp = Ql[2].top();
Ql[2].pop();
swap(tmp.now, tmp.id);
Q[2].push(tmp);
}
if(Q[2].empty())
{
if(Ql[2].empty()) break;
ed[2] = Ql[2].top().id;
Node tmp = Ql[2].top();
swap(tmp.now, tmp.id);
Q[2].push(tmp);
Ql[2].pop();
}
}
// printf("%d -- %d -- %d\n", ed[0], ed[1], ed[2]);
printf("Case #%d: %d\n", cas ++, max(max(ed[0], ed[1]), ed[2]));
}
return 0;
}
Problem G UVALive 7220 Dungeon Trap
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
char s[200][200];
int vis[200][200][10];
pair<int, int> a, b;
int n, m;
struct node{
int x, y, z;
node(){}
node(int a, int b, int c) : x(a), y(b), z(c){}
};
int nextx[] = {0, 0, 1, -1};
int nexty[] = {1, -1, 0, 0};
void bfs() {
queue<node> q;
memset(vis, inf, sizeof vis);
vis[a.xx][a.yy][0] = 0;
q.push(node(a.xx, a.yy, 0));
while(!q.empty()) {
node now = q.front();
// printf("%d %d %d -> \n", now.x, now.y, now.z);
q.pop();
for(int i = 0; i < 4; i ++) {
int xx = now.x + nextx[i];
int yy = now.y + nexty[i];
int zz = now.z;
if(xx < 0 || yy < 0 || xx >= n || yy >= m) continue;
int val = vis[now.x][now.y][now.z];
if(s[xx][yy] == '0') continue;
if(s[xx][yy] != 'A' && s[xx][yy] != 'B') {
// printf("%d\n", val);
val += s[xx][yy] - '0';
// printf("%d %d -> %c ", xx, yy, s[xx][yy]);
zz = max(zz, s[xx][yy] - '0');
// printf("%d %d\n", val, zz);
}
if(vis[xx][yy][zz] <= val) continue;
vis[xx][yy][zz] = val;
q.push(node(xx, yy, zz));
}
}
}
int main() {
int t, cas = 1;
cin >> t;
while(t --) {
cin >> n >> m;
int sum = 0;
for(int i = 0; i < n; i ++) {
scanf("%s", s[i]);
for(int j = 0; j < m; j ++) {
if(s[i][j] == 'A') a = MP(i, j);
else if(s[i][j] == 'B') b = MP(i, j);
else sum += s[i][j] - '0';
}
}
bfs();
int ans = 0;
for(int i = 0; i <= 9; i ++) {
if(vis[b.xx][b.yy][i] >= inf) continue;
ans = max(ans, sum - vis[b.xx][b.yy][i] + i);
}
printf("Case #%d: %d\n", cas ++, ans);
}
return 0;
}
Problem I UVALive 7222 National Disaster
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn=222;
int x[maxn],y[maxn],tmp[maxn],l[maxn];
int mp[maxn][maxn],sum[maxn][maxn],dp[maxn];
bool vis[maxn];
LL dis[maxn*maxn];
pair<LL,int> mk[maxn][maxn];
LL sqr(LL x){
return x*x;
}
LL dist(LL x1,LL y1,LL x2,LL y2){
return sqr(x2-x1)+sqr(y2-y1);
}
int main(){
int T;scanf("%d",&T);
for(int cas=1;cas<=T;cas++){
int n;scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&x[i]);
for(int i=0;i<n;i++) scanf("%d",&y[i]);
memset(vis,0,sizeof(vis));
memset(mp,0,sizeof(mp));
int m=0;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++) dis[m++]=dist(x[i],y[i],x[j],y[j]);
}
sort(dis,dis+m);
m=unique(dis,dis+m)-dis;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++) mk[i][j]=make_pair(dist(x[i],y[i],x[j],y[j]),j);
sort(mk[i],mk[i]+n);
for(int j=0;j<n;j++) scanf("%d",&tmp[j]);
for(int j=0;j<n;j++) mp[i][j]=tmp[mk[i][j].second];
sum[i][0]=1;
for(int j=1;j<n;j++) sum[i][j]=sum[i][j-1]+mp[i][j];
}
memset(l,0,sizeof(l));
int ansZ=maxn*maxn;
LL ansY;
for(int i=0;i<m;i++){
int now=0;
for(int j=0;j<n;j++){
while(l[j]<n&&mk[j][l[j]].first<=dis[i]) l[j]++;
now+=abs(sum[j][l[j]-1]-l[j])+abs(sum[j][n-1]-sum[j][l[j]-1]);
}
if(now<ansZ) ansZ=now,ansY=dis[i];
}
printf("Case #%d: %lld %d\n",cas,ansY,ansZ);
}
return 0;
}
Problem K UVALive 7224 Amplified Energy
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
double u[12000];
double v[12000];
double readNext() {
char s[100];
scanf("%s", s);
int now = 0, pos = 0, next = 0;
for(; s[pos] != '/'; pos ++) {
now = now * 10 + s[pos] - '0';
}
for(pos ++; s[pos]; pos ++) {
next = next * 10 + s[pos] - '0';
}
// printf("%d %d\n", now, next);
return 1.0 * now / next;
}
double dp[20000][20];
pair<int, int> path[20000][20];
int ansList[100];
int main() {
int t, n, k, cas = 1;
cin >> t;
while(t --) {
cin >> n >> k;
for(int i = 1; i <= n; i ++) {
u[i] = readNext();
u[i] = log(u[i]);
}
vector<pair<double, int> > s;
for(int i = 1; i <= k; i ++) {
v[i] = readNext();
v[i] = log(v[i]);
s.push_back(MP(v[i], i));
}
// for(int i = 1; i <= n; i ++) {
// printf("%f ", u[i]);
// }
// puts("");
//
// for(int i = 1; i <= k; i ++) {
// printf("%f ", v[i]);
// }
// puts("");
sort(s.begin(), s.end());
reverse(s.begin(), s.end());
for(int i = 0; i <= n; i ++) {
for(int j = 0; j <= k; j ++) {
dp[i][j] = -1e50;
}
}
dp[0][0] = 0;
int ansi, ansj;
double ans = -1e50;
for(int i = 1; i <= n; i ++) {
for(int j = k; j >= 0; j --) {
if(j) {
double val1 = dp[i - 1][j - 1] + s[j - 1].xx;
double val2 = dp[i - 1][j] + u[i];
if(val2 < val1) {
dp[i][j] = val1;
path[i][j] = MP(i - 1, j - 1);
} else {
dp[i][j] = val2;
path[i][j] = MP(i - 1, j);
}
} else {
dp[i][0] = dp[i - 1][0] + u[i];
path[i][0] = MP(i - 1, 0);
}
if(u[i] >= dp[i][j]) {
dp[i][j] = u[i];
path[i][j] = MP(0, 0);
}
if(j) {
if(s[j - 1].xx > dp[i][j]) {
dp[i][j] = s[j - 1].xx;
path[i][j] = MP(0, 0);
}
}
if(dp[i][j] >= ans) {
ans = dp[i][j];
ansi = i;
ansj = j;
}
}
}
printf("Case #%d:\n", cas ++);
memset(ansList, 0, sizeof ansList);
int l = ansi, r = ansi;
while(1) {
if(ansi == 0 && ansj == 0) break;
l = ansi;
int nexti = path[ansi][ansj].xx;
int nextj = path[ansi][ansj].yy;
if(nextj != ansj) {
int id = nextj;
ansList[s[id].yy] = ansi;
}
ansi = nexti;
ansj = nextj;
}
printf("%d %d\n", l, r);
for(int i = 1; i <= k; i ++) {
printf("%d%c", ansList[i], i == k ? '\n' : ' ');
}
}
return 0;
}
Problem L UVALive 7225 Summation and Divisor
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = 111;
LL a[maxn];
LL gcd(LL a, LL b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int T, cas = 1, n, m;
scanf("%d", &T);
while(T --)
{
scanf("%d", &n);
LL sum = 0, g = 0;
for(int i = 0; i < n; i ++)
{
scanf("%d", &m);
for(int j = 0; j < m; j ++)
{
scanf("%lld", &a[j]);
}
sort(a, a + m);
sum += a[0];
for(int j = 1; j < m; j ++)
{
g = gcd(g, a[j] - a[j - 1]);
}
}
g = gcd(sum, g);
printf("Case #%d: %lld\n", cas ++, g);
}
return 0;
}