文章目录
题目
A - Creating a Character
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int x,y,z;
int ans;
scanf("%d%d%d",&x,&y,&z);
if(x>y)ans=min(z,(x+z-y-1)/2)+1;
else{
if(y>=x+z)ans=0;
else ans=(x+z-y-1)/2+1;
}
cout<<ans<<endl;
}
}
B - Zmei Gorynich
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,x;
scanf("%d%d",&n,&x);
int maxs=0,maxv=0;
for(int i=1;i<=n;i++){
int d,h;
scanf("%d%d",&d,&h);
maxv=max(maxv,d);
maxs=max(maxs,d-h);
}
if(x>maxv&&maxs<=0){
puts("-1");
continue;
}
if(x<=maxv){
puts("1");
continue;
}
int l=x-maxv;
int ans=(l+maxs-1)/maxs+1;
cout<<ans<<endl;
}
}
C - The Number Of Good Substrings
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
string s;
cin>>s;
int cnt=0;
int ans=0;
for(int i=0;i<s.size();i++){
if(s[i]=='0')cnt++;
else{
int cur=0;
for(int j=i;j<s.size();j++){
cur<<=1;
if(s[j]=='1')
cur+=1;
if(cnt+j-i+1>=cur){
ans++;
}
else
break;
}
cnt=0;
}
}
cout<<ans<<endl;
}
}
D - Coloring Edges
dfs判环
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e3+10;
struct Edge{
int v,next;
}e[maxn];
int cnt;
int vis[maxn];
int head[maxn];
void add(int u,int v){
cnt++;
e[cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
}
int ans[maxn];
bool flag=false;
void dfs(int u){
vis[u]=1;
for(int i=head[u];~i;i=e[i].next){
int v=e[i].v;
if(!vis[v]){
ans[i]=1;
dfs(v);
}
else if(vis[v]==1){
ans[i]=2;
flag=true;
}
else{
ans[i]=1;
}
}
vis[u]=2;
}
int main(){
memset(head,-1,sizeof(head));
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=1;i<=n;i++){
if(!vis[i])
dfs(i);
}
if(flag)
cout<<2<<endl;
else
cout<<1<<endl;
for(int i=1;i<=m;i++){
printf("%d%c",ans[i],i==m?'\n':' ');
}
}
E - Sum Queries?
线段树合并模板
#include<bits/stdc++.h>
#define lson(x) x<<1
#define rson(x) x<<1|1
using namespace std;
typedef long long ll;
const ll maxn = 2e5+ 10;
const ll INF = 0x7f7f7f7f;
ll a[maxn];
struct node
{
ll l, r, MIN;
ll val[9];
void init(){
MIN=INF;
memset(val,INF,sizeof(val));
}
}tree[maxn<<2];
ll n,m;
node merge(node x,node y) {
node r;
r.MIN = min(x.MIN, y.MIN);
for(ll i=0;i<9;i++){
r.val[i]=min(x.val[i],y.val[i]);
if(x.val[i]<INF&&y.val[i]<INF)
r.MIN=min(x.val[i]+y.val[i],r.MIN);
}
return r;
}
void build(ll root, ll l, ll r) {
if (l == r) {
tree[root].init();
tree[root].l = l;
tree[root].r = r;
ll x=a[l];
for(ll i=0;i<9;i++){
if(x%10)
tree[root].val[i]=a[l];
x/=10;
}
return;
}
ll mid = (l + r) >> 1;
build(lson(root), l, mid);
build(rson(root), mid + 1, r);
tree[root]=merge(tree[lson(root)],tree[rson(root)]);
tree[root].l = l;
tree[root].r = r;
}
void update(ll root, ll pos, ll val) {
if (tree[root].l == tree[root].r) {
tree[root].init();
ll x=val;
for(ll i=0;i<9;i++){
if(x%10)
tree[root].val[i]=val;
x/=10;
}
return;
}
ll mid = (tree[root].l + tree[root].r) >>1;
if (pos<=mid)
update(lson(root), pos, val);
else
update(rson(root), pos, val);
ll l=tree[root].l,r=tree[root].r;
tree[root]=merge(tree[lson(root)],tree[rson(root)]);
tree[root].l=l,tree[root].r=r;
}
node query(ll root, ll l, ll r) {
if (tree[root].l >=l&& tree[root].r<=r) {
return tree[root];
}
ll mid = (tree[root].l + tree[root].r) >>1;
if (r <= mid)
return query(lson(root), l, r);
else if (l > mid)
return query(rson(root), l, r);
else{
node a=query(lson(root), l, mid), b=query(rson(root), mid + 1, r);
return merge(a,b);
}
}
int main() {
scanf("%lld%lld", &n, &m);
for (ll i = 1; i <= n; i++)
scanf("%lld", &a[i]);
build(1, 1, n);
ll op;
ll l, r, pos, val;
for (ll i = 1; i <= m; i++) {
cin >> op;
if (op == 2) {
scanf("%lld%lld", &l, &r);
node x=query(1, l, r);
printf("%lld\n",x.MIN==INF?-1:x.MIN);
}
else {
scanf("%lld%lld", &pos, &val);
update(1, pos, val);
}
}
return 0;
}
F - Forced Online Queries Problem
线段树分治维护动态图
#include<bits/stdc++.h>
#define lc (k<<1)
#define rc (k<<1|1)
using namespace std;
const int N=2e5+10,M=2e5+10;
int n,m;
map<int,int>link[N];
int lastans=0;
struct query{
int op,x,y;
query(int op=0,int x=0,int y=0):op(op),x(x),y(y){}
}q[M];
vector<pair<int,int> > v[M<<2];
void modify(int k,int l,int r,int x,int y,pair<int,int> val){
if(x<=l&&r<=y){
v[k].push_back(val);
return;
}
int mid=l+r>>1;
if(y<=mid) modify(lc,l,mid,x,y,val);
else if(x>mid) modify(rc,mid+1,r,x,y,val);
else modify(lc,l,mid,x,y,val),modify(rc,mid+1,r,x,y,val);
}
int fa[N],sze[N];
inline int getfa(int x){
return x==fa[x]?x:getfa(fa[x]);
}
int top=0;
pair<int,int> s[M];
inline void merge(int x,int y){
x=getfa(x);y=getfa(y);
if(x==y) return;
if(sze[x]<sze[y]) swap(x,y);
fa[y]=x;
s[++top]=make_pair(y,sze[y]);
s[++top]=make_pair(x,sze[x]);
sze[x]+=sze[y];
}
inline void delet(int cur){
while(top>cur){
fa[s[top].first]=s[top].first;
sze[s[top].first]=s[top].second;
top--;
}
}
void dfs(int k,int l,int r){
int cur=top;
for(int i=0;i<v[k].size();++i)
if(link[v[k][i].first][v[k][i].second])
merge(v[k][i].first,v[k][i].second);
if(l==r){
if(q[l].op==2) {
lastans=(getfa(q[l].x)==getfa(q[l].y));
printf("%d",lastans);
}
q[l+1].x=(q[l+1].x+lastans-1)%n+1;
q[l+1].y=(q[l+1].y+lastans-1)%n+1;
if(q[l+1].x>q[l+1].y)swap(q[l+1].x,q[l+1].y);
if(q[l+1].op==1)link[q[l+1].x][q[l+1].y]^=1;
}
else{
int mid=l+r>>1;
dfs(lc,l,mid);dfs(rc,mid+1,r);
}
delet(cur);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) fa[i]=i,sze[i]=1;
for(int i=1;i<=m;++i){
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(x>y) swap(x,y);
if(op==1){
if(link[x].count(y))
modify(1,1,m,link[x][y],i,make_pair(x,y));
link[x][y]=i;
int xx=x%n+1,yy=y%n+1;
if(xx>yy) swap(xx,yy);
if(link[xx].count(yy))
modify(1,1,m,link[xx][yy],i,make_pair(xx,yy));
link[xx][yy]=i;
}
q[i]=(query){op,x,y};
}
for(int i=1;i<=n;i++){
for(auto it:link[i]){
if(it.second!=m)
modify(1,1,m,it.second,m,make_pair(i,it.first));
}
}
for(int i=1;i<=n;i++)link[i].clear();
if(q[1].op==1)
link[q[1].x][q[1].y]=1;
dfs(1,1,m);
printf("\n");
return 0;
}