題目1:Mahmoud and a Dictionary
代碼:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int f[maxn];
int Find(int x)
{
if(f[x]==x)
return x;
else return f[x]=Find(f[x]);
}
char a[100], b[100];
map<string, int>mp;
int main()
{
int n, m, q;
int f1, f2, f3, f4;
scanf("%d %d %d", &n, &m, &q);
for(int i = 1; i <= 2*n; i++)
{
f[i] = i;
}
for(int i = 1; i <= n; i++)
{
scanf("%s", a);
mp[a] = i;
}
for(int i = 1; i <= m; i++)
{
int op;
scanf("%d %s %s", &op, a, b);
int x = mp[a];
int y = mp[b];
if(op == 1)
{
f1 = Find(n+x);
f2 = Find(y);
f3 = Find(x);
f4 = Find(n+y);
if(f1 == f2 || f3 == f4)
{
printf("NO\n");
}
else
{
f[f2] = f3;
f[f1] = f4;
printf("YES\n");
}
}
else
{
f1 = Find(n+x);
f2 = Find(y);
f3 = Find(x);
f4 = Find(n+y);
if(f1 == f4 || f2 == f3)
{
printf("NO\n");
}
else
{
f[f1] = f2;
f[f3] = f4;
printf("YES\n");
}
}
}
for(int i = 1; i <= q; i++)
{
scanf("%s %s", a, b);
int x = mp[a];
int y = mp[b];
f1 = Find(n+x);
f2 = Find(y);
f3 = Find(x);
f4 = Find(n+y);
//cout<<f1<<" "<<f2<<" "<<f3<<" "<<f4<<endl;
if(f1 == f4 || f2 == f3)printf("1\n");
else if(f1 == f2 || f3 == f4){
printf("2\n");
}
else printf("3\n");
}
}
題目2:Igor and his way to work
代碼:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int vis[maxn][maxn][5];
char mp[maxn][maxn];
int dx[maxn] = {1, -1, 0, 0};
int dy[maxn] = {0, 0, 1, -1};
int n, m;
int flag = 0;
void dfs(int x, int y, int dir, int cnt){
if(x <= 0 || x > n || y <= 0 || y > m || cnt > 2)return;
if(vis[x][y][dir] <= cnt)return;
if(mp[x][y] == 'T'){
flag = 1;
return;
}
if(mp[x][y] != '.' && mp[x][y] != 'S')return;
vis[x][y][dir] = cnt;
for(int i = 0; i < 4; i++){
int xx, yy;
xx = x+dx[i];
yy = y+dy[i];
if(dir == -1){
dfs(xx, yy, i, cnt);
}
else if(dir != i){
dfs(xx, yy, i, cnt+1);
}
else dfs(xx, yy, i, cnt);
}
}
int main(){
scanf("%d %d", &n, &m);
int sx, sy;
getchar();
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
scanf("%c", &mp[i][j]);
if(mp[i][j] == 'S')sx = i, sy = j;
}
getchar();
}
flag = 0;
memset(vis, 0x3f, sizeof vis);
dfs(sx, sy, -1, 0);
if(flag)printf("YES\n");
else printf("NO\n");
return 0;
}
題目3:Okabe and Boxes
代碼:
#include<bits/stdc++.h>
using namespace std;
char a[100];
vector<int>v;
int main(){
int n;
scanf("%d", &n);
int cn = 1, ans = 0, t;
for(int i = 1; i <= n*2; i++){
getchar();
scanf("%s", &a);
if(a[0] == 'a')scanf("%d", &t),v.push_back(t);
else {
if(!v.empty() && v.back() != cn){
ans++;
v.clear();
}
else if(!v.empty())v.pop_back();
cn++;
}
}
printf("%d\n", ans);
return 0;
}
題目4:Sorting the Coins
代碼:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
#define Temp template<typename T>
int n, t;
int a[maxn<<2], st[maxn<<2];
Temp inline void read(T &x)
{
x = 0;
T w = 1, ch = getchar();
while(!isdigit(ch) && ch!= '-')ch = getchar();
if(ch == '-')w = -1, ch = getchar();
while(isdigit(ch))x = (x<<3)+(x<<1)+(ch^'0'),ch = getchar();
x = x * w;
}
void build(int o, int l, int r)
{
if(l == r)st[o] = 0;
else
{
int m = l + ((r-l)>>1);
build(o<<1, l, m);
build(o<<1|1, m+1, r);
st[o] = st[o<<1] + st[o<<1|1];
}
}
void update(int o,int l,int r,int ind,int ans)
{
if(l==r)
{
st[o] = ans;
return;
}
int m=l+((r-l)>>1);
if(ind<=m)
{
update(o<<1,l,m,ind,ans);
}
else
{
update((o<<1)|1,m+1,r,ind,ans);
}
st[o]=st[o<<1]+st[(o<<1)|1];
}
int query(int o, int l, int r, int ql, int qr)
{
if(ql<= l && qr >= r)return st[o];
int m = l + ((r-l)>>1);
int ans = 0;
if(ql <= m)ans += query(o<<1, l, m, ql, qr);
if(qr >= m+1)ans += query(o<<1|1, m+1, r, ql, qr);
return ans;
}
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = 1 + l + r >> 1;
//cout<<query(1,1, n, n-mid+1, n)<<endl;
if (query(1,1, n, n-mid+1, n) == mid)
{
l = mid;
//cout<<r<<" jj"<<mid<<endl;
}
else r = mid -1;
}
return l;
}
int vis[maxn];
int main()
{
read(n);
build(1, 1, n);
vis[0] = 1;
for(int i = 1; i <= n; i++)
{
read(t);
update(1, 1, n, t, 1);
if(query(1, 1, n, n, n) == 0)
{
vis[i] = i+1;
continue;
}
int k = bsearch_1(1, n);
vis[i] = i - k+1;
}
for(int i = 0; i <= n; i++)
{
if(i != 0)printf(" ");
printf("%d", vis[i]);
}
printf("\n");
return 0;
}