Uva 12096
自己代码
#include <bits/stdc++.h>
using namespace std;
typedef set<int> Set;
map<Set, int> mark;
int cnt = 0;
Set s[2010];
int ID(Set x){
if(!mark.count(x)) {
mark[x] = cnt++;
s[mark[x]] = x;
}
return mark[x];
}
int main()
{
int t;
cin >> t;
while( t--){
int n;
cin >> n;
cnt = 0;
mark.clear();
stack<int> sta;
for(int i = 0; i < 2000; i++) s[i].clear();
for(int i = 0; i < n; i++){
string quer;
cin >> quer;
if(quer[0] == 'P') sta.push(ID(Set()));
else if(quer[0] == 'D') sta.push(sta.top());
else{
Set x1 = s[sta.top()]; sta.pop();
Set x2 = s[sta.top()]; sta.pop();
Set x;
//printf(" x1 %d x2 %d\n", ID(x1), ID(x2));
//cout<<quer[0]<<endl;
if(quer[0] == 'U') set_union(x1.begin(), x1.end(), x2.begin(), x2.end(), inserter(x, x.begin()));
if(quer[0] == 'I') set_intersection(x1.begin(), x1.end(), x2.begin(), x2.end(), inserter(x, x.begin()));
if(quer[0] == 'A') x = x2, x.insert(ID(x1));
sta.push(ID(x));
}
printf("%d\n", s[sta.top()].size());
}
printf("***\n");
}
return 0;
}
代码库:
#include <iostream>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
typedef set<int> Set;
map<Set,int> IDcache;
vector<Set> Setcache;
int ID(Set x)
{
if(IDcache.count(x)) return IDcache[x];
Setcache.push_back(x);
return IDcache[x]=Setcache.size()-1;
}
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
stack<int> s;
int main(void)
{
int n;
cin>>n;
while(n--)
{
int m;
cin>>m;
for(int i=0;i<m;i++)
{
string op;
cin>>op;
if(op[0]=='P') s.push(ID(Set()));
else if(op[0]=='D') s.push(s.top());
else
{
Set x1=Setcache[s.top()];s.pop();
Set x2=Setcache[s.top()];s.pop();
Set x;
if(op[0]=='U') set_union(ALL(x1),ALL(x2),INS(x));
if(op[0]=='I') set_intersection(ALL(x1),ALL(x2),INS(x));
if(op[0]=='A') {x=x2;x.insert(ID(x1));}
s.push(ID(x));
}
cout<<Setcache[s.top()].size()<<endl;
}
cout<<"***"<<endl;
}
return 0;
}
uva 540
// UVa540 Team Queue
// Rujia Liu
#include<cstdio>
#include<queue>
#include<map>
using namespace std;
const int maxt = 1000 + 10;
int main() {
int t, kase = 0;
while(scanf("%d", &t) == 1 && t) {
printf("Scenario #%d\n", ++kase);
// 记录所有人的团队编号
map<int, int> team; // team[x]表示编号为x的人所在的团队编号
for(int i = 0; i < t; i++) {
int n, x;
scanf("%d", &n);
while(n--) { scanf("%d", &x); team[x] = i; }
}
// 模拟
queue<int> q, q2[maxt]; // q是团队的队列,而q2[i]是团队i成员的队列
for(;;) {
int x;
char cmd[10];
scanf("%s", cmd);
if(cmd[0] == 'S') break;
else if(cmd[0] == 'D') {
int t = q.front();
printf("%d\n", q2[t].front()); q2[t].pop();
if(q2[t].empty()) q.pop(); // 团体t全体出队列
}
else if(cmd[0] == 'E') {
scanf("%d", &x);
int t = team[x];
if(q2[t].empty()) q.push(t); // 团队t进入队列
q2[t].push(x);
}
}
printf("\n");
}
return 0;
}
uva 136
// UVa136 Ugly Numbers
// Rujia Liu
#include<iostream>
#include<vector>
#include<queue>
#include<set>
using namespace std;
typedef long long LL;
const int coeff[3] = {2, 3, 5};
int main() {
priority_queue<LL, vector<LL>, greater<LL> > pq;
set<LL> s;
pq.push(1);
s.insert(1);
for(int i = 1; ; i++) {
LL x = pq.top(); pq.pop();
if(i == 1500) {
cout << "The 1500'th ugly number is " << x << ".\n";
break;
}
for(int j = 0; j < 3; j++) {
LL x2 = x * coeff[j];
if(!s.count(x2)) { s.insert(x2); pq.push(x2); }
}
}
return 0;
}
uva 400
// UVa400 Unix ls
// Rujia Liu
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxcol = 60;
const int maxn = 100 + 5;
string filenames[maxn];
// 输出字符串s,长度不足len时补字符extra
void print(const string& s, int len, char extra) {
cout << s;
for(int i = 0; i < len-s.length(); i++)
cout << extra;
}
int main() {
int n;
while(cin >> n) {
int M = 0;
for(int i = 0; i < n; i++) {
cin >> filenames[i];
M = max(M, (int)filenames[i].length());
}
// 计算列数cols和行数rows
int cols = (maxcol - M) / (M + 2) + 1, rows = (n - 1) / cols + 1;
print("", 60, '-');
cout << "\n";
sort(filenames, filenames+n);
for(int r = 0; r < rows; r++) {
for(int c = 0; c < cols; c++) {
int idx = c * rows + r;
if(idx < n) print(filenames[idx], c == cols-1 ? M : M+2, ' ');
}
cout << "\n";
}
}
return 0;
}
uva 1592
// UVa1592 Database
// Rujia Liu
// 本程序只是为了演示STL各种用法,效率较低。实践中一般用C字符串和哈希表来实现。
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
#include<map>
#include<sstream>
using namespace std;
typedef pair<int,int> PII;
const int maxr = 10000 + 5;
const int maxc = 10 + 5;
int m, n, db[maxr][maxc], cnt;
map<string, int> id;
int ID(const string& s) {
if(!id.count(s)) {
id[s] = ++cnt;
}
return id[s];
}
void find() {
for(int c1 = 0; c1 < m; c1++)
for(int c2 = c1+1; c2 < m; c2++) {
map<PII, int> d;
for(int i = 0; i < n; i++) {
PII p = make_pair(db[i][c1], db[i][c2]);
if(d.count(p)) {
printf("NO\n");
printf("%d %d\n", d[p]+1, i+1);
printf("%d %d\n", c1+1, c2+1);
return;
}
d[p] = i;
}
}
printf("YES\n");
}
int main() {
string s;
while(getline(cin, s)) {
stringstream ss(s);
if(!(ss >> n >> m)) break;
cnt = 0;
id.clear();
for(int i = 0; i < n; i++) {
getline(cin, s);
int lastpos = -1;
for(int j = 0; j < m; j++) {
int p = s.find(',', lastpos+1);
if(p == string::npos) p = s.length();
db[i][j] = ID(s.substr(lastpos+1, p - lastpos - 1));
lastpos = p;
}
}
find();
}
return 0;
}
uva 207
// UVa207 PGA Tour Prize Money
// Rujia Liu
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cassert>
using namespace std;
#define REP(i,n) for(int i = 0; i < (n); i++)
const int maxn = 144;
const int n_cut = 70;
struct Player {
char name[25];
int amateur;
int sc[4];
int sc36, sc72, dq;
int rnds;
} player[maxn];
int n;
double purse, p[n_cut];
bool cmp1(const Player& p1, const Player& p2) {
if(p1.sc36 < 0 && p2.sc36 < 0) return false; // equal
if(p1.sc36 < 0) return false; // p2 smaller
if(p2.sc36 < 0) return true; // p1 smaller
return p1.sc36 < p2.sc36;
}
bool cmp2(const Player& p1, const Player& p2) {
if(p1.dq && p2.dq) {
if(p1.rnds != p2.rnds) return p2.rnds < p1.rnds;
if(p1.sc72 != p2.sc72) return p1.sc72 < p2.sc72;
return strcmp(p1.name, p2.name) < 0;
}
if(p1.dq) return false;
if(p2.dq) return true;
if(p1.sc72 != p2.sc72) return p1.sc72 < p2.sc72;
return strcmp(p1.name, p2.name) < 0;
}
void print_result() {
printf("Player Name Place RD1 RD2");
printf(" RD3 RD4 TOTAL Money Won\n");
printf("---------------------------------------");
printf("--------------------------------\n");
int i = 0, pos = 0;
while(i < n) {
if(player[i].dq) {
printf("%s ",player[i].name);
REP(j,player[i].rnds) printf("%-5d", player[i].sc[j]);
REP(j,4-player[i].rnds) printf(" ");
printf("DQ\n");
i++;
continue;
}
int j = i;
int m = 0; // number of tied players
bool have_money = false;
double tot = 0.0; // total pooled money
while(j < n && player[i].sc72 == player[j].sc72) {
if(!player[j].amateur) {
m++;
if(pos < n_cut) {
have_money = true; // yeah! they still have money
tot += p[pos++];
}
}
j++;
}
// print player [i,j) together because they have the same rank
int rank = i + 1; // rank of all these m players
double amount = purse * tot / m; // if m=0, amount will be nan but we don't use it in that case :)
while(i < j) {
printf("%s ", player[i].name);
char t[5];
sprintf(t, "%d%c", rank, m > 1 && have_money && !player[i].amateur ? 'T' : ' ');
printf("%-10s", t);
REP(e,4) printf("%-5d", player[i].sc[e]);
// with prize
if(!player[i].amateur && have_money) {
printf("%-10d", player[i].sc72);
printf("$%9.2lf\n", amount / 100.0);
} else
printf("%d\n", player[i].sc72);
i++;
}
}
}
int main() {
int T;
char s[40];
gets(s);
sscanf(s,"%d",&T);
while(T--) {
gets(s); // empty line
// prize
gets(s);
sscanf(s,"%lf", &purse);
REP(i,n_cut) {
gets(s);
sscanf(s, "%lf", &p[i]);
}
// players
gets(s);
sscanf(s, "%d", &n);
assert(n <= 144);
REP(k,n) {
// read a 32-character line
gets(s);
// player name
strncpy(player[k].name, s, 20);
player[k].name[20] = 0;
player[k].amateur = 0;
if(strchr(player[k].name, '*')) {
player[k].amateur = 1;
}
// scores
player[k].sc36 = player[k].sc72 = player[k].dq=0;
memset(player[k].sc, -1, sizeof(player[k].sc));
REP(i,4) {
// raw score
char t[5];
REP(j,3) t[j] = s[20 + i*3 + j]; t[3] = '\0';
// parse
if(!sscanf(t,"%d", &player[k].sc[i])) {
// DQ!
player[k].rnds = i;
player[k].dq = -1;
if(i < 2) player[k].sc36 = -1;
break; // skip other rounds (filled with -1, initially)
} else {
player[k].sc72 += player[k].sc[i];
if(i < 2)
player[k].sc36 += player[k].sc[i];
}
}
}
// round 1
sort(player, player+n, cmp1);
assert(player[n_cut-1].sc36 >= 0);
for(int i = n_cut-1; i < n; i++)
if(i == n-1 || player[i].sc36 != player[i+1].sc36) { n = i+1; break; }
// round 2
sort(player, player+n, cmp2);
// print result
print_result();
if(T) printf("\n");
}
return 0;
}
uva 814
// UVa814 The Letter Carrier's Rounds
// Rujia Liu
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
using namespace std;
void parse_address(const string& s, string& user, string& mta) {
int k = s.find('@');
user = s.substr(0, k);
mta = s.substr(k+1);
}
int main() {
int k;
string s, t, user1, mta1, user2, mta2;
set<string> addr;
// 输入所有MTA,转化为地址列表
while(cin >> s && s != "*") {
cin >> s >> k;
while(k--) { cin >> t; addr.insert(t + "@" + s); }
}
while(cin >> s && s != "*") {
parse_address(s, user1, mta1); // 处理发件人地址
vector<string> mta; // 所有需要连接的mta,按照输入顺序
map<string, vector<string> > dest; // 每个mta需要发送的用户
set<string> vis;
while(cin >> t && t != "*") {
parse_address(t, user2, mta2); // 处理收件人地址
if(vis.count(t)) continue; // 重复的收件人
vis.insert(t);
if(!dest.count(mta2)) { mta.push_back(mta2); dest[mta2] = vector<string>(); }
dest[mta2].push_back(t);
}
getline(cin, t); // 把"*"这一行的回车吃掉
// 输入邮件正文
string data;
while(getline(cin, t) && t[0] != '*') data += " " + t + "\n";
for(int i = 0; i < mta.size(); i++) {
string mta2 = mta[i];
vector<string> users = dest[mta2];
cout << "Connection between " << mta1 << " and " << mta2 <<endl;
cout << " HELO " << mta1 << "\n";
cout << " 250\n";
cout << " MAIL FROM:<" << s << ">\n";
cout << " 250\n";
bool ok = false;
for(int i = 0; i < users.size(); i++) {
cout << " RCPT TO:<" << users[i] << ">\n";
if(addr.count(users[i])) { ok = true; cout << " 250\n"; }
else cout << " 550\n";
}
if(ok) {
cout << " DATA\n";
cout << " 354\n";
cout << data;
cout << " .\n";
cout << " 250\n";
}
cout << " QUIT\n";
cout << " 221\n";
}
}
return 0;
}
uva 221
// UVa221 Urban Elevations
// Rujia Liu
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100 + 5;
struct Building {
int id;
double x, y, w, d, h;
bool operator < (const Building& rhs) const {
return x < rhs.x || (x == rhs.x && y < rhs.y);
}
} b[maxn];
int n;
double x[maxn*2];
bool cover(int i, double mx) {
return b[i].x <= mx && b[i].x+b[i].w >= mx;
}
// 判断建筑物i在x=mx处否可见
bool visible(int i, double mx) {
if(!cover(i, mx)) return false;
for(int k = 0; k < n; k++)
if(b[k].y < b[i].y && b[k].h >= b[i].h && cover(k, mx)) return false;
return true;
}
int main() {
int kase = 0;
while(scanf("%d", &n) == 1 && n) {
for(int i = 0; i < n; i++) {
scanf("%lf%lf%lf%lf%lf", &b[i].x, &b[i].y, &b[i].w, &b[i].d, &b[i].h);
x[i*2] = b[i].x; x[i*2+1] = b[i].x + b[i].w;
b[i].id = i+1;
}
sort(b, b+n);
sort(x, x+n*2);
int m = unique(x, x+n*2) - x; // x坐标排序后去重,得到m个坐标
if(kase++) printf("\n");
printf("For map #%d, the visible buildings are numbered as follows:\n%d", kase, b[0].id);
for(int i = 1; i < n; i++) {
bool vis = false;
for(int j = 0; j < m-1; j++)
if(visible(i, (x[j] + x[j+1]) / 2)) { vis = true; break; }
if(vis) printf(" %d", b[i].id);
}
printf("\n");
}
return 0;
}