t1:模拟
void solve(){
int l, r;
cin >> l >>r;
if(l==1&&r==1||l==0&&r==0){
cout <<"Invalid" <<endl;
}
else if(l == 1 && r == 0){
yes;
}
else {
no;
}
}
t2:取代模拟
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> q[i][j];
}
}
int ans = 1;
for (int i = 1; i <= n; i++) {
if (i >= ans) {
ans = q[i][ans];
} else {
ans = q[ans][i];
}
}
cout << ans << endl;
}
t3:
只需要对于每个si和ti不同的位置更改即可,最优的方法是:
如果si>ti,那就优先更改当前位,这样改后的 s的字典序更小。
如果 si<ti,那就先更改后面位的,最后再改当前位,这样得到的 s的字典序最小。
void solve() {
string a, b;
cin >> a >> b;
vector<string> alls;
while ( a != b) {
vector<int>temp;
for (int i = 0; i < a.size(); i++) {
if (a[i] != b[i]) {
temp.push_back(i);
}
}
bool f = false;
for (auto i : temp) {
if (a[i] > b[i]) {
a[i] = b[i];
f = true;
break;
}
}
if (!f) {
int t = temp.back();
a[t] = b[t];
}
alls.push_back(a);
}
cout << alls.size() << endl;
for (auto i : alls)cout << i << endl;
}
t4:对于存在墙的地方,直接消除当前墙即可,对于当前无墙的地方需要上下左右到有墙,或者到底。
用两个set记录一下剩余的墙的行,列坐标,在查询里使用lwb即可在限制之内
int n,m,q;
vector<set<int>> S,T;
vector<vector<bool>>st;
void erase(int x,int y){
S[x].erase(y);
T[y].erase(x);
st[x][y]=false;
}
set<int>::iterator F(set<int>::iterator x){
x--;
return x;
}
void solve(){
cin >> n >> m >> q;
S.resize(n+1);
T.resize(m+1);
st.resize(n+1);
for(int i = 1;i<=n;i++){
st[i].resize(m+1);
for(int j = 1;j<=m;j++){
S[i].insert(j);
T[j].insert(i);
st[i][j] = true;
}
}
while(q--){
int x,y;
cin >> x >> y;
if(st[x][y]){
erase(x,y);
}
else{
if(S[x].size()&&*S[x].begin()<y){
erase(x,S[x].size()==1?*S[x].begin():*F(S[x].lower_bound(y)));
}
if(S[x].size()&&*S[x].rbegin()>y){
erase(x,*S[x].lower_bound(y));
}
if(T[y].size()&&*T[y].begin()<x){
erase(T[y].size()==1 ? *T[y].begin():*F(T[y].lower_bound(x)),y);
}
if(T[y].size()&&*T[y].rbegin()>x){
erase(*T[y].lower_bound(x),y);
}
}
}
int ans = 0;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
ans += st[i][j];
}
}
cout << ans << endl;
}