AtCoder Regular Contest 205 (Div. 2)
A - 2x2 Erasing
按从上到下从左到右的顺序将每一个合法 \(2\times 2\) 矩形的左上角涂黑是合法的,二维前缀和维护即可。
#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define repll(i,l,r) for(ll i=(l),qwp=(r);i<=qwp;i++)
#define perll(i,r,l) for(ll i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define ins insert
#define clr clear
#define ers(S,X) (S).erase((S).find((X)))
#define uset unordered_set
#define umap unordered_map
#define mset multiset
using namespace std;
namespace ax_by_c{
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
constexpr int N=505;
int n,q,a[N][N];
char s[N][N];
void slv(int _csid,int _csi){
scanf("%d %d",&n,&q);
rep(i,1,n)scanf("%s",s[i]+1);
rep(i,1,n-1)rep(j,1,n-1){
if(s[i][j]=='.'&&s[i+1][j]=='.'&&s[i][j+1]=='.'&&s[i+1][j+1]=='.')a[i][j]=1;
a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
}
rep(_,1,q){
int xl,xr,yl,yr;
scanf("%d %d %d %d",&xl,&xr,&yl,&yr);
xr--,yr--;
printf("%d\n",a[xr][yr]-a[xl-1][yr]-a[xr][yl-1]+a[xl-1][yl-1]);
}
}
void main(){
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1,csid=-1;
// scanf("%d",&csid);
// scanf("%d",&T);
// scanf("%d",&csid);
rep(i,1,T)slv(csid,i);
}
}
int main(){
string __name="";
if(__name!="")freopen((__name+".in").c_str(),"r",stdin),freopen((__name+".out").c_str(),"w",stdout);
ax_by_c::main();
return 0;
}
/*
g++ -std=c++14 -O2 -Wall -Wextra "-Wl,--stack=200000000" A.cpp -o A.exe
A.exe
*/
B - Triangle Toggle
容易发现每个点连出的白边个数的奇偶性不变,将奇数两两配对即可使白边最少即黑边最多。
#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define repll(i,l,r) for(ll i=(l),qwp=(r);i<=qwp;i++)
#define perll(i,r,l) for(ll i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define ins insert
#define clr clear
#define ers(S,X) (S).erase((S).find((X)))
#define uset unordered_set
#define umap unordered_map
#define mset multiset
using namespace std;
namespace ax_by_c{
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
constexpr int N=2e5+5;
int n,m,a[N];
void slv(int _csid,int _csi){
scanf("%d %d",&n,&m);
rep(i,1,m){int x,y;scanf("%d %d",&x,&y),a[x]^=1,a[y]^=1;}
int cnt=0;rep(i,1,n)if(a[i])cnt++;
if(n%2==1)printf("%lld\n",(ll)n*(n-1)/2-cnt/2);
else printf("%lld\n",(ll)n*(n-1)/2-(n-cnt)/2);
}
void main(){
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1,csid=-1;
// scanf("%d",&csid);
// scanf("%d",&T);
// scanf("%d",&csid);
rep(i,1,T)slv(csid,i);
}
}
int main(){
string __name="";
if(__name!="")freopen((__name+".in").c_str(),"r",stdin),freopen((__name+".out").c_str(),"w",stdout);
ax_by_c::main();
return 0;
}
/*
g++ -std=c++14 -O2 -Wall -Wextra "-Wl,--stack=200000000" A.cpp -o A.exe
A.exe
*/
C - No Collision Moves
若有包含关系或相交且反向的则无解,否则只可能是相邻的有限制,用循环可实现拓扑排序。
#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define repll(i,l,r) for(ll i=(l),qwp=(r);i<=qwp;i++)
#define perll(i,r,l) for(ll i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define ins insert
#define clr clear
#define ers(S,X) (S).erase((S).find((X)))
#define uset unordered_set
#define umap unordered_map
#define mset multiset
using namespace std;
namespace ax_by_c{
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
constexpr int intinf=2e9;
constexpr int N=2e5+5;
int n;
struct node{int s,t,id;}a[N];
bool cmp(node x,node y){return min(x.s,x.t)<min(y.s,y.t);}
bool rem[N];
bool check(int i){
if(rem[i])return 0;
if(i!=n&&a[i].s<a[i].t&&a[i+1].s<a[i].t&&!rem[i+1])return 0;
if(i!=1&&a[i].s>a[i].t&&a[i-1].s>a[i].t&&!rem[i-1])return 0;
return 1;
}
void slv(int _csid,int _csi){
scanf("%d",&n);
rep(i,1,n)scanf("%d %d",&a[i].s,&a[i].t),a[i].id=i;
sort(a+1,a+1+n,cmp);
int mnr=intinf;
per(i,n,1){
if(mnr<max(a[i].s,a[i].t))return (void)(puts("No"));
mnr=min(mnr,max(a[i].s,a[i].t));
}
rep(i,1,n-1)if(((a[i].s<a[i].t)^(a[i+1].s<a[i+1].t))&&(max(a[i].s,a[i].t)>min(a[i+1].s,a[i+1].t)))return (void)(puts("No"));
puts("Yes");
rep(i,1,n)if(check(i)){
printf("%d ",a[i].id),rem[i]=1;
per(j,i-1,1){
if(!check(j))break;
printf("%d ",a[j].id),rem[j]=1;
}
rep(j,i+1,n){
if(!check(j))break;
printf("%d ",a[j].id),rem[j]=1;
}
}
}
void main(){
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1,csid=-1;
// scanf("%d",&csid);
// scanf("%d",&T);
// scanf("%d",&csid);
rep(i,1,T)slv(csid,i);
}
}
int main(){
string __name="";
if(__name!="")freopen((__name+".in").c_str(),"r",stdin),freopen((__name+".out").c_str(),"w",stdout);
ax_by_c::main();
return 0;
}
/*
g++ -std=c++14 -O2 -Wall -Wextra "-Wl,--stack=200000000" A.cpp -o A.exe
A.exe
*/
D - Non-Ancestor Matching
若没有超过总大小一半的子树则可以将子树中所有点(除了根)全部匹配,否则将其他子树看成一个新子树递归即可,注意新子树中点是可以与新根匹配的,且这样一定是优的。
#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define repll(i,l,r) for(ll i=(l),qwp=(r);i<=qwp;i++)
#define perll(i,r,l) for(ll i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define ins insert
#define clr clear
#define ers(S,X) (S).erase((S).find((X)))
#define uset unordered_set
#define umap unordered_map
#define mset multiset
using namespace std;
namespace ax_by_c{
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
constexpr int N=5e5+5;
int n,fa[N],sz[N],ans;
vector<int>g[N];
void dfs(int u){sz[u]=1;for(auto v:g[u])dfs(v),sz[u]+=sz[v];}
void dfs1(int u,int k){
if(k>=sz[u])return (void)(ans+=(k+sz[u])/2);
if(k)k--,ans++;
int sum=k,mx=k;
for(auto v:g[u])sum+=sz[v],mx=max(mx,sz[v]);
if(mx*2<=sum)return (void)(ans+=sum/2);
for(auto v:g[u])if(sz[v]==mx)dfs1(v,sum-sz[v]);
}
void slv(int _csid,int _csi){
scanf("%d",&n);
rep(i,1,n)g[i].clr();
rep(i,2,n)scanf("%d",&fa[i]),g[fa[i]].pb(i);
dfs(1);
ans=0,dfs1(1,0);
printf("%d\n",ans);
}
void main(){
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1,csid=-1;
// scanf("%d",&csid);
scanf("%d",&T);
// scanf("%d",&csid);
rep(i,1,T)slv(csid,i);
}
}
int main(){
string __name="";
if(__name!="")freopen((__name+".in").c_str(),"r",stdin),freopen((__name+".out").c_str(),"w",stdout);
ax_by_c::main();
return 0;
}
/*
g++ -std=c++14 -O2 -Wall -Wextra "-Wl,--stack=200000000" A.cpp -o A.exe
A.exe
*/
E - Subset Product Problem
拆高低位,修改时枚举低位的超集,查询时枚举高位的子集即可,时间复杂度 \(O(n\sqrt V)\)。
#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define repll(i,l,r) for(ll i=(l),qwp=(r);i<=qwp;i++)
#define perll(i,r,l) for(ll i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define ins insert
#define clr clear
#define ers(S,X) (S).erase((S).find((X)))
#define uset unordered_set
#define umap unordered_map
#define mset multiset
using namespace std;
namespace ax_by_c{
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
constexpr ll mod=998244353;
constexpr int N=4e5+5;
constexpr int S=(1<<11)+5;
ll f[S][S];
void upd(int x){
int p=x>>10,q=x&((1<<10)-1);
rep(i,0,(1<<10)-1)if((i&q)==q)f[p][i]=f[p][i]*x%mod;
}
ll Q(int x){
int p=x>>10,q=x&((1<<10)-1);
ll res=1;
rep(i,0,(1<<10)-1)if((p&i)==i)res=res*f[i][q]%mod;
return res;
}
int n,a[N];
void slv(int _csid,int _csi){
rep(i,0,(1<<10)-1)rep(j,0,(1<<10)-1)f[i][j]=1;
scanf("%d",&n);
rep(i,1,n)scanf("%d",&a[i]);
rep(i,1,n)upd(a[i]),printf("%lld\n",Q(a[i]));
}
void main(){
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1,csid=-1;
// scanf("%d",&csid);
// scanf("%d",&T);
// scanf("%d",&csid);
rep(i,1,T)slv(csid,i);
}
}
int main(){
string __name="";
if(__name!="")freopen((__name+".in").c_str(),"r",stdin),freopen((__name+".out").c_str(),"w",stdout);
ax_by_c::main();
return 0;
}
/*
g++ -std=c++14 -O2 -Wall -Wextra "-Wl,--stack=200000000" A.cpp -o A.exe
A.exe
*/

浙公网安备 33010602011771号